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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
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.
+
+
+
+
+
+
+
+
+
+ );
+}
+
+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"