diff --git a/apps/api/package.json b/apps/api/package.json index 5dc7bb9e4..2f5ba508a 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -15,6 +15,7 @@ }, "devDependencies": { "@types/bcrypt": "^5.0.0", + "@types/email-reply-parser": "^1", "@types/formidable": "^3.4.5", "@types/jsonwebtoken": "^8.5.8", "@types/node": "^17.0.23", @@ -39,6 +40,7 @@ "axios": "^1.5.0", "bcrypt": "^5.0.1", "dotenv": "^16.0.0", + "email-reply-parser": "^1.8.1", "fastify": "4.22.2", "fastify-formidable": "^3.0.2", "fastify-multer": "^2.0.3", diff --git a/apps/api/src/controllers/config.ts b/apps/api/src/controllers/config.ts index 9d2893a93..f9dafbe95 100644 --- a/apps/api/src/controllers/config.ts +++ b/apps/api/src/controllers/config.ts @@ -4,7 +4,7 @@ // SSO Provider // Portal Locale // Feature Flags -import { GoogleAuth, OAuth2Client } from "google-auth-library"; +import { OAuth2Client } from "google-auth-library"; import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; const nodemailer = require("nodemailer"); diff --git a/apps/api/src/controllers/queue.ts b/apps/api/src/controllers/queue.ts index 9880f59be..558cfb044 100644 --- a/apps/api/src/controllers/queue.ts +++ b/apps/api/src/controllers/queue.ts @@ -2,6 +2,7 @@ import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; import { checkToken } from "../lib/jwt"; import { prisma } from "../prisma"; +import { OAuth2Client } from "google-auth-library"; export function emailQueueRoutes(fastify: FastifyInstance) { // Create a new email queue @@ -13,18 +14,50 @@ export function emailQueueRoutes(fastify: FastifyInstance) { const token = checkToken(bearer); if (token) { - const { name, username, password, hostname, tls }: any = request.body; - - await prisma.emailQueue.create({ + const { + name, + username, + password, + hostname, + tls, + serviceType, + clientId, + clientSecret, + redirectUri, + }: any = request.body; + + const mailbox = await prisma.emailQueue.create({ data: { - name, + name: name, username, password, hostname, tls, + serviceType, + clientId, + clientSecret, + redirectUri, }, }); + // generate redirect uri + if (serviceType === "gmail") { + const google = new OAuth2Client(clientId, clientSecret, redirectUri); + + const authorizeUrl = google.generateAuthUrl({ + access_type: "offline", + scope: "https://mail.google.com", + prompt: "consent", + state: mailbox.id, + }); + + reply.send({ + success: true, + message: "Gmail imap provider created!", + authorizeUrl: authorizeUrl, + }); + } + reply.send({ success: true, }); @@ -32,8 +65,53 @@ export function emailQueueRoutes(fastify: FastifyInstance) { } ); - // Get all email queues + // Google oauth callback + fastify.get( + "/api/v1/email-queue/oauth/gmail", + + async (request: FastifyRequest, reply: FastifyReply) => { + const bearer = request.headers.authorization!.split(" ")[1]; + const token = checkToken(bearer); + + if (token) { + const { code, mailboxId }: any = request.query; + + const mailbox = await prisma.emailQueue.findFirst({ + where: { + id: mailboxId, + }, + }); + + const google = new OAuth2Client( + //@ts-expect-error + mailbox?.clientId, + mailbox?.clientSecret, + mailbox?.redirectUri + ); + console.log(google); + + const r = await google.getToken(code); + + await prisma.emailQueue.update({ + where: { id: mailbox?.id }, + data: { + refreshToken: r.tokens.refresh_token, + accessToken: r.tokens.access_token, + expiresIn: r.tokens.expiry_date, + serviceType: "gmail", + }, + }); + + reply.send({ + success: true, + message: "Mailbox updated!", + }); + } + } + ); + + // Get all email queue's fastify.get( "/api/v1/email-queues/all", @@ -42,7 +120,20 @@ export function emailQueueRoutes(fastify: FastifyInstance) { const token = checkToken(bearer); if (token) { - const queues = await prisma.emailQueue.findMany({}); + const queues = await prisma.emailQueue.findMany({ + select: { + id: true, + name: true, + serviceType: true, + active: true, + teams: true, + username: true, + hostname: true, + tls: true, + clientId: true, + redirectUri: true, + }, + }); reply.send({ success: true, diff --git a/apps/api/src/controllers/ticket.ts b/apps/api/src/controllers/ticket.ts index ac137a02e..702b7f6b6 100644 --- a/apps/api/src/controllers/ticket.ts +++ b/apps/api/src/controllers/ticket.ts @@ -37,7 +37,7 @@ export function ticketRoutes(fastify: FastifyInstance) { email, engineer, type, - createdBy + createdBy, }: any = request.body; const ticket: any = await prisma.ticket.create({ @@ -48,12 +48,14 @@ export function ticketRoutes(fastify: FastifyInstance) { priority: priority ? priority : "low", email, type: type ? type.toLowerCase() : "support", - createdBy: createdBy ? { - id: createdBy.id, - name: createdBy.name, - role: createdBy.role, - email: createdBy.email - } : undefined, + createdBy: createdBy + ? { + id: createdBy.id, + name: createdBy.name, + role: createdBy.role, + email: createdBy.email, + } + : undefined, client: company !== undefined ? { @@ -538,9 +540,8 @@ export function ticketRoutes(fastify: FastifyInstance) { //@ts-expect-error const { email, title } = ticket; - if (public_comment && email) { - sendComment(text, title, email); + sendComment(text, title, ticket!.id, email!); } await commentNotification(user!.id, ticket, user!.name); diff --git a/apps/api/src/lib/imap.ts b/apps/api/src/lib/imap.ts index fbfcb70bd..a27a5826a 100644 --- a/apps/api/src/lib/imap.ts +++ b/apps/api/src/lib/imap.ts @@ -1,4 +1,7 @@ const Imap = require("imap"); +var EmailReplyParser = require("email-reply-parser"); + +import { GoogleAuth } from "google-auth-library"; import { prisma } from "../prisma"; const { simpleParser } = require("mailparser"); @@ -14,19 +17,103 @@ const year = date.getFullYear(); //@ts-ignore const d = new Date([year, month, today]); +// Function to get or refresh the access token +async function getValidAccessToken(queue: any) { + const { + clientId, + clientSecret, + refreshToken, + accessToken, + expiresIn, + username, + } = queue; + + // Check if token is still valid + const now = Math.floor(Date.now() / 1000); + if (accessToken && expiresIn && now < expiresIn) { + return accessToken; + } + + // Initialize GoogleAuth client + const auth = new GoogleAuth({ + clientOptions: { + clientId: clientId, + clientSecret: clientSecret, + }, + }); + + const oauth2Client = auth.fromJSON({ + client_id: clientId, + client_secret: clientSecret, + refresh_token: refreshToken, + }); + + // Refresh the token if expired + const tokenInfo = await oauth2Client.getAccessToken(); + + const expiryDate = queue.expiresIn + 3600; + + if (tokenInfo.token) { + await prisma.emailQueue.update({ + where: { id: queue.id }, + data: { + accessToken: tokenInfo.token, + expiresIn: expiryDate, + }, + }); + return tokenInfo.token; + } else { + throw new Error("Unable to refresh access token."); + } +} + +// Function to generate XOAUTH2 string +function generateXOAuth2Token(user: string, accessToken: string) { + const authString = [ + "user=" + user, + "auth=Bearer " + accessToken, + "", + "", + ].join("\x01"); + return Buffer.from(authString).toString("base64"); +} + +async function returnImapConfig(queue: any) { + switch (queue.serviceType) { + case "gmail": + const validatedAccessToken = await getValidAccessToken(queue); + return { + user: queue.username, + host: queue.hostname, + port: 993, + tls: true, + xoauth2: generateXOAuth2Token(queue.username, validatedAccessToken), + tlsOptions: { rejectUnauthorized: false, servername: queue.hostname }, + }; + case "other": + return { + user: queue.username, + password: queue.password, + host: queue.hostname, + port: queue.tls ? 993 : 143, + tls: queue.tls, + tlsOptions: { rejectUnauthorized: false, servername: queue.hostname }, + }; + default: + throw new Error("Unsupported service type"); + } +} + export const getEmails = async () => { try { const queues = await client.emailQueue.findMany({}); for (let i = 0; i < queues.length; i++) { - var imapConfig = { - user: queues[i].username, - password: queues[i].password, - host: queues[i].hostname, - port: queues[i].tls ? 993 : 110, - tls: queues[i].tls, - tlsOptions: { servername: queues[i].hostname }, - }; + var imapConfig = await returnImapConfig(queues[i]); + + if (!imapConfig) { + continue; + } const imap = new Imap(imapConfig); imap.connect(); @@ -53,9 +140,9 @@ export const getEmails = async () => { simpleParser(stream, async (err: any, parsed: any) => { const { from, subject, textAsHtml, text, html } = parsed; - // Handle reply emails + var reply_text = new EmailReplyParser().read(text); + if (subject?.includes("Re:")) { - // Extract ticket number from subject (e.g., "Re: Ticket #123") const ticketIdMatch = subject.match(/#(\d+)/); if (!ticketIdMatch) { console.log( @@ -67,17 +154,28 @@ export const getEmails = async () => { const ticketId = ticketIdMatch[1]; - // Create comment with the reply - return await client.comment.create({ - data: { - text: text ? text : "No Body", - userId: null, - ticketId: ticketId, - reply: true, - replyEmail: from.value[0].address, - public: true, + const find = await client.ticket.findFirst({ + where: { + Number: Number(ticketId), }, }); + + if (find) { + return await client.comment.create({ + data: { + text: text + ? reply_text.fragments[0]._content + : "No Body", + userId: null, + ticketId: find.id, + reply: true, + replyEmail: from.value[0].address, + public: true, + }, + }); + } else { + console.log("Ticket not found"); + } } else { const imap = await client.imap_Email.create({ data: { diff --git a/apps/api/src/lib/nodemailer/ticket/comment.ts b/apps/api/src/lib/nodemailer/ticket/comment.ts index abc125c49..8b90ffd46 100644 --- a/apps/api/src/lib/nodemailer/ticket/comment.ts +++ b/apps/api/src/lib/nodemailer/ticket/comment.ts @@ -5,6 +5,7 @@ import { createTransportProvider } from "../transport"; export async function sendComment( comment: string, title: string, + id: string, email: string ) { try { @@ -30,8 +31,8 @@ export async function sendComment( .sendMail({ from: provider?.reply, to: email, - subject: `New comment on a ticket`, // Subject line - text: `Hello there, Ticket: ${title}, has had an update with a comment of ${comment}`, // plain text body + subject: `New comment on Issue #${title} ref: #${id}`, + text: `Hello there, Issue #${title}, has had an update with a comment of ${comment}`, html: htmlToSend, }) .then((info: any) => { diff --git a/apps/api/src/lib/nodemailer/ticket/create.ts b/apps/api/src/lib/nodemailer/ticket/create.ts index b10d25d9a..eddc30e82 100644 --- a/apps/api/src/lib/nodemailer/ticket/create.ts +++ b/apps/api/src/lib/nodemailer/ticket/create.ts @@ -25,8 +25,8 @@ export async function sendTicketCreate(ticket: any) { .sendMail({ from: email?.reply, to: ticket.email, - subject: `Ticket ${ticket.id} has just been created & logged`, - text: `Hello there, Ticket ${ticket.id}, which you reported on ${ticket.createdAt}, has now been created and logged`, + subject: `Issue #${ticket.id} has just been created & logged`, + text: `Hello there, Issue #${ticket.id}, which you reported on ${ticket.createdAt}, has now been created and logged`, html: htmlToSend, }) .then((info: any) => { diff --git a/apps/api/src/lib/nodemailer/ticket/status.ts b/apps/api/src/lib/nodemailer/ticket/status.ts index 1d4073804..f29a8c77d 100644 --- a/apps/api/src/lib/nodemailer/ticket/status.ts +++ b/apps/api/src/lib/nodemailer/ticket/status.ts @@ -23,14 +23,14 @@ export async function sendTicketStatus(ticket: any) { await transport .sendMail({ - from: email?.reply, // sender address + from: email?.reply, to: ticket.email, - subject: `Ticket ${ticket.Number} status is now ${ + subject: `Issue #${ticket.Number} status is now ${ ticket.isComplete ? "COMPLETED" : "OUTSTANDING" - }`, // Subject line - text: `Hello there, Ticket ${ticket.Number}, now has a status of ${ + }`, + text: `Hello there, Issue #${ticket.Number}, now has a status of ${ ticket.isComplete ? "COMPLETED" : "OUTSTANDING" - }`, // plain text body + }`, html: htmlToSend, }) .then((info: any) => { diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index e6858d763..d52d546cf 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -129,7 +129,7 @@ const start = async () => { } ); - setInterval(() => getEmails(), 60000); // Call getEmails every minute + setInterval(() => getEmails(), 10000); // Call getEmails every minute } catch (err) { server.log.error(err); await prisma.$disconnect(); diff --git a/apps/api/src/prisma/migrations/20241104215009_imap_oauth/migration.sql b/apps/api/src/prisma/migrations/20241104215009_imap_oauth/migration.sql new file mode 100644 index 000000000..e4b2c8200 --- /dev/null +++ b/apps/api/src/prisma/migrations/20241104215009_imap_oauth/migration.sql @@ -0,0 +1,10 @@ +-- AlterTable +ALTER TABLE "EmailQueue" ADD COLUMN "accessToken" TEXT, +ADD COLUMN "active" BOOLEAN NOT NULL DEFAULT true, +ADD COLUMN "clientId" TEXT, +ADD COLUMN "clientSecret" TEXT, +ADD COLUMN "expiresIn" BIGINT, +ADD COLUMN "redirectUri" TEXT, +ADD COLUMN "refreshToken" TEXT, +ADD COLUMN "serviceType" TEXT NOT NULL DEFAULT 'other', +ADD COLUMN "tenantId" TEXT; diff --git a/apps/api/src/prisma/migrations/20241106185045_imap_password_optional/migration.sql b/apps/api/src/prisma/migrations/20241106185045_imap_password_optional/migration.sql new file mode 100644 index 000000000..ded5723e4 --- /dev/null +++ b/apps/api/src/prisma/migrations/20241106185045_imap_password_optional/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "EmailQueue" ALTER COLUMN "password" DROP NOT NULL; diff --git a/apps/api/src/prisma/schema.prisma b/apps/api/src/prisma/schema.prisma index 877276fa1..11aebb4b0 100644 --- a/apps/api/src/prisma/schema.prisma +++ b/apps/api/src/prisma/schema.prisma @@ -346,12 +346,21 @@ model EmailQueue { createdAt DateTime @default(now()) updatedAt DateTime @default(now()) - name String - username String - password String - hostname String - tls Boolean @default(true) - teams Json? + name String + username String + password String? + hostname String + tls Boolean @default(true) + active Boolean @default(true) + teams Json? + serviceType String @default("other") + clientId String? + clientSecret String? + tenantId String? + refreshToken String? + accessToken String? + expiresIn BigInt? + redirectUri String? imap Imap_Email[] } diff --git a/apps/client/components/TicketDetails/index.tsx b/apps/client/components/TicketDetails/index.tsx index 458fd5c0d..00470bdaf 100644 --- a/apps/client/components/TicketDetails/index.tsx +++ b/apps/client/components/TicketDetails/index.tsx @@ -582,7 +582,9 @@ export default function Ticket() {
- {item.user.name[0]} + {item.user + ? item.user.name[0] + : item.replyEmail[0]}
@@ -590,11 +592,19 @@ export default function Ticket() {
- {item.user.name} + {item.user + ? item.user.name + : item.replyEmail}
- + {item.public ? "Publicly" : "Internally"} diff --git a/apps/client/pages/admin/email-queues/index.js b/apps/client/pages/admin/email-queues/index.tsx similarity index 100% rename from apps/client/pages/admin/email-queues/index.js rename to apps/client/pages/admin/email-queues/index.tsx diff --git a/apps/client/pages/admin/email-queues/new.js b/apps/client/pages/admin/email-queues/new.js deleted file mode 100644 index 44c0cba67..000000000 --- a/apps/client/pages/admin/email-queues/new.js +++ /dev/null @@ -1,146 +0,0 @@ -import { getCookie } from "cookies-next"; -import { useRouter } from "next/router"; -import { useState } from "react"; - -export default function EmailQueues() { - const router = useRouter(); - - const [name, setName] = useState(); - const [username, setUsername] = useState(); - const [password, setPassword] = useState(); - const [hostname, setHostname] = useState(); - const [tls, setTls] = useState(); - - async function newQueue() { - await fetch(`/api/v1/email-queue/create`, { - method: "post", - headers: { - "Content-Type": "application/json", - Authorization: "Bearer " + getCookie("session"), - }, - body: JSON.stringify({ - name, - username, - password, - hostname, - tls, - }), - }) - .then((res) => res.json()) - .then(() => { - router.back("/admin/email-queues"); - }); - } - - return ( -
-
-
-
-
-

- New Email Queue -

-
-
-
-
-
- - setName(e.target.value)} - /> -
-
- - setUsername(e.target.value)} - /> -
-
- - setPassword(e.target.value)} - /> -
-
- - setHostname(e.target.value)} - /> -
- -
- - -
-
-
- -
-
-
-
-
-
-
- ); -} diff --git a/apps/client/pages/admin/email-queues/new.tsx b/apps/client/pages/admin/email-queues/new.tsx new file mode 100644 index 000000000..e45a27e3d --- /dev/null +++ b/apps/client/pages/admin/email-queues/new.tsx @@ -0,0 +1,341 @@ +import { getCookie } from "cookies-next"; +import { useRouter } from "next/router"; +import { useState } from "react"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/shadcn/ui/card"; +import { Button } from "@/shadcn/ui/button"; +import { Input } from "@/shadcn/ui/input"; +import { Label } from "@/shadcn/ui/label"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/shadcn/ui/select"; + +export default function EmailQueues() { + const [provider, setProvider] = useState(""); + const [step, setStep] = useState(0); + + return ( +
+
+
+
+
+

+ New Email Queue +

+
+
+
+
+

+ Configure a new email queue for sending outbound emails. +

+
+
+
+
+
+ +
+
+ {step === 0 && ( + + + Email Provider + + Certain providers require different settings. + + + +
+
+ + +
+
+
+ + + + +
+ )} + {/* {step === 1 && provider === "microsoft" && } */} + {step === 1 && provider === "gmail" && ( + + )} + {step === 1 && provider === "other" && ( + + )} +
+
+
+
+ ); +} + +function PasswordProvider({ setStep }: any) { + const router = useRouter(); + + const [name, setName]: any = useState(); + const [username, setUsername]: any = useState(); + const [password, setPassword]: any = useState(); + const [hostname, setHostname]: any = useState(); + const [tls, setTls]: any = useState(); + + async function newQueue() { + await fetch(`/api/v1/email-queue/create`, { + method: "post", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer " + getCookie("session"), + }, + body: JSON.stringify({ + name, + username, + password, + hostname, + tls: tls === "true" ? true : false, + serviceType: "other", + }), + }) + .then((res) => res.json()) + .then(() => { + router.push("/admin/email-queues"); + }); + } + + return ( + + + Email Queue Settings + Configure your email queue settings. + + +
+
+
+ + setName(e.target.value)} + /> +
+
+ + setUsername(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
+ + setHostname(e.target.value)} + /> +
+
+ + +
+
+
+
+ + + + +
+ ); +} + +function GmailSettings({ setStep }: { setStep: (step: number) => void }) { + const [clientId, setClientId] = useState(""); + const [clientSecret, setClientSecret] = useState(""); + const [redirectUri, setRedirectUri] = useState( + `${window.location.origin}/admin/email-queues/oauth` + ); + const [user, setUser] = useState(""); + + const router = useRouter(); + + async function submitGmailConfig() { + await fetch(`/api/v1/email-queue/create`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${getCookie("session")}`, + }, + body: JSON.stringify({ + name: user, + hostname: "imap.gmail.com", + port: "993", + clientId, + clientSecret, + username: user, + reply: user, + serviceType: "gmail", + redirectUri: redirectUri, + }), + }) + .then((res) => res.json()) + .then((res) => { + if (res.success && res.authorizeUrl) { + router.push(res.authorizeUrl); + } + }); + } + + return ( + + + Gmail Settings + Configure your Gmail OAuth2 settings. + + +
+
+
+ +
+ setClientId(e.target.value)} + /> +
+
+ +
+ +
+ setClientSecret(e.target.value)} + /> +
+
+ +
+ +
+ setUser(e.target.value)} + /> +
+
+ +
+ +
+ setRedirectUri(e.target.value)} + /> +
+
+
+
+
+ + + + +
+ ); +} diff --git a/apps/client/pages/admin/email-queues/oauth.tsx b/apps/client/pages/admin/email-queues/oauth.tsx new file mode 100644 index 000000000..5670a9eb5 --- /dev/null +++ b/apps/client/pages/admin/email-queues/oauth.tsx @@ -0,0 +1,33 @@ +import { getCookie, setCookie } from "cookies-next"; +import { useRouter } from "next/router"; +import { useEffect } from "react"; + +export default function Login() { + const router = useRouter(); + + async function check() { + if (router.query.code) { + await fetch( + `/api/v1/email-queue/oauth/gmail?code=${router.query.code}&mailboxId=${router.query.state}`, + { + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${getCookie("session")}`, + }, + } + ) + .then((res) => res.json()) + .then((res) => { + if (res.success) { + router.push("/admin/email-queues"); + } + }); + } + } + + useEffect(() => { + check(); + }, [router]); + + return
; +} diff --git a/yarn.lock b/yarn.lock index 9cc9551a9..fd6793d6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1587,14 +1587,14 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.0.2, @eslint/eslintrc@npm:^2.1.4": +"@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: @@ -1611,13 +1611,6 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.37.0": - version: 8.37.0 - resolution: "@eslint/js@npm:8.37.0" - checksum: 10c0/6abb3d97412ac960c7436ecdaa56eb00ac57c34782dc0901c82b259c32704e45044927b2910d786ec2127e548986d67e7ba29fec46abfb5d8fc9bedf379af2cf - languageName: node - linkType: hard - "@eslint/js@npm:8.57.1": version: 8.57.1 resolution: "@eslint/js@npm:8.57.1" @@ -1863,7 +1856,7 @@ __metadata: languageName: node linkType: hard -"@headlessui/react@npm:^1.4.2, @headlessui/react@npm:^1.7.13": +"@headlessui/react@npm:^1.4.2": version: 1.7.19 resolution: "@headlessui/react@npm:1.7.19" dependencies: @@ -1891,7 +1884,7 @@ __metadata: languageName: node linkType: hard -"@heroicons/react@npm:^2.0.17, @heroicons/react@npm:^2.0.18": +"@heroicons/react@npm:^2.0.18": version: 2.1.5 resolution: "@heroicons/react@npm:2.1.5" peerDependencies: @@ -1900,17 +1893,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" - dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10c0/66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 - languageName: node - linkType: hard - "@humanwhocodes/config-array@npm:^0.13.0": version: 0.13.0 resolution: "@humanwhocodes/config-array@npm:0.13.0" @@ -1929,7 +1911,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2, @humanwhocodes/object-schema@npm:^2.0.3": +"@humanwhocodes/object-schema@npm:^2.0.3": version: 2.0.3 resolution: "@humanwhocodes/object-schema@npm:2.0.3" checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c @@ -2497,13 +2479,6 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:13.2.4": - version: 13.2.4 - resolution: "@next/env@npm:13.2.4" - checksum: 10c0/6dc862a80b6b5fbef21e184abe3706c7b2a7c2bb07b44433200190e75afb30905ce99c6e1e4015200339f8f1bd6563b72632284e2eeeac61fa8226f54f80e3c6 - languageName: node - linkType: hard - "@next/env@npm:13.5.7": version: 13.5.7 resolution: "@next/env@npm:13.5.7" @@ -2525,15 +2500,6 @@ __metadata: languageName: node linkType: hard -"@next/eslint-plugin-next@npm:13.2.4": - version: 13.2.4 - resolution: "@next/eslint-plugin-next@npm:13.2.4" - dependencies: - glob: "npm:7.1.7" - checksum: 10c0/39058203d08b664f40d275ac8d23636414e757e841038d303ba149c43be0454880f15f938ad7f179d3395ed9a25b37dd43e9c37703b4670acd371b7a70562d1e - languageName: node - linkType: hard - "@next/eslint-plugin-next@npm:15.0.2": version: 15.0.2 resolution: "@next/eslint-plugin-next@npm:15.0.2" @@ -2543,27 +2509,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-android-arm-eabi@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-android-arm-eabi@npm:13.2.4" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@next/swc-android-arm64@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-android-arm64@npm:13.2.4" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@next/swc-darwin-arm64@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-darwin-arm64@npm:13.2.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@next/swc-darwin-arm64@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-darwin-arm64@npm:13.5.7" @@ -2585,13 +2530,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-x64@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-darwin-x64@npm:13.2.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@next/swc-darwin-x64@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-darwin-x64@npm:13.5.7" @@ -2613,27 +2551,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-freebsd-x64@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-freebsd-x64@npm:13.2.4" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@next/swc-linux-arm-gnueabihf@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-linux-arm-gnueabihf@npm:13.2.4" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@next/swc-linux-arm64-gnu@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-linux-arm64-gnu@npm:13.2.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - "@next/swc-linux-arm64-gnu@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-arm64-gnu@npm:13.5.7" @@ -2655,13 +2572,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-linux-arm64-musl@npm:13.2.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - "@next/swc-linux-arm64-musl@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-arm64-musl@npm:13.5.7" @@ -2683,13 +2593,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-linux-x64-gnu@npm:13.2.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - "@next/swc-linux-x64-gnu@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-x64-gnu@npm:13.5.7" @@ -2711,13 +2614,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-linux-x64-musl@npm:13.2.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - "@next/swc-linux-x64-musl@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-x64-musl@npm:13.5.7" @@ -2739,13 +2635,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-win32-arm64-msvc@npm:13.2.4" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@next/swc-win32-arm64-msvc@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-win32-arm64-msvc@npm:13.5.7" @@ -2767,13 +2656,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-win32-ia32-msvc@npm:13.2.4" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@next/swc-win32-ia32-msvc@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-win32-ia32-msvc@npm:13.5.7" @@ -2788,13 +2670,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:13.2.4": - version: 13.2.4 - resolution: "@next/swc-win32-x64-msvc@npm:13.2.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@next/swc-win32-x64-msvc@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-win32-x64-msvc@npm:13.5.7" @@ -4282,7 +4157,7 @@ __metadata: languageName: node linkType: hard -"@rushstack/eslint-patch@npm:^1.1.3, @rushstack/eslint-patch@npm:^1.10.3": +"@rushstack/eslint-patch@npm:^1.10.3": version: 1.10.4 resolution: "@rushstack/eslint-patch@npm:1.10.4" checksum: 10c0/de312bd7a3cb0f313c9720029eb719d8762fe54946cce2d33ac142b1cbb5817c4a5a92518dfa476c26311602d37f5a8f7caa90a0c73e3d6a56f9a05d2799c172 @@ -4411,15 +4286,6 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:0.4.14": - version: 0.4.14 - resolution: "@swc/helpers@npm:0.4.14" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/a8bd2e291fca73aa35ff316fb1aa9fb9554856518c8bf64ab5a355fb587d79d04d67f95033012fcdc94f507d22484871d95dc72efdd9ff13cc5d0ac68dfba999 - languageName: node - linkType: hard - "@swc/helpers@npm:0.5.13, @swc/helpers@npm:^0.5.0": version: 0.5.13 resolution: "@swc/helpers@npm:0.5.13" @@ -5152,6 +5018,13 @@ __metadata: languageName: node linkType: hard +"@types/email-reply-parser@npm:^1": + version: 1.4.2 + resolution: "@types/email-reply-parser@npm:1.4.2" + checksum: 10c0/8ca4c3d76e168fab6c1306280930363a54f4576cf209a6045049d44fa36dc45e06e3f922128781c09d35b119ca6b77c3427d3ff3a94f6a123781aaecc37677b3 + languageName: node + linkType: hard + "@types/estree-jsx@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree-jsx@npm:1.0.5" @@ -5427,13 +5300,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:18.15.11": - version: 18.15.11 - resolution: "@types/node@npm:18.15.11" - checksum: 10c0/670deb1a9daa812dc86b1e8964c0c6b0bef7c32672833c10578c1e5dd2682f2bd99b86d814fde86a5dd4a3da48ea039f41db30a835b245aa7c34c62fa1f23f0d - languageName: node - linkType: hard - "@types/node@npm:^16.10.2": version: 16.18.118 resolution: "@types/node@npm:16.18.118" @@ -5547,15 +5413,6 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:18.0.11": - version: 18.0.11 - resolution: "@types/react-dom@npm:18.0.11" - dependencies: - "@types/react": "npm:*" - checksum: 10c0/8bf1e3f710221a937613df4d192f3b9e5a30e5c3103cac52c5210fb56b79f7a8cc66137d3bc5c9d92d375165a97fae53284724191bc01cb9898564fa02595569 - languageName: node - linkType: hard - "@types/react-table@npm:^7.7.15": version: 7.7.20 resolution: "@types/react-table@npm:7.7.20" @@ -5575,17 +5432,6 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:18.0.33": - version: 18.0.33 - resolution: "@types/react@npm:18.0.33" - dependencies: - "@types/prop-types": "npm:*" - "@types/scheduler": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10c0/12610df107eeac48d63f23c64b9c2f91acf6413faa9868e374433b1bab7a27ce95b0a0198b0712da34e2a1672ce43e04fa0b484e81e985baae3b056e204e27ac - languageName: node - linkType: hard - "@types/react@npm:18.2.38": version: 18.2.38 resolution: "@types/react@npm:18.2.38" @@ -5724,33 +5570,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.42.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:5.62.0" - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/typescript-estree": "npm:5.62.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/315194b3bf39beb9bd16c190956c46beec64b8371e18d6bb72002108b250983eb1e186a01d34b77eb4045f4941acbb243b16155fbb46881105f65e37dc9e24d4 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - checksum: 10c0/861253235576c1c5c1772d23cdce1418c2da2618a479a7de4f6114a12a7ca853011a1e530525d0931c355a8fd237b9cd828fac560f85f9623e24054fd024726f - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:8.12.2": version: 8.12.2 resolution: "@typescript-eslint/scope-manager@npm:8.12.2" @@ -5776,13 +5595,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 10c0/7febd3a7f0701c0b927e094f02e82d8ee2cada2b186fcb938bc2b94ff6fbad88237afc304cbaf33e82797078bbbb1baf91475f6400912f8b64c89be79bfa4ddf - languageName: node - linkType: hard - "@typescript-eslint/types@npm:8.12.2": version: 8.12.2 resolution: "@typescript-eslint/types@npm:8.12.2" @@ -5790,24 +5602,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - "@typescript-eslint/visitor-keys": "npm:5.62.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - semver: "npm:^7.3.7" - tsutils: "npm:^3.21.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/d7984a3e9d56897b2481940ec803cb8e7ead03df8d9cfd9797350be82ff765dfcf3cfec04e7355e1779e948da8f02bc5e11719d07a596eb1cb995c48a95e38cf - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:8.12.2": version: 8.12.2 resolution: "@typescript-eslint/typescript-estree@npm:8.12.2" @@ -5841,16 +5635,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": "npm:5.62.0" - eslint-visitor-keys: "npm:^3.3.0" - checksum: 10c0/7c3b8e4148e9b94d9b7162a596a1260d7a3efc4e65199693b8025c71c4652b8042501c0bc9f57654c1e2943c26da98c0f77884a746c6ae81389fcb0b513d995d - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:8.12.2": version: 8.12.2 resolution: "@typescript-eslint/visitor-keys@npm:8.12.2" @@ -6026,7 +5810,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -6119,6 +5903,7 @@ __metadata: "@fastify/swagger": "npm:^8.10.0" "@prisma/client": "npm:5.6.0" "@types/bcrypt": "npm:^5.0.0" + "@types/email-reply-parser": "npm:^1" "@types/formidable": "npm:^3.4.5" "@types/jsonwebtoken": "npm:^8.5.8" "@types/node": "npm:^17.0.23" @@ -6129,6 +5914,7 @@ __metadata: axios: "npm:^1.5.0" bcrypt: "npm:^5.0.1" dotenv: "npm:^16.0.0" + email-reply-parser: "npm:^1.8.1" fastify: "npm:4.22.2" fastify-formidable: "npm:^3.0.2" fastify-multer: "npm:^2.0.3" @@ -6433,7 +6219,7 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.0, autoprefixer@npm:^10.4.14": +"autoprefixer@npm:^10.4.0": version: 10.4.20 resolution: "autoprefixer@npm:10.4.20" dependencies: @@ -8231,6 +8017,15 @@ __metadata: languageName: node linkType: hard +"email-reply-parser@npm:^1.8.1": + version: 1.8.1 + resolution: "email-reply-parser@npm:1.8.1" + dependencies: + re2: "npm:1.21.3" + checksum: 10c0/51463289ed5daf1ffe6920d7fb828018b1f80d11547990532f75a1b17ebc18e533a294e03c6008659690d806f8e8e19de9f55737998571a3b32683b4751a7d39 + languageName: node + linkType: hard + "emoji-mart@npm:^5.6.0": version: 5.6.0 resolution: "emoji-mart@npm:5.6.0" @@ -8513,29 +8308,6 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:13.2.4": - version: 13.2.4 - resolution: "eslint-config-next@npm:13.2.4" - dependencies: - "@next/eslint-plugin-next": "npm:13.2.4" - "@rushstack/eslint-patch": "npm:^1.1.3" - "@typescript-eslint/parser": "npm:^5.42.0" - eslint-import-resolver-node: "npm:^0.3.6" - eslint-import-resolver-typescript: "npm:^3.5.2" - eslint-plugin-import: "npm:^2.26.0" - eslint-plugin-jsx-a11y: "npm:^6.5.1" - eslint-plugin-react: "npm:^7.31.7" - eslint-plugin-react-hooks: "npm:^4.5.0" - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: ">=3.3.1" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/cf114cbf21ae1f7fa7b1cb9d8c5064ef2ad5a47525b2410023027cde4a5fdd9f2925bebce13b2481177cab85bfe5ac3c89d39fd80622b22ad410aa586b0e9a9d - languageName: node - linkType: hard - "eslint-config-next@npm:15.0.2, eslint-config-next@npm:latest": version: 15.0.2 resolution: "eslint-config-next@npm:15.0.2" @@ -8630,7 +8402,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.26.0, eslint-plugin-import@npm:^2.31.0": +"eslint-plugin-import@npm:^2.31.0": version: 2.31.0 resolution: "eslint-plugin-import@npm:2.31.0" dependencies: @@ -8659,7 +8431,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:^6.10.0, eslint-plugin-jsx-a11y@npm:^6.5.1": +"eslint-plugin-jsx-a11y@npm:^6.10.0": version: 6.10.2 resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: @@ -8684,15 +8456,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^4.5.0": - version: 4.6.2 - resolution: "eslint-plugin-react-hooks@npm:4.6.2" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 10c0/4844e58c929bc05157fb70ba1e462e34f1f4abcbc8dd5bbe5b04513d33e2699effb8bca668297976ceea8e7ebee4e8fc29b9af9d131bcef52886feaa2308b2cc - languageName: node - linkType: hard - "eslint-plugin-react-hooks@npm:^5.0.0": version: 5.0.0 resolution: "eslint-plugin-react-hooks@npm:5.0.0" @@ -8726,7 +8489,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.31.7, eslint-plugin-react@npm:^7.35.0": +"eslint-plugin-react@npm:^7.35.0": version: 7.37.2 resolution: "eslint-plugin-react@npm:7.37.2" dependencies: @@ -8765,7 +8528,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.1.1, eslint-scope@npm:^7.2.2": +"eslint-scope@npm:^7.2.2": version: 7.2.2 resolution: "eslint-scope@npm:7.2.2" dependencies: @@ -8775,63 +8538,13 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 languageName: node linkType: hard -"eslint@npm:8.37.0": - version: 8.37.0 - resolution: "eslint@npm:8.37.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.4.0" - "@eslint/eslintrc": "npm:^2.0.2" - "@eslint/js": "npm:8.37.0" - "@humanwhocodes/config-array": "npm:^0.11.8" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - ajv: "npm:^6.10.0" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.1.1" - eslint-visitor-keys: "npm:^3.4.0" - espree: "npm:^9.5.1" - esquery: "npm:^1.4.2" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - grapheme-splitter: "npm:^1.0.4" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.0.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-sdsl: "npm:^4.1.4" - js-yaml: "npm:^4.1.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.1" - strip-ansi: "npm:^6.0.1" - strip-json-comments: "npm:^3.1.0" - text-table: "npm:^0.2.0" - bin: - eslint: bin/eslint.js - checksum: 10c0/3798781652b1c32d8a4a654c2dd7f2abbff808a806ddd7fd8f86a49586a824854369943d49ee52dcda47b8b03cd49585820f2ab69fc61bb17a0d7677785a2cf7 - languageName: node - linkType: hard - "eslint@npm:^8": version: 8.57.1 resolution: "eslint@npm:8.57.1" @@ -8887,7 +8600,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.5.1, espree@npm:^9.6.0, espree@npm:^9.6.1": +"espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" dependencies: @@ -9274,13 +8987,6 @@ __metadata: languageName: node linkType: hard -"fathom-client@npm:^3.6.0": - version: 3.7.2 - resolution: "fathom-client@npm:3.7.2" - checksum: 10c0/f198669fba3aa14c4f1adc2b5afdce282503945fe3ac3d842ab7a6d46c90cf4a703ccad99abcbc71faa095348d9940a2d1aa0cf718c58e4d8479fa5dcb88aff2 - languageName: node - linkType: hard - "fault@npm:^2.0.0": version: 2.0.1 resolution: "fault@npm:2.0.1" @@ -9731,20 +9437,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.7": - version: 7.1.7 - resolution: "glob@npm:7.1.7" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.0.4" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/173245e6f9ccf904309eb7ef4a44a11f3bf68e9e341dff5a28b5db0dd7123b7506daf41497f3437a0710f57198187b758c2351eeaabce4d16935e956920da6a4 - languageName: node - linkType: hard - "glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -9801,7 +9493,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.4, globby@npm:^11.1.0": +"globby@npm:^11.0.4": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -9877,13 +9569,6 @@ __metadata: languageName: node linkType: hard -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 10c0/108415fb07ac913f17040dc336607772fcea68c7f495ef91887edddb0b0f5ff7bc1d1ab181b125ecb2f0505669ef12c9a178a3bbd2dd8e042d8c5f1d7c90331a - languageName: node - linkType: hard - "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -10655,7 +10340,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -10710,6 +10395,16 @@ __metadata: languageName: node linkType: hard +"install-artifact-from-github@npm:^1.3.5": + version: 1.3.5 + resolution: "install-artifact-from-github@npm:1.3.5" + bin: + install-from-cache: bin/install-from-cache.js + save-to-github-cache: bin/save-to-github-cache.js + checksum: 10c0/b8d9597dbdc422789ea2ed6c0ef534441577bb9dbca0eac5131e55985e2e0ae7bb63743ffeebb0d2a4082426701b9a1afe7acb1540f729583fac5d2e2567093a + languageName: node + linkType: hard + "internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" @@ -11299,13 +10994,6 @@ __metadata: languageName: node linkType: hard -"js-sdsl@npm:^4.1.4": - version: 4.4.2 - resolution: "js-sdsl@npm:4.4.2" - checksum: 10c0/50707728fc31642164f4d83c8087f3750aaa99c450b008b19e236a1f190c9e48f9fc799615c341f9ca2c0803b15ab6f48d92a9cc3e6ffd20065cba7d7e742b92 - languageName: node - linkType: hard - "js-sha3@npm:0.8.0": version: 0.8.0 resolution: "js-sha3@npm:0.8.0" @@ -13655,28 +13343,6 @@ __metadata: languageName: node linkType: hard -"my-project@workspace:apps/site": - version: 0.0.0-use.local - resolution: "my-project@workspace:apps/site" - dependencies: - "@headlessui/react": "npm:^1.7.13" - "@heroicons/react": "npm:^2.0.17" - "@types/node": "npm:18.15.11" - "@types/react": "npm:18.0.33" - "@types/react-dom": "npm:18.0.11" - autoprefixer: "npm:^10.4.14" - eslint: "npm:8.37.0" - eslint-config-next: "npm:13.2.4" - fathom-client: "npm:^3.6.0" - next: "npm:13.2.4" - postcss: "npm:^8.4.21" - react: "npm:18.2.0" - react-dom: "npm:18.2.0" - tailwindcss: "npm:^3.3.1" - typescript: "npm:5.0.3" - languageName: unknown - linkType: soft - "mz@npm:^2.7.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -13688,6 +13354,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.20.0": + version: 2.22.0 + resolution: "nan@npm:2.22.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/d5d31aefdb218deba308d44867c5f432b4d3aabeb57c70a2b236d62652e9fee7044e5d5afd380d9fef022fe7ebb2f2d6c85ca3cbcac5031aaca3592c844526bb + languageName: node + linkType: hard + "nano-time@npm:1.0.0": version: 1.0.0 resolution: "nano-time@npm:1.0.0" @@ -13697,7 +13372,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.4, nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -13849,77 +13524,6 @@ __metadata: languageName: node linkType: hard -"next@npm:13.2.4": - version: 13.2.4 - resolution: "next@npm:13.2.4" - dependencies: - "@next/env": "npm:13.2.4" - "@next/swc-android-arm-eabi": "npm:13.2.4" - "@next/swc-android-arm64": "npm:13.2.4" - "@next/swc-darwin-arm64": "npm:13.2.4" - "@next/swc-darwin-x64": "npm:13.2.4" - "@next/swc-freebsd-x64": "npm:13.2.4" - "@next/swc-linux-arm-gnueabihf": "npm:13.2.4" - "@next/swc-linux-arm64-gnu": "npm:13.2.4" - "@next/swc-linux-arm64-musl": "npm:13.2.4" - "@next/swc-linux-x64-gnu": "npm:13.2.4" - "@next/swc-linux-x64-musl": "npm:13.2.4" - "@next/swc-win32-arm64-msvc": "npm:13.2.4" - "@next/swc-win32-ia32-msvc": "npm:13.2.4" - "@next/swc-win32-x64-msvc": "npm:13.2.4" - "@swc/helpers": "npm:0.4.14" - caniuse-lite: "npm:^1.0.30001406" - postcss: "npm:8.4.14" - styled-jsx: "npm:5.1.1" - peerDependencies: - "@opentelemetry/api": ^1.4.0 - fibers: ">= 3.1.0" - node-sass: ^6.0.0 || ^7.0.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - dependenciesMeta: - "@next/swc-android-arm-eabi": - optional: true - "@next/swc-android-arm64": - optional: true - "@next/swc-darwin-arm64": - optional: true - "@next/swc-darwin-x64": - optional: true - "@next/swc-freebsd-x64": - optional: true - "@next/swc-linux-arm-gnueabihf": - optional: true - "@next/swc-linux-arm64-gnu": - optional: true - "@next/swc-linux-arm64-musl": - optional: true - "@next/swc-linux-x64-gnu": - optional: true - "@next/swc-linux-x64-musl": - optional: true - "@next/swc-win32-arm64-msvc": - optional: true - "@next/swc-win32-ia32-msvc": - optional: true - "@next/swc-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - bin: - next: dist/bin/next - checksum: 10c0/7eb9d92fc7011148f2169bd5e8219dd9b87b99366f55241c88b07701be602f3e3cc127aad57c32af839c31ad6f3eb1aa62e5c482b6e16b82f738ea3c6b8b2e04 - languageName: node - linkType: hard - "next@npm:13.5, next@npm:^12.2.5 || ^13.0.0": version: 13.5.7 resolution: "next@npm:13.5.7" @@ -14142,7 +13746,7 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:latest": +"node-gyp@npm:^10.1.0, node-gyp@npm:latest": version: 10.2.0 resolution: "node-gyp@npm:10.2.0" dependencies: @@ -14451,7 +14055,7 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.1, optionator@npm:^0.9.3": +"optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" dependencies: @@ -15002,17 +14606,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.14": - version: 8.4.14 - resolution: "postcss@npm:8.4.14" - dependencies: - nanoid: "npm:^3.3.4" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 10c0/2a4cfa28e2f1bfd358313501f7771bd596e494487c7b735c492e2f8b1faf493d24fcb43e2e6ad825863fc65a77abb949ca8f228602ae46a022f02dc812c4ac8b - languageName: node - linkType: hard - "postcss@npm:8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" @@ -15024,7 +14617,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.5": +"postcss@npm:^8, postcss@npm:^8.4.23, postcss@npm:^8.4.5": version: 8.4.47 resolution: "postcss@npm:8.4.47" dependencies: @@ -15422,15 +15015,14 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" +"re2@npm:1.21.3": + version: 1.21.3 + resolution: "re2@npm:1.21.3" dependencies: - loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" - peerDependencies: - react: ^18.2.0 - checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + install-artifact-from-github: "npm:^1.3.5" + nan: "npm:^2.20.0" + node-gyp: "npm:^10.1.0" + checksum: 10c0/e3c6c51524de93aac07bd24d7b8fa77663b02474f686cb5c035327d3126a7c4cf2214f792399270d1761f1b53f3aac84b7d3289fe49adfc32643c4f5d67234d6 languageName: node linkType: hard @@ -15618,15 +15210,6 @@ __metadata: languageName: node linkType: hard -"react@npm:18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 - languageName: node - linkType: hard - "react@npm:19.0.0-rc-02c0e824-20241028": version: 19.0.0-rc-02c0e824-20241028 resolution: "react@npm:19.0.0-rc-02c0e824-20241028" @@ -16490,7 +16073,7 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0, scheduler@npm:^0.23.2": +"scheduler@npm:^0.23.2": version: 0.23.2 resolution: "scheduler@npm:0.23.2" dependencies: @@ -16577,7 +16160,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.0, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.5.0, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -17192,7 +16775,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd @@ -17338,7 +16921,7 @@ __metadata: languageName: node linkType: hard -"tailwindcss@npm:^3.0.7, tailwindcss@npm:^3.3.1, tailwindcss@npm:^3.4.1": +"tailwindcss@npm:^3.0.7, tailwindcss@npm:^3.4.1": version: 3.4.14 resolution: "tailwindcss@npm:3.4.14" dependencies: @@ -17728,24 +17311,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 - languageName: node - linkType: hard - -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: "npm:^1.8.1" - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 10c0/02f19e458ec78ead8fffbf711f834ad8ecd2cc6ade4ec0320790713dccc0a412b99e7fd907c4cda2a1dc602c75db6f12e0108e87a5afad4b2f9e90a24cabd5a2 - languageName: node - linkType: hard - "turbo-darwin-64@npm:2.2.3": version: 2.2.3 resolution: "turbo-darwin-64@npm:2.2.3" @@ -17935,16 +17500,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.0.3": - version: 5.0.3 - resolution: "typescript@npm:5.0.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/13221c7f7dd2aa9cf8ac2fb1b5ca3825ff3d97a43b4656fd22ca36c0ec30179643b5157d620c3e4af9d3fc9234a571bd3ea175624b3d37c494d7ed159b038df2 - languageName: node - linkType: hard - "typescript@npm:5.4": version: 5.4.5 resolution: "typescript@npm:5.4.5" @@ -17975,16 +17530,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.0.3#optional!builtin": - version: 5.0.3 - resolution: "typescript@patch:typescript@npm%3A5.0.3#optional!builtin::version=5.0.3&hash=b5f058" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/381de1b58d2deb6443cc7d23365b4db36de8360dfc4f4d295ca2fdb0e01687711fb541478838fb9326da315baf6967d616c745d990f2c362036b337a12b18255 - languageName: node - linkType: hard - "typescript@patch:typescript@npm%3A5.4#optional!builtin": version: 5.4.5 resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c"