diff --git a/.env.example b/.env.example index 308d5a5b42..295447add0 100644 --- a/.env.example +++ b/.env.example @@ -77,7 +77,7 @@ NEXT_PUBLIC_HELPSCOUT_KEY= SEND_FEEDBACK_EMAIL= # Sengrid -# Used for email reminders in workflows and internal sync services +# Used for email reminders in workflows SENDGRID_API_KEY= SENDGRID_EMAIL= @@ -134,8 +134,9 @@ NEXT_PUBLIC_TEAM_IMPERSONATION=false # Close.com internal CRM CLOSECOM_API_KEY= -# Sendgrid internal sync service -SENDGRID_SYNC_API_KEY= - # Sendgrid internal email sender SENDGRID_API_KEY= + +# Sentry +NEXT_PUBLIC_SENTRY_DSN= +SENTRY_IGNORE_API_RESOLUTION_ERROR= diff --git a/app.json b/app.json index ba670bab19..2ad52b916c 100644 --- a/app.json +++ b/app.json @@ -50,10 +50,6 @@ "description": "Sendgrid api key. Used for email reminders in workflows", "value": "" }, - "SENDGRID_SYNC_API_KEY": { - "description": "Sendgrid internal sync service", - "value": "" - }, "SENDGRID_EMAIL": { "description": "Sendgrid email. Used for email reminders in workflows", "value": "" diff --git a/apps/web/.gitignore b/apps/web/.gitignore index 8b974b328b..e9c028b5aa 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -67,4 +67,6 @@ tsconfig.tsbuildinfo public/embed # Copied app-store images -public/app-store \ No newline at end of file +public/app-store +# Sentry +.sentryclirc diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 52300b80dc..7289eac74b 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,5 +1,6 @@ require("dotenv").config({ path: "../../.env" }); const CopyWebpackPlugin = require("copy-webpack-plugin"); +const { withSentryConfig } = require("@sentry/nextjs"); const withTM = require("next-transpile-modules")([ "@calcom/app-store", @@ -229,6 +230,18 @@ const nextConfig = { return redirects; }, + sentry: { + hideSourceMaps: true, + }, }; -module.exports = () => plugins.reduce((acc, next) => next(acc), nextConfig); +const sentryWebpackPluginOptions = { + silent: true, // Suppresses all logs +}; + +const moduleExports = () => plugins.reduce((acc, next) => next(acc), nextConfig); + +// Sentry should be the last thing to export to catch everything right +module.exports = process.env.NEXT_PUBLIC_SENTRY_DSN + ? withSentryConfig(moduleExports, sentryWebpackPluginOptions) + : moduleExports; diff --git a/apps/web/package.json b/apps/web/package.json index d6be94752a..712e425c97 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -56,6 +56,7 @@ "@radix-ui/react-switch": "^1.0.0", "@radix-ui/react-toggle-group": "^1.0.0", "@radix-ui/react-tooltip": "^1.0.0", + "@sentry/nextjs": "^7.17.3", "@stripe/react-stripe-js": "^1.10.0", "@stripe/stripe-js": "^1.35.0", "@tanstack/react-query": "^4.3.9", diff --git a/apps/web/pages/_error.tsx b/apps/web/pages/_error.tsx index 16b292c743..bc98d49d22 100644 --- a/apps/web/pages/_error.tsx +++ b/apps/web/pages/_error.tsx @@ -2,6 +2,7 @@ * Typescript class based component for custom-error * @link https://nextjs.org/docs/advanced-features/custom-error-page */ +import * as Sentry from "@sentry/nextjs"; import { NextPage, NextPageContext } from "next"; import NextError, { ErrorProps } from "next/error"; import React from "react"; @@ -46,7 +47,9 @@ const CustomError: NextPage = (props) => { * Partially adapted from the example in * https://github.com/vercel/next.js/tree/canary/examples/with-sentry */ -CustomError.getInitialProps = async ({ res, err, asPath }: AugmentedNextPageContext) => { +CustomError.getInitialProps = async (ctx: AugmentedNextPageContext) => { + const { res, err, asPath } = ctx; + await Sentry.captureUnderscoreErrorException(ctx); const errorInitialProps = (await NextError.getInitialProps({ res, err, diff --git a/apps/web/pages/apps/installed/[category].tsx b/apps/web/pages/apps/installed/[category].tsx index da92ec8117..7a091f795b 100644 --- a/apps/web/pages/apps/installed/[category].tsx +++ b/apps/web/pages/apps/installed/[category].tsx @@ -179,9 +179,7 @@ const IntegrationsContainer = ({ variant, exclude }: IntegrationsContainerProps) })} description={t(`no_category_apps_description_${variant || "other"}`)} buttonRaw={ - } diff --git a/apps/web/sentry.client.config.js b/apps/web/sentry.client.config.js new file mode 100644 index 0000000000..17e9d9aef0 --- /dev/null +++ b/apps/web/sentry.client.config.js @@ -0,0 +1,16 @@ +// This file configures the initialization of Sentry on the browser. +// The config you add here will be used whenever a page is visited. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ +import * as Sentry from "@sentry/nextjs"; + +const SENTRY_DSN = process.env.NEXT_PUBLIC_SENTRY_DSN; + +Sentry.init({ + dsn: SENTRY_DSN, + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1.0, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/apps/web/sentry.properties b/apps/web/sentry.properties new file mode 100644 index 0000000000..93228f60da --- /dev/null +++ b/apps/web/sentry.properties @@ -0,0 +1,3 @@ +defaults.url=https://sentry.io/ +defaults.org=calcom +defaults.project=cal \ No newline at end of file diff --git a/apps/web/sentry.server.config.js b/apps/web/sentry.server.config.js new file mode 100644 index 0000000000..3956c7d359 --- /dev/null +++ b/apps/web/sentry.server.config.js @@ -0,0 +1,16 @@ +// This file configures the initialization of Sentry on the server. +// The config you add here will be used whenever the server handles a request. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ +import * as Sentry from "@sentry/nextjs"; + +const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; + +Sentry.init({ + dsn: SENTRY_DSN, + // Adjust this value in production, or use tracesSampler for greater control + tracesSampleRate: 1.0, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/packages/app-store/_pages/setup/index.tsx b/packages/app-store/_pages/setup/index.tsx index 871ec10776..bb08cc9e6c 100644 --- a/packages/app-store/_pages/setup/index.tsx +++ b/packages/app-store/_pages/setup/index.tsx @@ -10,7 +10,6 @@ export const AppSetupMap = { "caldav-calendar": dynamic(() => import("../../caldavcalendar/pages/setup")), zapier: dynamic(() => import("../../zapier/pages/setup")), closecom: dynamic(() => import("../../closecomothercalendar/pages/setup")), - sendgrid: dynamic(() => import("../../sendgridothercalendar/pages/setup")), }; export const AppSetupPage = (props: { slug: string }) => { diff --git a/packages/app-store/apps.metadata.generated.ts b/packages/app-store/apps.metadata.generated.ts index 7cb672650c..ec813952c3 100644 --- a/packages/app-store/apps.metadata.generated.ts +++ b/packages/app-store/apps.metadata.generated.ts @@ -30,7 +30,6 @@ import { metadata as qr_code_meta } from "./qr_code/_metadata"; import { metadata as rainbow_meta } from "./rainbow/_metadata"; import { metadata as raycast_meta } from "./raycast/_metadata"; import { metadata as riverside_meta } from "./riverside/_metadata"; -import { metadata as sendgridothercalendar_meta } from "./sendgridothercalendar/_metadata"; import { metadata as sirius_video_meta } from "./sirius_video/_metadata"; import { metadata as stripepayment_meta } from "./stripepayment/_metadata"; import { metadata as tandemvideo_meta } from "./tandemvideo/_metadata"; @@ -71,7 +70,6 @@ export const appStoreMetadata = { rainbow: rainbow_meta, raycast: raycast_meta, riverside: riverside_meta, - sendgridothercalendar: sendgridothercalendar_meta, sirius_video: sirius_video_meta, stripepayment: stripepayment_meta, tandemvideo: tandemvideo_meta, diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts index fa0526e765..5964179823 100644 --- a/packages/app-store/apps.server.generated.ts +++ b/packages/app-store/apps.server.generated.ts @@ -29,7 +29,6 @@ export const apiHandlers = { rainbow: import("./rainbow/api"), raycast: import("./raycast/api"), riverside: import("./riverside/api"), - sendgridothercalendar: import("./sendgridothercalendar/api"), sirius_video: import("./sirius_video/api"), stripepayment: import("./stripepayment/api"), tandemvideo: import("./tandemvideo/api"), diff --git a/packages/app-store/closecomothercalendar/lib/CalendarService.ts b/packages/app-store/closecomothercalendar/lib/CalendarService.ts index 3837fb55fc..276cb94026 100644 --- a/packages/app-store/closecomothercalendar/lib/CalendarService.ts +++ b/packages/app-store/closecomothercalendar/lib/CalendarService.ts @@ -1,6 +1,7 @@ import z from "zod"; import CloseCom, { CloseComFieldOptions } from "@calcom/lib/CloseCom"; +import { getCustomActivityTypeInstanceData } from "@calcom/lib/CloseComeUtils"; import { symmetricDecrypt } from "@calcom/lib/crypto"; import logger from "@calcom/lib/logger"; import type { @@ -73,9 +74,10 @@ export default class CloseComCalendarService implements Calendar { } closeComUpdateCustomActivity = async (uid: string, event: CalendarEvent) => { - const customActivityTypeInstanceData = await this.closeCom.getCustomActivityTypeInstanceData( + const customActivityTypeInstanceData = await getCustomActivityTypeInstanceData( event, - calComCustomActivityFields + calComCustomActivityFields, + this.closeCom ); // Create Custom Activity type instance const customActivityTypeInstance = await this.closeCom.activity.custom.create( @@ -89,9 +91,10 @@ export default class CloseComCalendarService implements Calendar { }; async createEvent(event: CalendarEvent): Promise { - const customActivityTypeInstanceData = await this.closeCom.getCustomActivityTypeInstanceData( + const customActivityTypeInstanceData = await getCustomActivityTypeInstanceData( event, - calComCustomActivityFields + calComCustomActivityFields, + this.closeCom ); // Create Custom Activity type instance const customActivityTypeInstance = await this.closeCom.activity.custom.create( diff --git a/packages/app-store/closecomothercalendar/test/globals.ts b/packages/app-store/closecomothercalendar/test/globals.ts index ada50ba128..ecff2dea7a 100644 --- a/packages/app-store/closecomothercalendar/test/globals.ts +++ b/packages/app-store/closecomothercalendar/test/globals.ts @@ -1,11 +1,8 @@ jest.mock("@calcom/lib/logger", () => ({ - default: { - getChildLogger: () => ({ - debug: jest.fn(), - error: jest.fn(), - log: jest.fn(), - }), - }, + debug: jest.fn(), + error: jest.fn(), + log: jest.fn(), + getChildLogger: jest.fn(), })); jest.mock("@calcom/lib/crypto", () => ({ diff --git a/packages/app-store/closecomothercalendar/test/lib/CalendarService.test.ts b/packages/app-store/closecomothercalendar/test/lib/CalendarService.test.ts index 9218754d38..da4e316a6d 100644 --- a/packages/app-store/closecomothercalendar/test/lib/CalendarService.test.ts +++ b/packages/app-store/closecomothercalendar/test/lib/CalendarService.test.ts @@ -1,6 +1,20 @@ import CloseCom from "@calcom/lib/CloseCom"; +import { + getCloseComContactIds, + getCustomActivityTypeInstanceData, + getCloseComCustomActivityTypeFieldsIds, + getCloseComLeadId, +} from "@calcom/lib/CloseComeUtils"; import type { CalendarEvent } from "@calcom/types/Calendar"; +jest.mock("@calcom/lib/CloseCom", () => ({ + default: class { + constructor() { + /* Mock */ + } + }, +})); + afterEach(() => { jest.resetAllMocks(); }); @@ -12,8 +26,9 @@ test("check generic lead generator: already exists", async () => { data: [{ name: "From Cal.com", id: "abc" }], }), } as any; - debugger; - const id = await CloseCom.prototype.getCloseComLeadId(); + + const closeCom = new CloseCom("someKey"); + const id = await getCloseComLeadId(closeCom); expect(id).toEqual("abc"); }); @@ -26,7 +41,8 @@ test("check generic lead generator: doesn't exist", async () => { create: () => ({ id: "def" }), } as any; - const id = await CloseCom.prototype.getCloseComLeadId(); + const closeCom = new CloseCom("someKey"); + const id = await getCloseComLeadId(closeCom); expect(id).toEqual("def"); }); @@ -45,7 +61,8 @@ test("retrieve contact IDs: all exist", async () => { search: () => ({ data: attendees }), } as any; - const contactIds = await CloseCom.prototype.getCloseComContactIds(event.attendees, "leadId"); + const closeCom = new CloseCom("someKey"); + const contactIds = await getCloseComContactIds(event.attendees, closeCom, "leadId"); expect(contactIds).toEqual(["test1", "test2"]); }); @@ -62,7 +79,8 @@ test("retrieve contact IDs: some don't exist", async () => { create: () => ({ id: "test3" }), } as any; - const contactIds = await CloseCom.prototype.getCloseComContactIds(event.attendees, "leadId"); + const closeCom = new CloseCom("someKey"); + const contactIds = await getCloseComContactIds(event.attendees, closeCom, "leadId"); expect(contactIds).toEqual(["test1", "test3"]); }); @@ -87,11 +105,15 @@ test("retrieve custom fields for custom activity type: type doesn't exist, no fi }, } as any; - const contactIds = await CloseCom.prototype.getCloseComCustomActivityTypeFieldsIds([ - ["Attendees", "", true, true], - ["Date & Time", "", true, true], - ["Time Zone", "", true, true], - ]); + const closeCom = new CloseCom("someKey"); + const contactIds = await getCloseComCustomActivityTypeFieldsIds( + [ + ["Attendees", "", true, true], + ["Date & Time", "", true, true], + ["Time Zone", "", true, true], + ], + closeCom + ); expect(contactIds).toEqual({ activityType: "type1", fields: ["field9A", "field11D", "field9T"], @@ -119,11 +141,15 @@ test("retrieve custom fields for custom activity type: type exists, no field cre }, } as any; - const contactIds = await CloseCom.prototype.getCloseComCustomActivityTypeFieldsIds([ - ["Attendees", "", true, true], - ["Date & Time", "", true, true], - ["Time Zone", "", true, true], - ]); + const closeCom = new CloseCom("someKey"); + const contactIds = await getCloseComCustomActivityTypeFieldsIds( + [ + ["Attendees", "", true, true], + ["Date & Time", "", true, true], + ["Time Zone", "", true, true], + ], + closeCom + ); expect(contactIds).toEqual({ activityType: "typeX", fields: ["fieldY", "field11D", "field9T"], @@ -142,7 +168,7 @@ test("prepare data to create custom activity type instance: two attendees, no ad const event = { attendees, startTime: now.toISOString(), - } as unknown as CalendarEvent; + } as CalendarEvent; CloseCom.prototype.activity = { type: { @@ -170,11 +196,16 @@ test("prepare data to create custom activity type instance: two attendees, no ad create: () => ({ id: "def" }), } as any; - const data = await CloseCom.prototype.getCustomActivityTypeInstanceData(event, [ - ["Attendees", "", true, true], - ["Date & Time", "", true, true], - ["Time Zone", "", true, true], - ]); + const closeCom = new CloseCom("someKey"); + const data = await getCustomActivityTypeInstanceData( + event, + [ + ["Attendees", "", true, true], + ["Date & Time", "", true, true], + ["Time Zone", "", true, true], + ], + closeCom + ); expect(data).toEqual({ custom_activity_type_id: "type1", lead_id: "def", @@ -221,11 +252,16 @@ test("prepare data to create custom activity type instance: one attendees, with }), } as any; - const data = await CloseCom.prototype.getCustomActivityTypeInstanceData(event, [ - ["Attendees", "", true, true], - ["Date & Time", "", true, true], - ["Time Zone", "", true, true], - ]); + const closeCom = new CloseCom("someKey"); + const data = await getCustomActivityTypeInstanceData( + event, + [ + ["Attendees", "", true, true], + ["Date & Time", "", true, true], + ["Time Zone", "", true, true], + ], + closeCom + ); expect(data).toEqual({ custom_activity_type_id: "type1", lead_id: "abc", diff --git a/packages/app-store/index.ts b/packages/app-store/index.ts index 1503a9a3b8..6c87e4b0aa 100644 --- a/packages/app-store/index.ts +++ b/packages/app-store/index.ts @@ -15,7 +15,6 @@ import * as jitsivideo from "./jitsivideo"; import * as larkcalendar from "./larkcalendar"; import * as office365calendar from "./office365calendar"; import * as office365video from "./office365video"; -import * as sendgridothercalendar from "./sendgridothercalendar"; import * as stripepayment from "./stripepayment"; import * as tandemvideo from "./tandemvideo"; import * as vital from "./vital"; @@ -37,7 +36,6 @@ const appStore = { larkcalendar, office365calendar, office365video, - sendgridothercalendar, stripepayment, tandemvideo, vital, diff --git a/packages/app-store/sendgridothercalendar/README.mdx b/packages/app-store/sendgridothercalendar/README.mdx deleted file mode 100644 index a910afaf9f..0000000000 --- a/packages/app-store/sendgridothercalendar/README.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -description: SendGrid delivers your transactional and marketing emails through the world's largest cloud-based email delivery platform. -items: - - /api/app-store/sendgridothercalendar/1.png ---- - -{description} - -Features: - - Creates event attendees as contacts in Sendgrid diff --git a/packages/app-store/sendgridothercalendar/_metadata.ts b/packages/app-store/sendgridothercalendar/_metadata.ts deleted file mode 100644 index 9c7f2aa320..0000000000 --- a/packages/app-store/sendgridothercalendar/_metadata.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { AppMeta } from "@calcom/types/App"; - -import config from "./config.json"; - -export const metadata = { - category: "other", - ...config, -} as AppMeta; - -export default metadata; diff --git a/packages/app-store/sendgridothercalendar/api/_getAdd.ts b/packages/app-store/sendgridothercalendar/api/_getAdd.ts deleted file mode 100644 index 6f16a414db..0000000000 --- a/packages/app-store/sendgridothercalendar/api/_getAdd.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import checkSession from "../../_utils/auth"; -import { checkInstalled } from "../../_utils/installation"; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - const session = checkSession(req); - await checkInstalled("sendgrid", session.user?.id); - return res.status(200).json({ url: "/apps/sendgrid/setup" }); -} diff --git a/packages/app-store/sendgridothercalendar/api/_postAdd.ts b/packages/app-store/sendgridothercalendar/api/_postAdd.ts deleted file mode 100644 index 1e1f95e46c..0000000000 --- a/packages/app-store/sendgridothercalendar/api/_postAdd.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import { symmetricEncrypt } from "@calcom/lib/crypto"; -import { HttpError } from "@calcom/lib/http-error"; -import logger from "@calcom/lib/logger"; -import { defaultResponder } from "@calcom/lib/server"; -import prisma from "@calcom/prisma"; - -import checkSession from "../../_utils/auth"; -import getInstalledAppPath from "../../_utils/getInstalledAppPath"; - -export async function getHandler(req: NextApiRequest, res: NextApiResponse) { - const session = checkSession(req); - - const { api_key } = req.body; - if (!api_key) throw new HttpError({ statusCode: 400, message: "No Api Key provided to check" }); - - const encrypted = symmetricEncrypt(JSON.stringify({ api_key }), process.env.CALENDSO_ENCRYPTION_KEY || ""); - - const data = { - type: "sendgrid_other_calendar", - key: { encrypted }, - userId: session.user?.id, - appId: "sendgrid", - }; - - try { - await prisma.credential.create({ - data, - }); - } catch (reason) { - logger.error("Could not add Sendgrid app", reason); - return res.status(500).json({ message: "Could not add Sendgrid app" }); - } - - return res.status(200).json({ url: getInstalledAppPath({ variant: "other", slug: "sendgrid" }) }); -} - -export default defaultResponder(getHandler); diff --git a/packages/app-store/sendgridothercalendar/api/_postCheck.ts b/packages/app-store/sendgridothercalendar/api/_postCheck.ts deleted file mode 100644 index c71bbc7e05..0000000000 --- a/packages/app-store/sendgridothercalendar/api/_postCheck.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import Sendgrid from "@calcom/lib/Sendgrid"; -import { HttpError } from "@calcom/lib/http-error"; -import { defaultResponder } from "@calcom/lib/server"; - -import checkSession from "../../_utils/auth"; - -export async function getHandler(req: NextApiRequest, res: NextApiResponse) { - const { api_key } = req.body; - if (!api_key) throw new HttpError({ statusCode: 400, message: "No Api Key provoided to check" }); - - checkSession(req); - - const sendgrid: Sendgrid = new Sendgrid(api_key); - - try { - const usernameInfo = await sendgrid.username(); - if (usernameInfo.username) { - return res.status(200).end(); - } else { - return res.status(404).end(); - } - } catch (e) { - return res.status(500).json({ message: e }); - } -} - -export default defaultResponder(getHandler); diff --git a/packages/app-store/sendgridothercalendar/api/add.ts b/packages/app-store/sendgridothercalendar/api/add.ts deleted file mode 100644 index 9480fb9259..0000000000 --- a/packages/app-store/sendgridothercalendar/api/add.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defaultHandler } from "@calcom/lib/server"; - -export default defaultHandler({ - GET: import("./_getAdd"), - POST: import("./_postAdd"), -}); diff --git a/packages/app-store/sendgridothercalendar/api/check.ts b/packages/app-store/sendgridothercalendar/api/check.ts deleted file mode 100644 index 97ed132226..0000000000 --- a/packages/app-store/sendgridothercalendar/api/check.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { defaultHandler } from "@calcom/lib/server"; - -export default defaultHandler({ - POST: import("./_postCheck"), -}); diff --git a/packages/app-store/sendgridothercalendar/api/index.ts b/packages/app-store/sendgridothercalendar/api/index.ts deleted file mode 100644 index 766afa6405..0000000000 --- a/packages/app-store/sendgridothercalendar/api/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as add } from "./add"; -export { default as check } from "./check"; diff --git a/packages/app-store/sendgridothercalendar/components/.gitkeep b/packages/app-store/sendgridothercalendar/components/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/app-store/sendgridothercalendar/config.json b/packages/app-store/sendgridothercalendar/config.json deleted file mode 100644 index ea07d7aa1d..0000000000 --- a/packages/app-store/sendgridothercalendar/config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "/*": "Don't modify slug - If required, do it using cli edit command", - "name": "Sendgrid", - "slug": "sendgrid", - "type": "sendgrid_other_calendar", - "imageSrc": "/api/app-store/sendgridothercalendar/icon.png", - "logo": "/api/app-store/sendgridothercalendar/icon.png", - "url": "https://cal.com/apps/sendgrid", - "variant": "other_calendar", - "categories": ["other"], - "publisher": "Cal.com", - "email": "help@cal.com", - "description": "SendGrid delivers your transactional and marketing emails through the world's largest cloud-based email delivery platform.", - "extendsFeature": "User", - "__createdUsingCli": true -} diff --git a/packages/app-store/sendgridothercalendar/index.ts b/packages/app-store/sendgridothercalendar/index.ts deleted file mode 100644 index 5373eb04ef..0000000000 --- a/packages/app-store/sendgridothercalendar/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as api from "./api"; -export * as lib from "./lib"; -export { metadata } from "./_metadata"; diff --git a/packages/app-store/sendgridothercalendar/lib/CalendarService.ts b/packages/app-store/sendgridothercalendar/lib/CalendarService.ts deleted file mode 100644 index 17e69a623b..0000000000 --- a/packages/app-store/sendgridothercalendar/lib/CalendarService.ts +++ /dev/null @@ -1,99 +0,0 @@ -import z from "zod"; - -import Sendgrid, { SendgridNewContact } from "@calcom/lib/Sendgrid"; -import { symmetricDecrypt } from "@calcom/lib/crypto"; -import logger from "@calcom/lib/logger"; -import type { - Calendar, - CalendarEvent, - EventBusyDate, - IntegrationCalendar, - NewCalendarEventType, -} from "@calcom/types/Calendar"; -import { CredentialPayload } from "@calcom/types/Credential"; - -const apiKeySchema = z.object({ - encrypted: z.string(), -}); - -const CALENDSO_ENCRYPTION_KEY = process.env.CALENDSO_ENCRYPTION_KEY || ""; - -/** - * Authentication - * Sendgrid requires Basic Auth for any request to their APIs, which is far from - * ideal considering that such a strategy requires generating an API Key by the - * user and input it in our system. A Setup page was created when trying to install - * Sendgrid in order to instruct how to create such resource and to obtain it. - */ -export default class CloseComCalendarService implements Calendar { - private integrationName = ""; - private sendgrid: Sendgrid; - private log: typeof logger; - - constructor(credential: CredentialPayload) { - this.integrationName = "sendgrid_other_calendar"; - this.log = logger.getChildLogger({ prefix: [`[[lib] ${this.integrationName}`] }); - - const parsedCredentialKey = apiKeySchema.safeParse(credential.key); - - let decrypted; - if (parsedCredentialKey.success) { - decrypted = symmetricDecrypt(parsedCredentialKey.data.encrypted, CALENDSO_ENCRYPTION_KEY); - const { api_key } = JSON.parse(decrypted); - this.sendgrid = new Sendgrid(api_key); - } else { - throw Error( - `No API Key found for userId ${credential.userId} and appId ${credential.appId}: ${parsedCredentialKey.error}` - ); - } - } - - async createEvent(event: CalendarEvent): Promise { - // Proceeding to just creating the user in Sendgrid, no event entity exists in Sendgrid - const contactsData = event.attendees.map((attendee) => ({ - first_name: attendee.name, - email: attendee.email, - })); - const result = await this.sendgrid.sendgridRequest({ - url: `/v3/marketing/contacts`, - method: "PUT", - body: { - contacts: contactsData, - }, - }); - return Promise.resolve({ - id: "", - uid: result.job_id, - password: "", - url: "", - type: this.integrationName, - additionalInfo: { - result, - }, - }); - } - - async updateEvent(uid: string, event: CalendarEvent): Promise { - // Unless we want to be able to support modifying an event to add more attendees - // to have them created in Sendgrid, ingoring this use case for now - return Promise.resolve(); - } - - async deleteEvent(uid: string): Promise { - // Unless we want to delete the contact in Sendgrid once the event - // is deleted just ingoring this use case for now - return Promise.resolve(); - } - - async getAvailability( - dateFrom: string, - dateTo: string, - selectedCalendars: IntegrationCalendar[] - ): Promise { - return Promise.resolve([]); - } - - async listCalendars(event?: CalendarEvent): Promise { - return Promise.resolve([]); - } -} diff --git a/packages/app-store/sendgridothercalendar/lib/index.ts b/packages/app-store/sendgridothercalendar/lib/index.ts deleted file mode 100644 index e168c149df..0000000000 --- a/packages/app-store/sendgridothercalendar/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as CalendarService } from "./CalendarService"; diff --git a/packages/app-store/sendgridothercalendar/package.json b/packages/app-store/sendgridothercalendar/package.json deleted file mode 100644 index a6b72ebee1..0000000000 --- a/packages/app-store/sendgridothercalendar/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/package.json", - "private": true, - "name": "@calcom/sendgridothercalendar", - "version": "0.0.0", - "main": "./index.ts", - "description": "SendGrid delivers your transactional and marketing emails through the world's largest cloud-based email delivery platform.", - "dependencies": { - "@calcom/lib": "*", - "@calcom/prisma": "*", - "@sendgrid/client": "^7.7.0" - }, - "devDependencies": { - "@calcom/types": "*" - } -} diff --git a/packages/app-store/sendgridothercalendar/pages/setup/index.tsx b/packages/app-store/sendgridothercalendar/pages/setup/index.tsx deleted file mode 100644 index 607af58c46..0000000000 --- a/packages/app-store/sendgridothercalendar/pages/setup/index.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import { zodResolver } from "@hookform/resolvers/zod"; -import { useRouter } from "next/router"; -import { useState, useEffect } from "react"; -import { useForm, Controller } from "react-hook-form"; -import { Toaster } from "react-hot-toast"; -import z from "zod"; - -import { useLocale } from "@calcom/lib/hooks/useLocale"; -import { Button } from "@calcom/ui"; -import { Icon } from "@calcom/ui/Icon"; -import { Form, TextField } from "@calcom/ui/components/form"; -import { showToast } from "@calcom/ui/v2"; - -const formSchema = z.object({ - api_key: z.string(), -}); - -export default function SendgridSetup() { - const { t } = useLocale(); - const router = useRouter(); - const [testPassed, setTestPassed] = useState(undefined); - const [testLoading, setTestLoading] = useState(false); - - const form = useForm<{ - api_key: string; - }>({ - resolver: zodResolver(formSchema), - }); - - useEffect(() => { - const timer = setTimeout(() => { - if (testPassed === false) { - setTestPassed(undefined); - } - }, 3000); - return () => clearTimeout(timer); - }, [testPassed]); - - return ( -
-
-
-
- {/* eslint-disable @next/next/no-img-element */} - Apple Calendar -
-
-

{t("provide_api_key")}

- -
- {t("generate_api_key_description")}{" "} - - Sendgrid - - . {t("it_stored_encrypted")} -
-
-
{ - const res = await fetch("/api/integrations/sendgridothercalendar/add", { - method: "POST", - body: JSON.stringify(values), - headers: { - "Content-Type": "application/json", - }, - }); - const json = await res.json(); - - if (res.ok) { - router.push(json.url); - } else { - showToast(json.message, "error"); - } - }}> -
- ( - { - onChange(e.target.value); - form.setValue("api_key", e.target.value); - await form.trigger("api_key"); - }} - /> - )} - /> -
-
- - - -
-
-
-
-
-
- -
- ); -} diff --git a/packages/app-store/sendgridothercalendar/static/1.png b/packages/app-store/sendgridothercalendar/static/1.png deleted file mode 100644 index ead1889ab2..0000000000 Binary files a/packages/app-store/sendgridothercalendar/static/1.png and /dev/null differ diff --git a/packages/app-store/sendgridothercalendar/static/logo.png b/packages/app-store/sendgridothercalendar/static/logo.png deleted file mode 100644 index f99bf85fe6..0000000000 Binary files a/packages/app-store/sendgridothercalendar/static/logo.png and /dev/null differ diff --git a/packages/lib/CloseCom.ts b/packages/lib/CloseCom.ts index 1808d43a23..4b0517d0e2 100644 --- a/packages/lib/CloseCom.ts +++ b/packages/lib/CloseCom.ts @@ -1,5 +1,4 @@ import logger from "@calcom/lib/logger"; -import { CalendarEvent } from "@calcom/types/Calendar"; export type CloseComLead = { companyName?: string | null | undefined; @@ -300,7 +299,6 @@ export default class CloseCom { private _delete = async ({ urlPath }: { urlPath: string }) => { return this._request({ urlPath, method: "delete" }); }; - private _request = async ({ urlPath, data, @@ -332,197 +330,6 @@ export default class CloseCom { return await response.json(); }); }; - - public async getCloseComContactIds( - persons: { email: string; name: string | null }[], - leadFromCalComId?: string - ): Promise { - // Check if persons exist or to see if any should be created - const closeComContacts = await this.contact.search({ - emails: persons.map((att) => att.email), - }); - // NOTE: If contact is duplicated in Close.com we will get more results - // messing around with the expected number of contacts retrieved - if (closeComContacts.data.length < persons.length && leadFromCalComId) { - // Create missing contacts - const personsEmails = persons.map((att) => att.email); - // Existing contacts based on persons emails: contacts may have more - // than one email, we just need the one used by the event. - const existingContactsEmails = closeComContacts.data.flatMap((cont) => - cont.emails.filter((em) => personsEmails.includes(em.email)).map((ems) => ems.email) - ); - const nonExistingContacts = persons.filter((person) => !existingContactsEmails.includes(person.email)); - const createdContacts = await Promise.all( - nonExistingContacts.map( - async (per) => - await this.contact.create({ - person: per, - leadId: leadFromCalComId, - }) - ) - ); - if (createdContacts.length === nonExistingContacts.length) { - // All non existent contacts where created - return Promise.resolve( - closeComContacts.data.map((cont) => cont.id).concat(createdContacts.map((cont) => cont.id)) - ); - } else { - return Promise.reject("Some contacts were not possible to create in Close.com"); - } - } else { - return Promise.resolve(closeComContacts.data.map((cont) => cont.id)); - } - } - - public async getCustomActivityTypeInstanceData( - event: CalendarEvent, - customFields: CloseComFieldOptions - ): Promise { - // Get Cal.com generic Lead - const leadFromCalComId = await this.getCloseComLeadId(); - // Get Contacts ids - const contactsIds = await this.getCloseComContactIds(event.attendees, leadFromCalComId); - // Get Custom Activity Type id - const customActivityTypeAndFieldsIds = await this.getCloseComCustomActivityTypeFieldsIds(customFields); - // Prepare values for each Custom Activity Fields - const customActivityFieldsValues = [ - contactsIds.length > 1 ? contactsIds.slice(1) : null, // Attendee - event.startTime, // Date & Time - event.attendees[0].timeZone, // Time Zone - contactsIds[0], // Organizer - event.additionalNotes ?? null, // Additional Notes - ]; - // Preparing Custom Activity Instance data for Close.com - return Object.assign( - {}, - { - custom_activity_type_id: customActivityTypeAndFieldsIds.activityType, - lead_id: leadFromCalComId, - }, // This is to add each field as `"custom.FIELD_ID": "value"` in the object - ...customActivityTypeAndFieldsIds.fields.map((fieldId: string, index: number) => { - return { - [`custom.${fieldId}`]: customActivityFieldsValues[index], - }; - }) - ); - } - - public async getCustomFieldsIds( - entity: keyof CloseCom["customField"], - customFields: CloseComFieldOptions, - custom_activity_type_id?: string - ): Promise { - // Get Custom Activity Fields - const allFields: CloseComCustomActivityFieldGet | CloseComCustomContactFieldGet = await this.customField[ - entity - ].get({ - query: { _fields: ["name", "id"].concat(entity === "activity" ? ["custom_activity_type_id"] : []) }, - }); - let relevantFields: { [key: string]: any }[]; - if (entity === "activity") { - relevantFields = (allFields as CloseComCustomActivityFieldGet).data.filter( - (fie) => fie.custom_activity_type_id === custom_activity_type_id - ); - } else { - relevantFields = allFields.data as CloseComCustomActivityFieldGet["data"]; - } - const customFieldsNames = relevantFields.map((fie) => fie.name); - const customFieldsExist = customFields.map((cusFie) => customFieldsNames.includes(cusFie[0])); - return await Promise.all( - customFieldsExist.map(async (exist, idx) => { - if (!exist && entity !== "shared") { - const [name, type, required, multiple] = customFields[idx]; - let created: { [key: string]: any }; - if (entity === "activity" && custom_activity_type_id) { - created = await this.customField[entity].create({ - name, - type, - required, - accepts_multiple_values: multiple, - editable_with_roles: [], - custom_activity_type_id, - }); - return created.id; - } else { - if (entity === "contact") { - created = await this.customField[entity].create({ - name, - type, - required, - accepts_multiple_values: multiple, - editable_with_roles: [], - }); - return created.id; - } - } - } else { - const index = customFieldsNames.findIndex((val) => val === customFields[idx][0]); - if (index >= 0) { - return relevantFields[index].id; - } else { - throw Error("Couldn't find the field index"); - } - } - }) - ); - } - - public async getCloseComCustomActivityTypeFieldsIds(customFields: CloseComFieldOptions) { - // Check if Custom Activity Type exists - const customActivities = await this.customActivity.type.get(); - const calComCustomActivity = customActivities.data.filter((act) => act.name === "Cal.com Activity"); - if (calComCustomActivity.length > 0) { - // Cal.com Custom Activity type exist - // Get Custom Activity Type fields ids - const fields = await this.getCustomFieldsIds("activity", customFields, calComCustomActivity[0].id); - return { - activityType: calComCustomActivity[0].id, - fields, - }; - } else { - // Cal.com Custom Activity type doesn't exist - // Create Custom Activity Type - const { id: activityType } = await this.customActivity.type.create({ - name: "Cal.com Activity", - description: "Bookings in your Cal.com account", - }); - // Create Custom Activity Fields - const fields = await Promise.all( - customFields.map(async ([name, type, required, multiple]) => { - const creation = await this.customField.activity.create({ - custom_activity_type_id: activityType, - name, - type, - required, - accepts_multiple_values: multiple, - editable_with_roles: [], - }); - return creation.id; - }) - ); - return { - activityType, - fields, - }; - } - } - - public async getCloseComLeadId( - leadInfo: CloseComLead = { - companyName: "From Cal.com", - description: "Generic Lead for Contacts created by Cal.com", - } - ): Promise { - const closeComLeadNames = await this.lead.list({ query: { _fields: ["name", "id"] } }); - const searchLeadFromCalCom = closeComLeadNames.data.filter((lead) => lead.name === leadInfo.companyName); - if (searchLeadFromCalCom.length === 0) { - // No Lead exists, create it - const createdLeadFromCalCom = await this.lead.create(leadInfo); - return createdLeadFromCalCom.id; - } else { - return searchLeadFromCalCom[0].id; - } - } } export const closeComQueries = { diff --git a/packages/lib/CloseComeUtils.ts b/packages/lib/CloseComeUtils.ts new file mode 100644 index 0000000000..386f852883 --- /dev/null +++ b/packages/lib/CloseComeUtils.ts @@ -0,0 +1,206 @@ +import type { CalendarEvent } from "@calcom/types/Calendar"; + +import CloseCom, { + CloseComCustomActivityCreate, + CloseComCustomActivityFieldGet, + CloseComCustomContactFieldGet, + CloseComFieldOptions, + CloseComLead, +} from "./CloseCom"; + +export async function getCloseComContactIds( + persons: { email: string; name: string | null }[], + closeCom: CloseCom, + leadFromCalComId?: string +): Promise { + // Check if persons exist or to see if any should be created + const closeComContacts = await closeCom.contact.search({ + emails: persons.map((att) => att.email), + }); + // NOTE: If contact is duplicated in Close.com we will get more results + // messing around with the expected number of contacts retrieved + if (closeComContacts.data.length < persons.length && leadFromCalComId) { + // Create missing contacts + const personsEmails = persons.map((att) => att.email); + // Existing contacts based on persons emails: contacts may have more + // than one email, we just need the one used by the event. + const existingContactsEmails = closeComContacts.data.flatMap((cont) => + cont.emails.filter((em) => personsEmails.includes(em.email)).map((ems) => ems.email) + ); + const nonExistingContacts = persons.filter((person) => !existingContactsEmails.includes(person.email)); + const createdContacts = await Promise.all( + nonExistingContacts.map( + async (per) => + await closeCom.contact.create({ + person: per, + leadId: leadFromCalComId, + }) + ) + ); + if (createdContacts.length === nonExistingContacts.length) { + // All non existent contacts where created + return Promise.resolve( + closeComContacts.data.map((cont) => cont.id).concat(createdContacts.map((cont) => cont.id)) + ); + } else { + return Promise.reject("Some contacts were not possible to create in Close.com"); + } + } else { + return Promise.resolve(closeComContacts.data.map((cont) => cont.id)); + } +} + +export async function getCustomActivityTypeInstanceData( + event: CalendarEvent, + customFields: CloseComFieldOptions, + closeCom: CloseCom +): Promise { + // Get Cal.com generic Lead + const leadFromCalComId = await getCloseComLeadId(closeCom); + // Get Contacts ids + const contactsIds = await getCloseComContactIds(event.attendees, closeCom, leadFromCalComId); + // Get Custom Activity Type id + const customActivityTypeAndFieldsIds = await getCloseComCustomActivityTypeFieldsIds(customFields, closeCom); + // Prepare values for each Custom Activity Fields + const customActivityFieldsValues = [ + contactsIds.length > 1 ? contactsIds.slice(1) : null, // Attendee + event.startTime, // Date & Time + event.attendees[0].timeZone, // Time Zone + contactsIds[0], // Organizer + event.additionalNotes ?? null, // Additional Notes + ]; + // Preparing Custom Activity Instance data for Close.com + return Object.assign( + {}, + { + custom_activity_type_id: customActivityTypeAndFieldsIds.activityType, + lead_id: leadFromCalComId, + }, // This is to add each field as `"custom.FIELD_ID": "value"` in the object + ...customActivityTypeAndFieldsIds.fields.map((fieldId: string, index: number) => { + return { + [`custom.${fieldId}`]: customActivityFieldsValues[index], + }; + }) + ); +} + +export async function getCustomFieldsIds( + entity: keyof CloseCom["customField"], + customFields: CloseComFieldOptions, + closeCom: CloseCom, + custom_activity_type_id?: string +): Promise { + // Get Custom Activity Fields + const allFields: CloseComCustomActivityFieldGet | CloseComCustomContactFieldGet = + await closeCom.customField[entity].get({ + query: { _fields: ["name", "id"].concat(entity === "activity" ? ["custom_activity_type_id"] : []) }, + }); + let relevantFields: { [key: string]: any }[]; + if (entity === "activity") { + relevantFields = (allFields as CloseComCustomActivityFieldGet).data.filter( + (fie) => fie.custom_activity_type_id === custom_activity_type_id + ); + } else { + relevantFields = allFields.data as CloseComCustomActivityFieldGet["data"]; + } + const customFieldsNames = relevantFields.map((fie) => fie.name); + const customFieldsExist = customFields.map((cusFie) => customFieldsNames.includes(cusFie[0])); + return await Promise.all( + customFieldsExist.map(async (exist, idx) => { + if (!exist && entity !== "shared") { + const [name, type, required, multiple] = customFields[idx]; + let created: { [key: string]: any }; + if (entity === "activity" && custom_activity_type_id) { + created = await closeCom.customField[entity].create({ + name, + type, + required, + accepts_multiple_values: multiple, + editable_with_roles: [], + custom_activity_type_id, + }); + return created.id; + } else { + if (entity === "contact") { + created = await closeCom.customField[entity].create({ + name, + type, + required, + accepts_multiple_values: multiple, + editable_with_roles: [], + }); + return created.id; + } + } + } else { + const index = customFieldsNames.findIndex((val) => val === customFields[idx][0]); + if (index >= 0) { + return relevantFields[index].id; + } else { + throw Error("Couldn't find the field index"); + } + } + }) + ); +} + +export async function getCloseComCustomActivityTypeFieldsIds( + customFields: CloseComFieldOptions, + closeCom: CloseCom +) { + // Check if Custom Activity Type exists + const customActivities = await closeCom.customActivity.type.get(); + const calComCustomActivity = customActivities.data.filter((act) => act.name === "Cal.com Activity"); + if (calComCustomActivity.length > 0) { + // Cal.com Custom Activity type exist + // Get Custom Activity Type fields ids + const fields = await getCustomFieldsIds("activity", customFields, closeCom, calComCustomActivity[0].id); + return { + activityType: calComCustomActivity[0].id, + fields, + }; + } else { + // Cal.com Custom Activity type doesn't exist + // Create Custom Activity Type + const { id: activityType } = await closeCom.customActivity.type.create({ + name: "Cal.com Activity", + description: "Bookings in your Cal.com account", + }); + // Create Custom Activity Fields + const fields = await Promise.all( + customFields.map(async ([name, type, required, multiple]) => { + const creation = await closeCom.customField.activity.create({ + custom_activity_type_id: activityType, + name, + type, + required, + accepts_multiple_values: multiple, + editable_with_roles: [], + }); + return creation.id; + }) + ); + return { + activityType, + fields, + }; + } +} + +export async function getCloseComLeadId( + closeCom: CloseCom, + leadInfo: CloseComLead = { + companyName: "From Cal.com", + description: "Generic Lead for Contacts created by Cal.com", + } +): Promise { + const closeComLeadNames = await closeCom.lead.list({ query: { _fields: ["name", "id"] } }); + const searchLeadFromCalCom = closeComLeadNames.data.filter((lead) => lead.name === leadInfo.companyName); + if (searchLeadFromCalCom.length === 0) { + // No Lead exists, create it + const createdLeadFromCalCom = await closeCom.lead.create(leadInfo); + return createdLeadFromCalCom.id; + } else { + return searchLeadFromCalCom[0].id; + } +} diff --git a/packages/lib/Sendgrid.ts b/packages/lib/Sendgrid.ts deleted file mode 100644 index e0ffdefcf1..0000000000 --- a/packages/lib/Sendgrid.ts +++ /dev/null @@ -1,131 +0,0 @@ -import sendgrid from "@sendgrid/client"; -import { ClientRequest } from "@sendgrid/client/src/request"; -import { ClientResponse } from "@sendgrid/client/src/response"; - -import logger from "@calcom/lib/logger"; - -export type SendgridFieldOptions = [string, string][]; - -type SendgridUsernameResult = { - username: string; - user_id: number; -}; - -export type SendgridCustomField = { - id: string; - name: string; - field_type: string; - _metadata: { - self: string; - }; -}; - -export type SendgridContact = { - id: string; - first_name: string; - last_name: string; - email: string; -}; - -export type SendgridSearchResult = { - result: SendgridContact[]; -}; - -export type SendgridFieldDefinitions = { - custom_fields: SendgridCustomField[]; -}; - -export type SendgridNewContact = { - job_id: string; -}; - -const environmentApiKey = process.env.SENDGRID_SYNC_API_KEY || ""; - -/** - * This class to instance communicating to Sendgrid APIs requires an API Key. - * - * You can either pass to the constructor an API Key or have one defined as an - * environment variable in case the communication to Sendgrid is just for - * one account only, not configurable by any user at any moment. - */ -export default class Sendgrid { - private sendgrid: typeof sendgrid; - private log: typeof logger; - - constructor(providedApiKey = "") { - this.log = logger.getChildLogger({ prefix: [`[[lib] sendgrid`] }); - if (!providedApiKey && !environmentApiKey) throw Error("Sendgrid Api Key not present"); - this.sendgrid = sendgrid; - this.sendgrid.setApiKey(providedApiKey || environmentApiKey); - } - - public username = async () => { - const username = await this.sendgridRequest({ - url: `/v3/user/username`, - method: "GET", - }); - return username; - }; - - public async sendgridRequest(data: ClientRequest): Promise { - this.log.debug("sendgridRequest:request", data); - const results = await this.sendgrid.request(data); - this.log.debug("sendgridRequest:results", results); - if (results[1].errors) throw Error(`Sendgrid request error: ${results[1].errors}`); - return results[1]; - } - - public async getSendgridContactId(email: string) { - const search = await this.sendgridRequest({ - url: `/v3/marketing/contacts/search`, - method: "POST", - body: { - query: `email LIKE '${email}'`, - }, - }); - this.log.debug("sync:sendgrid:getSendgridContactId:search", search); - return search.result || []; - } - - public async getSendgridCustomFieldsIds(customFields: SendgridFieldOptions) { - // Get Custom Activity Fields - const allFields = await this.sendgridRequest({ - url: `/v3/marketing/field_definitions`, - method: "GET", - }); - allFields.custom_fields = allFields.custom_fields ?? []; - this.log.debug("sync:sendgrid:getCustomFieldsIds:allFields", allFields); - const customFieldsNames = allFields.custom_fields.map((fie) => fie.name); - this.log.debug("sync:sendgrid:getCustomFieldsIds:customFieldsNames", customFieldsNames); - const customFieldsExist = customFields.map((cusFie) => customFieldsNames.includes(cusFie[0])); - this.log.debug("sync:sendgrid:getCustomFieldsIds:customFieldsExist", customFieldsExist); - return await Promise.all( - customFieldsExist.map(async (exist, idx) => { - if (!exist) { - const [name, field_type] = customFields[idx]; - const created = await this.sendgridRequest({ - url: `/v3/marketing/field_definitions`, - method: "POST", - body: { - name, - field_type, - }, - }); - this.log.debug("sync:sendgrid:getCustomFieldsIds:customField:created", created); - return created.id; - } else { - const index = customFieldsNames.findIndex((val) => val === customFields[idx][0]); - if (index >= 0) { - this.log.debug( - "sync:sendgrid:getCustomFieldsIds:customField:existed", - allFields.custom_fields[index].id - ); - return allFields.custom_fields[index].id; - } else { - throw Error("Couldn't find the field index"); - } - } - }) - ); - } -} diff --git a/packages/lib/sync/services/CloseComService.ts b/packages/lib/sync/services/CloseComService.ts index 0868a2e842..bece375096 100644 --- a/packages/lib/sync/services/CloseComService.ts +++ b/packages/lib/sync/services/CloseComService.ts @@ -1,6 +1,7 @@ import { MembershipRole } from "@prisma/client"; import CloseCom, { CloseComFieldOptions, CloseComLead } from "@calcom/lib/CloseCom"; +import { getCloseComContactIds, getCloseComLeadId, getCustomFieldsIds } from "@calcom/lib/CloseComeUtils"; import logger from "@calcom/lib/logger"; import SyncServiceCore, { TeamInfoType } from "@calcom/lib/sync/ISyncService"; import ISyncService, { ConsoleUserInfoType, WebUserInfoType } from "@calcom/lib/sync/ISyncService"; @@ -19,8 +20,6 @@ const calComSharedFields: CloseComFieldOptions = [["Contact Role", "text", false const serviceName = "closecom_service"; export default class CloseComService extends SyncServiceCore implements ISyncService { - protected declare service: CloseCom; - constructor() { super(serviceName, CloseCom, logger.getChildLogger({ prefix: [`[[sync] ${serviceName}`] })); } @@ -32,16 +31,16 @@ export default class CloseComService extends SyncServiceCore implements ISyncSer ) => { this.log.debug("sync:closecom:user", { user }); // Get Cal.com Lead - const leadId = await this.service.getCloseComLeadId(leadInfo); + const leadId = await getCloseComLeadId(this.service, leadInfo); this.log.debug("sync:closecom:user:leadId", { leadId }); // Get Contacts ids: already creates contacts - const [contactId] = await this.service.getCloseComContactIds([user], leadId); + const [contactId] = await getCloseComContactIds([user], this.service, leadId); this.log.debug("sync:closecom:user:contactsIds", { contactId }); // Get Custom Contact fields ids - const customFieldsIds = await this.service.getCustomFieldsIds("contact", calComCustomContactFields); + const customFieldsIds = await getCustomFieldsIds("contact", calComCustomContactFields, this.service); this.log.debug("sync:closecom:user:customFieldsIds", { customFieldsIds }); // Get shared fields ids - const sharedFieldsIds = await this.service.getCustomFieldsIds("shared", calComSharedFields); + const sharedFieldsIds = await getCustomFieldsIds("shared", calComSharedFields, this.service); this.log.debug("sync:closecom:user:sharedFieldsIds", { sharedFieldsIds }); const allFields = customFieldsIds.concat(sharedFieldsIds); this.log.debug("sync:closecom:user:allFields", { allFields }); @@ -92,7 +91,7 @@ export default class CloseComService extends SyncServiceCore implements ISyncSer }, delete: async (webUser: WebUserInfoType) => { this.log.debug("sync:closecom:web:user:delete", { webUser }); - const [contactId] = await this.service.getCloseComContactIds([webUser]); + const [contactId] = await getCloseComContactIds([webUser], this.service); this.log.debug("sync:closecom:web:user:delete:contactId", { contactId }); if (contactId) { return this.service.contact.delete(contactId); @@ -113,21 +112,21 @@ export default class CloseComService extends SyncServiceCore implements ISyncSer }, delete: async (team: TeamInfoType) => { this.log.debug("sync:closecom:web:team:delete", { team }); - const leadId = await this.service.getCloseComLeadId({ companyName: team.name }); + const leadId = await getCloseComLeadId(this.service, { companyName: team.name }); this.log.debug("sync:closecom:web:team:delete:leadId", { leadId }); this.service.lead.delete(leadId); }, update: async (prevTeam: TeamInfoType, updatedTeam: TeamInfoType) => { this.log.debug("sync:closecom:web:team:update", { prevTeam, updatedTeam }); - const leadId = await this.service.getCloseComLeadId({ companyName: prevTeam.name }); + const leadId = await getCloseComLeadId(this.service, { companyName: prevTeam.name }); this.log.debug("sync:closecom:web:team:update:leadId", { leadId }); - this.service.lead.update(leadId, { companyName: updatedTeam.name }); + this.service.lead.update(leadId, updatedTeam); }, }, membership: { delete: async (webUser: WebUserInfoType) => { this.log.debug("sync:closecom:web:membership:delete", { webUser }); - const [contactId] = await this.service.getCloseComContactIds([webUser]); + const [contactId] = await getCloseComContactIds([webUser], this.service); this.log.debug("sync:closecom:web:membership:delete:contactId", { contactId }); if (contactId) { return this.service.contact.delete(contactId); diff --git a/packages/lib/sync/services/SendgridService.ts b/packages/lib/sync/services/SendgridService.ts index cfc26e460a..d2e679ede9 100644 --- a/packages/lib/sync/services/SendgridService.ts +++ b/packages/lib/sync/services/SendgridService.ts @@ -1,11 +1,41 @@ -import logger from "@calcom/lib/logger"; +import sendgrid from "@sendgrid/client"; +import { ClientRequest } from "@sendgrid/client/src/request"; +import { ClientResponse } from "@sendgrid/client/src/response"; -import Sendgrid, { SendgridFieldOptions, SendgridNewContact } from "../../Sendgrid"; -import ISyncService, { ConsoleUserInfoType, WebUserInfoType } from "../ISyncService"; -import SyncServiceCore from "../ISyncService"; +import logger from "@calcom/lib/logger"; +import ISyncService, { ConsoleUserInfoType, WebUserInfoType } from "@calcom/lib/sync/ISyncService"; +import SyncServiceCore from "@calcom/lib/sync/ISyncService"; + +type SendgridCustomField = { + id: string; + name: string; + field_type: string; + _metadata: { + self: string; + }; +}; + +type SendgridContact = { + id: string; + first_name: string; + last_name: string; + email: string; +}; + +type SendgridSearchResult = { + result: SendgridContact[]; +}; + +type SendgridFieldDefinitions = { + custom_fields: SendgridCustomField[]; +}; + +type SendgridNewContact = { + job_id: string; +}; // Cal.com Custom Contact Fields -const calComCustomContactFields: SendgridFieldOptions = [ +const calComCustomContactFields: [string, string][] = [ // Field name, field type ["username", "Text"], ["plan", "Text"], @@ -13,18 +43,92 @@ const calComCustomContactFields: SendgridFieldOptions = [ ["createdAt", "Date"], ]; +type SendgridRequest = (data: ClientRequest) => Promise; + +// TODO: When creating Sendgrid app, move this to the corresponding file +class Sendgrid { + constructor() { + if (!process.env.SENDGRID_API_KEY) throw Error("Sendgrid Api Key not present"); + sendgrid.setApiKey(process.env.SENDGRID_API_KEY); + return sendgrid; + } +} + const serviceName = "sendgrid_service"; export default class SendgridService extends SyncServiceCore implements ISyncService { - protected declare service: Sendgrid; constructor() { super(serviceName, Sendgrid, logger.getChildLogger({ prefix: [`[[sync] ${serviceName}`] })); } + sendgridRequest: SendgridRequest = async (data: ClientRequest) => { + this.log.debug("sendgridRequest:request", data); + const results = await this.service.request(data); + this.log.debug("sendgridRequest:results", results); + if (results[1].errors) throw Error(`Sendgrid request error: ${results[1].errors}`); + return results[1]; + }; + + getSendgridContactId = async (email: string) => { + const search = await this.sendgridRequest({ + url: `/v3/marketing/contacts/search`, + method: "POST", + body: { + query: `email LIKE '${email}'`, + }, + }); + this.log.debug("sync:sendgrid:getSendgridContactId:search", search); + return search.result || []; + }; + + getSendgridCustomFieldsIds = async () => { + // Get Custom Activity Fields + const allFields = await this.sendgridRequest({ + url: `/v3/marketing/field_definitions`, + method: "GET", + }); + allFields.custom_fields = allFields.custom_fields ?? []; + this.log.debug("sync:sendgrid:getCustomFieldsIds:allFields", allFields); + const customFieldsNames = allFields.custom_fields.map((fie) => fie.name); + this.log.debug("sync:sendgrid:getCustomFieldsIds:customFieldsNames", customFieldsNames); + const customFieldsExist = calComCustomContactFields.map((cusFie) => + customFieldsNames.includes(cusFie[0]) + ); + this.log.debug("sync:sendgrid:getCustomFieldsIds:customFieldsExist", customFieldsExist); + return await Promise.all( + customFieldsExist.map(async (exist, idx) => { + if (!exist) { + const [name, field_type] = calComCustomContactFields[idx]; + const created = await this.sendgridRequest({ + url: `/v3/marketing/field_definitions`, + method: "POST", + body: { + name, + field_type, + }, + }); + this.log.debug("sync:sendgrid:getCustomFieldsIds:customField:created", created); + return created.id; + } else { + const index = customFieldsNames.findIndex((val) => val === calComCustomContactFields[idx][0]); + if (index >= 0) { + this.log.debug( + "sync:sendgrid:getCustomFieldsIds:customField:existed", + allFields.custom_fields[index].id + ); + return allFields.custom_fields[index].id; + } else { + throw Error("Couldn't find the field index"); + } + } + }) + ); + }; + upsert = async (user: WebUserInfoType | ConsoleUserInfoType) => { this.log.debug("sync:sendgrid:user", user); // Get Custom Contact fields ids - const customFieldsIds = await this.service.getSendgridCustomFieldsIds(calComCustomContactFields); + const customFieldsIds = await this.getSendgridCustomFieldsIds(); this.log.debug("sync:sendgrid:user:customFieldsIds", customFieldsIds); const lastBooking = "email" in user ? await this.getUserLastBooking(user) : null; this.log.debug("sync:sendgrid:user:lastBooking", lastBooking); @@ -55,7 +159,7 @@ export default class SendgridService extends SyncServiceCore implements ISyncSer ), }; this.log.debug("sync:sendgrid:contact:contactData", contactData); - const newContact = await this.service.sendgridRequest({ + const newContact = await this.sendgridRequest({ url: `/v3/marketing/contacts`, method: "PUT", body: { @@ -81,9 +185,9 @@ export default class SendgridService extends SyncServiceCore implements ISyncSer return this.upsert(webUser); }, delete: async (webUser: WebUserInfoType) => { - const [contactId] = await this.service.getSendgridContactId(webUser.email); + const [contactId] = await this.getSendgridContactId(webUser.email); if (contactId) { - return this.service.sendgridRequest({ + return this.sendgridRequest({ url: `/v3/marketing/contacts`, method: "DELETE", qs: { diff --git a/packages/prisma/seed-app-store.config.json b/packages/prisma/seed-app-store.config.json index 0c8594a081..4b468c0f02 100644 --- a/packages/prisma/seed-app-store.config.json +++ b/packages/prisma/seed-app-store.config.json @@ -101,11 +101,5 @@ "categories": ["video"], "slug": "sirius_video", "type": "sirius_video_video" - }, - { - "dirName": "sendgrid", - "categories": ["other"], - "slug": "sendgrid", - "type": "sendgrid_other_calendar" } ] diff --git a/packages/prisma/seed-app-store.ts b/packages/prisma/seed-app-store.ts index 13121779bd..2384ec9297 100644 --- a/packages/prisma/seed-app-store.ts +++ b/packages/prisma/seed-app-store.ts @@ -240,8 +240,6 @@ export default async function main() { } // No need to check if environment variable is present, the API Key is set up by the user, not the system await createApp("closecom", "closecomothercalendar", ["other"], "closecom_other_calendar"); - // No need to check if environment variable is present, the API Key is set up by the user, not the system - await createApp("sendgrid", "sendgridothercalendar", ["other"], "sendgrid_other_calendar"); await createApp("wipe-my-cal", "wipemycalother", ["other"], "wipemycal_other"); if (process.env.GIPHY_API_KEY) { await createApp("giphy", "giphy", ["other"], "giphy_other", { diff --git a/turbo.json b/turbo.json index 67b087399d..e1dbd2ae1d 100644 --- a/turbo.json +++ b/turbo.json @@ -182,7 +182,6 @@ "$CI", "$CLOSECOM_API_KEY", "$SENDGRID_API_KEY", - "$SENDGRID_SYNC_API_KEY", "$SENDGRID_EMAIL", "$CRON_API_KEY", "$DAILY_API_KEY", @@ -230,6 +229,8 @@ "$SAML_ADMINS", "$SAML_DATABASE_URL", "$SEND_FEEDBACK_EMAIL", + "$SENTRY_DSN", + "$NEXT_PUBLIC_SENTRY_DSN", "$SLACK_CLIENT_ID", "$SLACK_CLIENT_SECRET", "$SLACK_SIGNING_SECRET", diff --git a/yarn.lock b/yarn.lock index 2144855446..f9cf993085 100644 --- a/yarn.lock +++ b/yarn.lock @@ -90,16 +90,16 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== -"@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== - "@babel/compat-data@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== +"@babel/compat-data@^7.19.3": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" + integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== + "@babel/compat-data@^7.20.0": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" @@ -192,20 +192,20 @@ semver "^6.3.0" "@babel/core@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" - integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" + integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.10" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.10" - "@babel/types" "^7.17.10" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.2" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.1" + "@babel/parser" "^7.20.2" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -233,21 +233,21 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/core@^7.19.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" - integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== +"@babel/core@^7.18.13", "@babel/core@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" + integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.2" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.1" - "@babel/parser" "^7.20.2" + "@babel/generator" "^7.19.6" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helpers" "^7.19.4" + "@babel/parser" "^7.19.6" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -281,15 +281,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" - integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== - dependencies: - "@babel/types" "^7.17.10" - "@jridgewell/gen-mapping" "^0.1.0" - jsesc "^2.5.1" - "@babel/generator@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" @@ -317,22 +308,24 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.6.tgz#9e481a3fe9ca6261c972645ae3904ec0f9b34a1d" + integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== + dependencies: + "@babel/types" "^7.19.4" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.20.1", "@babel/generator@^7.20.2": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" - integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.3.tgz#e58c9ae2f7bf7fdf4899160cf1e04400a82cd641" + integrity sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A== dependencies: "@babel/types" "^7.20.2" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -368,16 +361,6 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" - integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" - semver "^6.3.0" - "@babel/helper-compilation-targets@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" @@ -388,6 +371,16 @@ browserslist "^4.20.2" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== + dependencies: + "@babel/compat-data" "^7.19.3" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + "@babel/helper-compilation-targets@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" @@ -595,6 +588,20 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" + "@babel/helper-module-transforms@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" @@ -676,6 +683,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-simple-access@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== + dependencies: + "@babel/types" "^7.19.4" + "@babel/helper-simple-access@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" @@ -767,7 +781,7 @@ "@babel/traverse" "^7.17.0" "@babel/types" "^7.17.0" -"@babel/helpers@^7.17.8", "@babel/helpers@^7.17.9": +"@babel/helpers@^7.17.8": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== @@ -785,6 +799,15 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helpers@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" + integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.4" + "@babel/types" "^7.19.4" + "@babel/helpers@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" @@ -827,11 +850,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.8.tgz#822146080ac9c62dac0823bb3489622e0bc1cbdf" integrity sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA== -"@babel/parser@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" - integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== - "@babel/parser@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" @@ -847,6 +865,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== +"@babel/parser@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" + integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== + "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": version "7.20.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" @@ -1116,7 +1139,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.7": +"@babel/plugin-syntax-jsx@^7.12.13": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== @@ -1394,28 +1417,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": +"@babel/plugin-transform-react-jsx-development@^7.16.7", "@babel/plugin-transform-react-jsx-development@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" -"@babel/plugin-transform-react-jsx-self@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" - integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-self@^7.18.6": +"@babel/plugin-transform-react-jsx-self@^7.16.7", "@babel/plugin-transform-react-jsx-self@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== @@ -1423,11 +1432,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-source@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" - integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" + integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-transform-react-jsx-source@^7.18.6": version "7.18.6" @@ -1436,13 +1445,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-source@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" - integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz#2721e96d31df96e3b7ad48ff446995d26bc028ff" @@ -1454,16 +1456,16 @@ "@babel/plugin-syntax-jsx" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" - integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== +"@babel/plugin-transform-react-jsx@^7.17.3": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" "@babel/plugin-transform-react-jsx@^7.18.10": version "7.18.10" @@ -1476,17 +1478,6 @@ "@babel/plugin-syntax-jsx" "^7.18.6" "@babel/types" "^7.18.10" -"@babel/plugin-transform-react-jsx@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" - "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" @@ -1847,22 +1838,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" - integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.10" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.10" - "@babel/types" "^7.17.10" - debug "^4.1.0" - globals "^11.1.0" - "@babel/traverse@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" @@ -1911,6 +1886,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" + integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.6" + "@babel/types" "^7.19.4" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" @@ -1952,14 +1943,6 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" - integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - "@babel/types@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" @@ -1977,7 +1960,16 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2": +"@babel/types@^7.19.0", "@babel/types@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" + integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@babel/types@^7.20.0", "@babel/types@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== @@ -2262,6 +2254,11 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + "@eslint/eslintrc@^1.0.5", "@eslint/eslintrc@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" @@ -3595,14 +3592,6 @@ magic-string "^0.26.1" react-docgen-typescript "^2.1.1" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -3612,16 +3601,16 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "@jridgewell/resolve-uri@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== - "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -3635,6 +3624,11 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" @@ -3672,6 +3666,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.14": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -3841,10 +3843,10 @@ dependencies: webpack-bundle-analyzer "4.3.0" -"@next/env@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.3.tgz#26c8e8f0f65da382d1a537cb8df30d63fc5d828a" - integrity sha512-H2pKuOasV9RgvVaWosB2rGSNeQShQpiDaF4EEjLyagIc3HwqdOw2/VAG/8Lq+adOwPv2P73O1hulTNad3k5MDw== +"@next/env@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.1.tgz#18266bd92de3b4aa4037b1927aa59e6f11879260" + integrity sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg== "@next/eslint-plugin-next@12.2.5": version "12.2.5" @@ -3853,70 +3855,70 @@ dependencies: glob "7.1.7" -"@next/swc-android-arm-eabi@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.3.tgz#1173a8e9ddb92c9d2d1a4fc29c5397f3d815c1ef" - integrity sha512-5O/ZIX6hlIRGMy1R2f/8WiCZ4Hp4WTC0FcTuz8ycQ28j/mzDnmzjVoayVVr+ZmfEKQayFrRu+vxHjFyY0JGQlQ== +"@next/swc-android-arm-eabi@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz#b15ce8ad376102a3b8c0f3c017dde050a22bb1a3" + integrity sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ== -"@next/swc-android-arm64@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.3.tgz#8e49a1486ff1c5e6f4760ad31a2fa3cfcc5a3329" - integrity sha512-2QWreRmlxYRDtnLYn+BI8oukHwcP7W0zGIY5R2mEXRjI4ARqCLdu8RmcT9Vemw7RfeAVKA/4cv/9PY0pCcQpNA== +"@next/swc-android-arm64@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz#85d205f568a790a137cb3c3f720d961a2436ac9c" + integrity sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q== -"@next/swc-darwin-arm64@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.3.tgz#92618ffea1d0d128db0787854afe368b5976837a" - integrity sha512-GtZdDLerM+VToCMFp+W+WhnT6sxHePQH4xZZiYD/Y8KFiwHbDRcJr2FPG0bAJnGNiSvv/QQnBq74wjZ9+7vhcQ== +"@next/swc-darwin-arm64@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz#b105457d6760a7916b27e46c97cb1a40547114ae" + integrity sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg== -"@next/swc-darwin-x64@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.3.tgz#76a5a496cc7ead3cc02aaca84d1ed02dff86e029" - integrity sha512-gRYvTKrRYynjFQUDJ+upHMcBiNz0ii0m7zGgmUTlTSmrBWqVSzx79EHYT7Nn4GWHM+a/W+2VXfu+lqHcJeQ9gQ== +"@next/swc-darwin-x64@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz#6947b39082271378896b095b6696a7791c6e32b1" + integrity sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA== -"@next/swc-freebsd-x64@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.3.tgz#d546fb7060adf0cd27c6a8c1abca5c58f62c8f06" - integrity sha512-r+GLATzCjjQI82bgrIPXWEYBwZonSO64OThk5wU6HduZlDYTEDxZsFNoNoesCDWCgRrgg+OXj7WLNy1WlvfX7w== +"@next/swc-freebsd-x64@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz#2b6c36a4d84aae8b0ea0e0da9bafc696ae27085a" + integrity sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q== -"@next/swc-linux-arm-gnueabihf@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.3.tgz#525f451e6e1d134e064707c5c761b6d5d6bb3c7e" - integrity sha512-juvRj1QX9jmQScL4nV0rROtYUFgWP76zfdn1fdfZ2BhvwUugIAq8x+jLVGlnXKUhDrP9+RrAufqXjjVkK+uBxA== +"@next/swc-linux-arm-gnueabihf@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz#6e421c44285cfedac1f4631d5de330dd60b86298" + integrity sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w== -"@next/swc-linux-arm64-gnu@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.3.tgz#13aa5dfeef0de52eac1220ab22cabdee6447bb3a" - integrity sha512-hzinybStPB+SzS68hR5rzOngOH7Yd/jFuWGeg9qS5WifYXHpqwGH2BQeKpjVV0iJuyO9r309JKrRWMrbfhnuBA== +"@next/swc-linux-arm64-gnu@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz#8863f08a81f422f910af126159d2cbb9552ef717" + integrity sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ== -"@next/swc-linux-arm64-musl@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.3.tgz#4bdae82882c1e31a1008f20f544b1954a21d385f" - integrity sha512-oyfQYljCwf+9zUu1YkTZbRbyxmcHzvJPMGOxC3kJOReh3kCUoGcmvAxUPMtFD6FSYjJ+eaog4+2IFHtYuAw/bQ== +"@next/swc-linux-arm64-musl@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz#0038f07cf0b259d70ae0c80890d826dfc775d9f3" + integrity sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg== -"@next/swc-linux-x64-gnu@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.3.tgz#0697b1fc60dc4a86a7260f60e983d9064a331b2c" - integrity sha512-epv4FMazj/XG70KTTnrZ0H1VtL6DeWOvyHLHYy7f5PdgDpBXpDTFjVqhP8NFNH8HmaDDdeL1NvQD07AXhyvUKA== +"@next/swc-linux-x64-gnu@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz#c66468f5e8181ffb096c537f0dbfb589baa6a9c1" + integrity sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA== -"@next/swc-linux-x64-musl@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.3.tgz#af012e65035fcd7cc3855ce90b4095d2c7b879a5" - integrity sha512-bG5QODFy59XnSFTiPyIAt+rbPdphtvQMibtOVvyjwIwsBUw7swJ6k+6PSPVYEYpi6SHzi3qYBsro39ayGJKQJg== +"@next/swc-linux-x64-musl@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz#c6269f3e96ac0395bc722ad97ce410ea5101d305" + integrity sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg== -"@next/swc-win32-arm64-msvc@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.3.tgz#bf717c96ce17f63840e3cbb023725cb3872ed0b3" - integrity sha512-FbnT3reJ3MbTJ5W0hvlCCGGVDSpburzT5XGC9ljBJ4kr+85iNTLjv7+vrPeDdwHEqtGmdZgnabkLVCI4yFyCag== +"@next/swc-win32-arm64-msvc@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz#83c639ee969cee36ce247c3abd1d9df97b5ecade" + integrity sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw== -"@next/swc-win32-ia32-msvc@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.3.tgz#f434bc4bd952af77070868b5fa32ced85b52a646" - integrity sha512-M/fKZC2tMGWA6eTsIniNEBpx2prdR8lIxvSO3gv5P6ymZOGVWCvEMksnTkPAjHnU6d8r8eCiuGKm3UNo7zCTpQ== +"@next/swc-win32-ia32-msvc@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz#52995748b92aa8ad053440301bc2c0d9fbcf27c2" + integrity sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA== -"@next/swc-win32-x64-msvc@12.3.3": - version "12.3.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.3.tgz#1b412e9e15550680e1fdba70daa8b6ddcc75a035" - integrity sha512-Ku9mfGwmNtk44o4B/jEWUxBAT4tJ3S7QbBMLJdL1GmtRZ05LGL36OqWjLvBPr8dFiHOQQbYoAmYfQw7zeGypYA== +"@next/swc-win32-x64-msvc@12.3.1": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz#27d71a95247a9eaee03d47adee7e3bd594514136" + integrity sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -5021,14 +5023,14 @@ "@sendgrid/client" "^7.7.0" "@sendgrid/helpers" "^7.7.0" -"@sentry/browser@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.18.0.tgz#3eae6bb07705ce2a05bff898effc6ece6cc4087b" - integrity sha512-dFNJshI5I9F2ff8X9dyN1b8UIx3h+62DOtigo+Vg2RfjplEX+rnzRWfV5QU5YBSH3AbDE3WXHuPWuYTbWg9i9w== +"@sentry/browser@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.17.4.tgz#2e4ad09180905929b823d01e2a029f10933c0a03" + integrity sha512-cNLQ/6ea0KOZyLKXGLTdgfqWYdg43+T/uF9D/hmc6kp/5qXm2dR3FcFRZX6OicaENM3dXvSoBIF6bSWmcszRtQ== dependencies: - "@sentry/core" "7.18.0" - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/core" "7.17.4" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" tslib "^1.9.3" "@sentry/cli@^1.74.6": @@ -5044,89 +5046,89 @@ proxy-from-env "^1.1.0" which "^2.0.2" -"@sentry/core@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.18.0.tgz#9fe4c6f45086c20ad45a6357a33381a500a8b704" - integrity sha512-erDEMGM+9Msvz/fQaKlYHD8vXDs/Mv5trZc6rlS/gnlaIPQQ8cALH7UdH2UO0eoCLH3/pEYTsa4Qh8AMz6Y86w== +"@sentry/core@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.17.4.tgz#62686e1b2baf4e7ba3d9ca57d91d2dfc643b8250" + integrity sha512-U3ABSJBKGK8dJ01nEG2+qNOb6Wv7U3VqoajiZxfV4lpPWNFGCoEhiTytxBlFTOCmdUH8209zSZiWJZaDLy+TSA== dependencies: - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" tslib "^1.9.3" -"@sentry/integrations@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.18.0.tgz#6ebaa9973cbfbc8f0c47030293f44f4791b10a8b" - integrity sha512-vmJWfybbanfHoy47U8IU50FuEN3GwywP/jFvh7Owll9GuPP9B6spmndZwK+raTisDoDOp3201uC1Bfx0cjl4MQ== +"@sentry/integrations@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.17.4.tgz#facdc4abb1d4714175c7d66bab634a898cc7eead" + integrity sha512-9vL0RRLuMnj0mj61THgRhDUCgTGYbRoCT6HmLGrErHjyTG3d7lUgUwTBQPgw9qYLss1uLKoEtRvcxgtW7ef0BA== dependencies: - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" localforage "^1.8.1" tslib "^1.9.3" "@sentry/nextjs@^7.17.3": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.18.0.tgz#5f4d643afc74f470fb93ba2782b07e9075b0aba7" - integrity sha512-VtD7hS/088IZW0qqUipltVawQiKmlHMv5mGrge6vVwliN+tzFNXrf+UrkTK/CZO3+92TvNwb+zxk5XNHRSknWQ== + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.17.4.tgz#9c6d71d17e37da3fcbe753a374e93307a56dbf02" + integrity sha512-l4aHhkYjiC49yvvu/iG0CZGpAfmWdVQ4PlcnzqO9XY40So1LixY7idJEDefqx6LSZ1+VadpZT0o6iRwHfuOllQ== dependencies: "@rollup/plugin-sucrase" "4.0.4" "@rollup/plugin-virtual" "3.0.0" - "@sentry/core" "7.18.0" - "@sentry/integrations" "7.18.0" - "@sentry/node" "7.18.0" - "@sentry/react" "7.18.0" - "@sentry/tracing" "7.18.0" - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/core" "7.17.4" + "@sentry/integrations" "7.17.4" + "@sentry/node" "7.17.4" + "@sentry/react" "7.17.4" + "@sentry/tracing" "7.17.4" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" "@sentry/webpack-plugin" "1.20.0" chalk "3.0.0" rollup "2.78.0" tslib "^1.9.3" -"@sentry/node@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.18.0.tgz#0af74872b6cbb54e40d1dd024aa396be8bf95ac4" - integrity sha512-bc/cta6hnyqaGKECl2Ycffb7L6b+Xy4wzDR5j49FepCCYkXC3CcR/879AIf3sb0/TXP2QMIyfGN8TKlHigX6bA== +"@sentry/node@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.17.4.tgz#647ebcbd7228e5fa326dc3f95aceab34771205d3" + integrity sha512-cR+Gsir9c/tzFWxvk4zXkMQy6tNRHEYixHrb88XIjZVYDqDS9l2/bKs5nJusdmaUeLtmPp5Et2o7RJyS7gvKTQ== dependencies: - "@sentry/core" "7.18.0" - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/core" "7.17.4" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/react@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.18.0.tgz#2b032f3f382d1770d77c015cc4a61677b709ff8c" - integrity sha512-Cc3roRKtTT/5s7BJmQi2+KdmExWxLwRTpYvGtvDdzARXAnTr2BQUBLe7WZUE/bEnXFCUAc/yHc2Ziddvn2GQ1g== +"@sentry/react@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.17.4.tgz#1d2c752841ace0561043be6a863de9fc7437f64c" + integrity sha512-Hw8lgeCgUthgVQ5OG24/iZWGNXnxodVfCmfngeIfqUWeFgQUae1V833GNkYZCiE5j2yjNVh3LL2bXA8PnvMCEg== dependencies: - "@sentry/browser" "7.18.0" - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/browser" "7.17.4" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/tracing@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.18.0.tgz#2a3cbe770cb3483a2611dfadc5a669cbbe9e4c64" - integrity sha512-1vxCpsAKvrr9yZe8zRE+Wp8RyNjrhUqBUEc2Z69bVHmVtvIygqEiqjrqds+98PZZsqkdC3hVuUJnI9TmqzeG3g== +"@sentry/tracing@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.17.4.tgz#1254f4eb7397e1134248de1dade33d2fec864005" + integrity sha512-9Fz6DI16ddnd970mlB5MiCNRSmSXp4SVZ1Yv3L22oS3kQeNxjBTE+htYNwJzSPrQp9aL/LqTYwlnrCy24u9XQA== dependencies: - "@sentry/core" "7.18.0" - "@sentry/types" "7.18.0" - "@sentry/utils" "7.18.0" + "@sentry/core" "7.17.4" + "@sentry/types" "7.17.4" + "@sentry/utils" "7.17.4" tslib "^1.9.3" -"@sentry/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.18.0.tgz#8b0eacd19cc9bcd1f14ca5dcaf7065ebd3186632" - integrity sha512-bOnyoK1S1chPJ+dAeWJo0srxZ9U48WE5dZFtvKeXoog6JNHY3nqAR/P/uxh9djB4bbwQRMdnGk1zm0bxhOOC6w== +"@sentry/types@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.17.4.tgz#476522bc988989101e7aee9eee3c3f8f16fa59ea" + integrity sha512-QJj8vO4AtxuzQfJIzDnECSmoxwnS+WJsm1Ta2Cwdy+TUCBJyWpW7aIJJGta76zb9gNPGb3UcAbeEjhMJBJeRMQ== -"@sentry/utils@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.18.0.tgz#ede662acf8ac9af9a973d58e277d7afa77721b6c" - integrity sha512-nIIIF9FZ2rrw9OFIAfnSEK6TbHLii3ZtahVdcw6Jk9LscL2HMkgdmgroiNfFxhGYNqfWsaxVgMW+IdnkrHsqXQ== +"@sentry/utils@7.17.4": + version "7.17.4" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.17.4.tgz#b8f4fb6a329765b97668b34f6d397e8de2169fef" + integrity sha512-ioG0ANy8uiWzig82/e7cc+6C9UOxkyBzJDi1luoQVDH6P0/PvM8GzVU+1iUVUipf8+OL1Jh09GrWnd5wLm3XNQ== dependencies: - "@sentry/types" "7.18.0" + "@sentry/types" "7.17.4" tslib "^1.9.3" "@sentry/webpack-plugin@1.20.0": @@ -5570,9 +5572,9 @@ util-deprecate "^1.0.2" "@storybook/builder-vite@^0.2.4": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-0.2.5.tgz#b3996a5f28ffd1ce2ca18aff98cf3ed9d4551927" - integrity sha512-0PktEaYsbR6gGE/YDkW/tI1VxVnaPNZpHGpiWfDU7c5hjCajWYzdFTgHOwcXT8tiTs+WN/rvoCPT2iAhSCcHIw== + version "0.2.4" + resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-0.2.4.tgz#61b33584a64df01781dd029bea3ff30c6e17b172" + integrity sha512-SYAIheTva4Dpqi7Xs+H6oqPOpVA3xu+1k+OnLPKfgR6sVEnLHvPKn80n3NOKdqXoXkO0ou9OVnZaS2A55vnx+A== dependencies: "@joshwooding/vite-plugin-react-docgen-typescript" "0.0.5" "@storybook/core-common" "^6.4.3" @@ -7645,16 +7647,16 @@ react-refresh "^0.14.0" "@vitejs/plugin-react@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz#1b9f63b8b6bc3f56258d20cd19b33f5cc761ce6e" - integrity sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz#4c99df15e71d2630601bd3018093bdc787d40e55" + integrity sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA== dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-jsx" "^7.19.0" + "@babel/core" "^7.18.13" + "@babel/plugin-transform-react-jsx" "^7.18.10" "@babel/plugin-transform-react-jsx-development" "^7.18.6" "@babel/plugin-transform-react-jsx-self" "^7.18.6" - "@babel/plugin-transform-react-jsx-source" "^7.19.6" - magic-string "^0.26.7" + "@babel/plugin-transform-react-jsx-source" "^7.18.6" + magic-string "^0.26.2" react-refresh "^0.14.0" "@wagmi/core@^0.5.4": @@ -8861,12 +8863,12 @@ autolinker@^3.11.0: tslib "^2.3.0" autoprefixer@^10.4.12: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + version "10.4.12" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" + integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q== dependencies: browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" + caniuse-lite "^1.0.30001407" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -9910,10 +9912,10 @@ caniuse-lite@^1.0.30001370: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz#3d2159bf5a8f9ca093275b0d3ecc717b00f27b67" integrity sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA== -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001426: - version "1.0.30001431" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" - integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001407: + version "1.0.30001425" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz#52917791a453eb3265143d2cd08d80629e82c735" + integrity sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw== capture-exit@^2.0.0: version "2.0.0" @@ -10188,9 +10190,9 @@ clean-css@^4.2.3: source-map "~0.6.0" clean-css@^5.2.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" - integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== dependencies: source-map "~0.6.0" @@ -11841,18 +11843,18 @@ enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.7.0: - version "5.9.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" - integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== +enhanced-resolve@^5.10.0, enhanced-resolve@^5.9.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.9.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== +enhanced-resolve@^5.7.0: + version "5.9.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" + integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -12046,131 +12048,132 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.1" ext "^1.1.2" -esbuild-android-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.31.tgz#4b7dfbbeee62b3495ba78220b85fb590eb68d5bf" - integrity sha512-MYkuJ91w07nGmr4EouejOZK2j/f5TCnsKxY8vRr2+wpKKfHD1LTJK28VbZa+y1+AL7v1V9G98ezTUwsV3CmXNw== +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== -esbuild-android-arm64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.31.tgz#24c3d693924e044fb0d23206c3e627502b10b930" - integrity sha512-0rkH/35s7ZVcsw6nS0IAkR0dekSbjZGWdlOAf3jV0lGoPqqw0x6/TmaV9w7DQgUERTH1ApmPlpAMU4kVkCq9Jg== +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== -esbuild-darwin-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.31.tgz#285fbdb6dc74d4410f43dee59e6a14ebff82a9d7" - integrity sha512-kP6xPZHxtJa36Hb0jC05L3VzQSZBW2f3bpnQS20czXTRGEmM2GDiYpGdI5g2QYaw6vC4PYXjnigq8usd9g9jnQ== +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== -esbuild-darwin-arm64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.31.tgz#b39c471a8134ce2c7811eb96fab9c500b256261c" - integrity sha512-1ZMog4hkNsdBGtDDtsftUqX6S9N52gEx4vX5aVehsSptgoBFIar1XrPiBTQty7YNH+bJasTpSVaZQgElCVvPKQ== +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== -esbuild-freebsd-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.31.tgz#7ca700ef60ae12154bae63094ad41b21c6ae1a23" - integrity sha512-Zo0BYj7QpVFWoUpkv6Ng0RO2eJ4zk/WDaHMO88+jr5HuYmxsOre0imgwaZVPquTuJnCvL1G48BFucJ3tFflSeQ== +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== -esbuild-freebsd-arm64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.31.tgz#f793085c7184fcd08649b8d185edc5c2ce112e82" - integrity sha512-t85bS6jbRpmdjr4pdr/FY/fpx8lo1vv9S7BAs2EsXKJQhRDMIiC3QW+k2acYJoRuqirlvJcJVFQGCq/PfyC1kA== +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== -esbuild-linux-32@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.31.tgz#cac97ec7da6fbde0c21dbe08babd0d2a034f317d" - integrity sha512-XYtOk/GodSkv+UOYVwryGpGPuFnszsMvRMKq6cIUfFfdssHuKDsU9IZveyCG44J106J39ABenQ5EetbYtVJHUw== +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== -esbuild-linux-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.31.tgz#ec94cd5228e6777d2feb3c24a1fe1cbf8817d6da" - integrity sha512-Zf9CZxAxaXWHLqCg/QZ/hs0RU0XV3IBxV+ENQzy00S4QOTnZAvSLgPciILHHrVJ0lPIlb4XzAqlLM5y6iI2LIw== +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== -esbuild-linux-arm64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.31.tgz#d119188fccd6384db5c703de24c46dacaee3e9e8" - integrity sha512-V/H0tv+xpQ9IOHM+o85oCKNNidIEc5CcnDWl0V+hPd2F03dqdbFkWPBGphx8rD4JSQn6UefUQ1iH7y1qIzO8Fw== +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== -esbuild-linux-arm@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.31.tgz#63e10846886901e5632a591d44160f95c5d12ba7" - integrity sha512-RpiaeHPRlgCCDskxoyIsI49BhcDtZ4cl8+SLffizDm0yMNWP538SUg0ezQ2TTOPj3/svaGIbkRDwYtAon0Sjkg== +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== -esbuild-linux-mips64le@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.31.tgz#1cd44f72cde6489a5d6deea7c54efa6f3d6590ee" - integrity sha512-9/oBfAckInRuUg6AEgdCLLn6KJ6UOJDOLmUinTsReVSg6AfV6wxYQJq9iQM2idRogP7GUpomJ+bvCdWXpotQRQ== +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== -esbuild-linux-ppc64le@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.31.tgz#3b5ccc05e5b8ef5c494f30a61fdd27811d2bbeeb" - integrity sha512-NMcb14Pg+8q8raGkzor9/R3vQwKzgxE3694BtO2SDLBwJuL2C1dQ1ZtM1t7ZvArQBgT8RiZVxb0/3fD+qGNk7g== +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== -esbuild-linux-riscv64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.31.tgz#d74ca78c8ed1d9b40bc907a9e3ef6e83fc06189c" - integrity sha512-l13yvmsVfawAnoYfcpuvml+nTlrOmtdceXYufSkXl2DOb0JKcuR6ARlAzuQCDcpo49SOJy1cCxpwlOIsUQBfzA== +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== -esbuild-linux-s390x@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.31.tgz#1bd547b8b027e323b77a838d265cb56ece2543af" - integrity sha512-GIwV9mY3koYja9MCSkKLk1P7rj+MkPV0UsGsZ575hEcIBrXeKN9jBi6X/bxDDPEN/SUAH35cJhBNrZU4x9lEfg== +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== -esbuild-netbsd-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.31.tgz#964a45dbad4fac92aa0a15056e38a182735bd6c6" - integrity sha512-bJ+pyLvKQm+Obp5k7/Wk8e9Gdkls56F1aiI3uptoIfOIUqsZImH7pDyTrSufwqsFp62kO9LRuwXnjDwQtPyhFQ== +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== -esbuild-openbsd-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.31.tgz#7d2a1d46450321b0459263d3e7072e6d3924ce46" - integrity sha512-NRAAPPca05H9j9Xab0kVXK0V6/pyZGGy8d2Y8KS0BMwWEydlD4KCJDmH8/7bWCKYLRGOOCE9/GPBJyPWHFW3sg== +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== -esbuild-sunos-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.31.tgz#3b3e4363951cd1dda14a14fee6d94ca426108e0c" - integrity sha512-9uA+V8w9Eehu4ldb95lPWdgCMcMO5HH6pXmfkk5usn3JsSZxKdLKsXB4hYgP80wscZvVYXJl2G+KNxsUTfPhZw== +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== -esbuild-windows-32@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.31.tgz#997026a41c04535bfb7c014a0458940b49145820" - integrity sha512-VGdncQTqoxD9q3v/dk0Yugbmx2FzOkcs0OemBYc1X9KXOLQYH0uQbLJIckZdZOC3J+JKSExbYFrzYCOwWPuNyA== +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== -esbuild-windows-64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.31.tgz#5d4b0ea686c9b60036303b3415c472f2761bdafc" - integrity sha512-v/2ye5zBqpmCzi3bLCagStbNQlnOsY7WtMrD2Q0xZxeSIXONxji15KYtVee5o7nw4lXWbQSS1BL8G6BBMvtq4A== +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== -esbuild-windows-arm64@0.14.31: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.31.tgz#4f3b9fc34c4a33abbd0171df6cbb657ccbdbfc67" - integrity sha512-RXeU42FJoG1sriNHg73h4S+5B7L/gw+8T7U9u8IWqSSEbY6fZvBh4uofugiU1szUDqqP00GHwZ09WgYe3lGZiw== +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== esbuild@^0.14.27: - version "0.14.31" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.31.tgz#f7d0db114edc615f66d84972ee9fbd2b267f4029" - integrity sha512-QA0fUM13+JZzcvg1bdrhi7wo8Lr5IRHA9ypNn2znqxGqb66dSK6pAh01TjyBOhzZGazPQJZ1K26VrCAQJ715qA== + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== optionalDependencies: - esbuild-android-64 "0.14.31" - esbuild-android-arm64 "0.14.31" - esbuild-darwin-64 "0.14.31" - esbuild-darwin-arm64 "0.14.31" - esbuild-freebsd-64 "0.14.31" - esbuild-freebsd-arm64 "0.14.31" - esbuild-linux-32 "0.14.31" - esbuild-linux-64 "0.14.31" - esbuild-linux-arm "0.14.31" - esbuild-linux-arm64 "0.14.31" - esbuild-linux-mips64le "0.14.31" - esbuild-linux-ppc64le "0.14.31" - esbuild-linux-riscv64 "0.14.31" - esbuild-linux-s390x "0.14.31" - esbuild-netbsd-64 "0.14.31" - esbuild-openbsd-64 "0.14.31" - esbuild-sunos-64 "0.14.31" - esbuild-windows-32 "0.14.31" - esbuild-windows-64 "0.14.31" - esbuild-windows-arm64 "0.14.31" + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" escalade@^3.1.1: version "3.1.1" @@ -17323,13 +17326,6 @@ magic-string@^0.26.1, magic-string@^0.26.2: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.26.7: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -17720,13 +17716,20 @@ mem@^8.1.1: map-age-cleaner "^0.1.3" mimic-fn "^3.1.0" -memfs@^3.1.2, memfs@^3.2.2: +memfs@^3.1.2: version "3.4.7" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== dependencies: fs-monkey "^1.0.3" +memfs@^3.2.2: + version "3.4.9" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.9.tgz#403bb953776d72fef4e39e1197a25ffa156d143a" + integrity sha512-3rm8kbrzpUGRyPKSGuk387NZOwQ90O4rI9tsWQkzNW7BLSnKGp23RsEsKK8N8QVCrtJoAMqy3spxHC4os4G6PQ== + dependencies: + fs-monkey "^1.0.3" + "memoize-one@>=3.1.1 <6", memoize-one@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" @@ -18783,30 +18786,30 @@ next-validations@^0.2.0: integrity sha512-92pR14MPTTx0ynlvYH2TwMf7WiGiznNL/l0dtZyKPw3x48rcMhwEZrP1ZmsMJwzp5D+U+sY2deexeLWC8rlNtQ== next@^12.3.1: - version "12.3.3" - resolved "https://registry.yarnpkg.com/next/-/next-12.3.3.tgz#c1286fc24e378b0b0279ef205db7d8dd994dcd79" - integrity sha512-Rx2Y6Wl5R8E77NOfBupp/B9OPCklqfqD0yN2+rDivhMjd6hjVFH5n0WTDI4PWwDmZsdNcYt6NV85kJ3PLR+eNQ== + version "12.3.1" + resolved "https://registry.yarnpkg.com/next/-/next-12.3.1.tgz#127b825ad2207faf869b33393ec8c75fe61e50f1" + integrity sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw== dependencies: - "@next/env" "12.3.3" + "@next/env" "12.3.1" "@swc/helpers" "0.4.11" caniuse-lite "^1.0.30001406" postcss "8.4.14" styled-jsx "5.0.7" use-sync-external-store "1.2.0" optionalDependencies: - "@next/swc-android-arm-eabi" "12.3.3" - "@next/swc-android-arm64" "12.3.3" - "@next/swc-darwin-arm64" "12.3.3" - "@next/swc-darwin-x64" "12.3.3" - "@next/swc-freebsd-x64" "12.3.3" - "@next/swc-linux-arm-gnueabihf" "12.3.3" - "@next/swc-linux-arm64-gnu" "12.3.3" - "@next/swc-linux-arm64-musl" "12.3.3" - "@next/swc-linux-x64-gnu" "12.3.3" - "@next/swc-linux-x64-musl" "12.3.3" - "@next/swc-win32-arm64-msvc" "12.3.3" - "@next/swc-win32-ia32-msvc" "12.3.3" - "@next/swc-win32-x64-msvc" "12.3.3" + "@next/swc-android-arm-eabi" "12.3.1" + "@next/swc-android-arm64" "12.3.1" + "@next/swc-darwin-arm64" "12.3.1" + "@next/swc-darwin-x64" "12.3.1" + "@next/swc-freebsd-x64" "12.3.1" + "@next/swc-linux-arm-gnueabihf" "12.3.1" + "@next/swc-linux-arm64-gnu" "12.3.1" + "@next/swc-linux-arm64-musl" "12.3.1" + "@next/swc-linux-x64-gnu" "12.3.1" + "@next/swc-linux-x64-musl" "12.3.1" + "@next/swc-win32-arm64-msvc" "12.3.1" + "@next/swc-win32-ia32-msvc" "12.3.1" + "@next/swc-win32-x64-msvc" "12.3.1" nextra-theme-docs@^1.2.2: version "1.2.6" @@ -20231,7 +20234,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.14, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.4.13: +postcss@8.4.14, postcss@^8.2.14: version "8.4.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== @@ -20248,7 +20251,7 @@ postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0 picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.4.18: +postcss@^8.2.15, postcss@^8.4.13, postcss@^8.4.17, postcss@^8.4.18: version "8.4.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2" integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== @@ -22892,9 +22895,9 @@ storybook-addon-designs@^6.3.1: "@figspec/react" "^1.0.0" storybook-addon-next@^1.6.9: - version "1.6.10" - resolved "https://registry.yarnpkg.com/storybook-addon-next/-/storybook-addon-next-1.6.10.tgz#2a01e0ff07a048df0f32af082a7e88118c6fde28" - integrity sha512-BYs2B5dHIfk5EXVKGC91LZJ5/z+fUjhG7mDfuZvSA0igCm7AZFbe2LJz8NxtIKJpQwiqsqSr62suAcggMRkBNg== + version "1.6.9" + resolved "https://registry.yarnpkg.com/storybook-addon-next/-/storybook-addon-next-1.6.9.tgz#ee88b522fa294a5144891c8439300eb7a67b014d" + integrity sha512-MrzR+Zw4Dzl0mh5C8xPW4suUqh+Sh6/iEXGU5ehW9e1TMavlFbic84xTErHsKrIYNb4jpExsYob4hlhzLqxOjw== dependencies: "@storybook/addons" "^6.4.10" image-size "^1.0.0" @@ -23566,9 +23569,9 @@ tailwindcss-radix@^2.6.0: integrity sha512-32gv65ommaEMPKRS9yPmbvc6QcV+LsAqtSe1RFindBctVpS6+SbmkfcdecW/zgRvHW7KeAgl3iyzq2ZmRqsdZQ== tailwindcss@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.2.tgz#705f78cec8f4de2feb52abdb7a8a056e67f2d736" - integrity sha512-c2GtSdqg+harR4QeoTmex0Ngfg8IIHNeLQH5yr2B9uZbZR1Xt1rYbjWOWTcj3YLTZhrmZnPowoQDbSRFyZHQ5Q== + version "3.2.1" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.1.tgz#1bd828fff3172489962357f8d531c184080a6786" + integrity sha512-Uw+GVSxp5CM48krnjHObqoOwlCt5Qo6nw1jlCRwfGy68dSYb/LwS9ZFidYGRiM+w6rMawkZiu1mEMAsHYAfoLg== dependencies: arg "^5.0.2" chokidar "^3.5.3" @@ -23584,7 +23587,7 @@ tailwindcss@^3.2.1: normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.18" + postcss "^8.4.17" postcss-import "^14.1.0" postcss-js "^4.0.0" postcss-load-config "^3.1.4" @@ -23699,7 +23702,18 @@ terser-webpack-plugin@^4.2.3: terser "^5.3.4" webpack-sources "^1.4.3" -terser-webpack-plugin@^5.0.3, terser-webpack-plugin@^5.1.3: +terser-webpack-plugin@^5.0.3: + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser-webpack-plugin@^5.1.3: version "5.3.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== @@ -23719,7 +23733,17 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: +terser@^5.10.0, terser@^5.14.1: + version "5.15.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" + integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.3.4, terser@^5.7.2: version "5.14.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== @@ -25187,7 +25211,7 @@ watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^2.2.0, watchpack@^2.3.1: +watchpack@^2.2.0, watchpack@^2.3.1, watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -25544,9 +25568,9 @@ webpack-virtual-modules@^0.2.2: debug "^3.0.0" webpack-virtual-modules@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.4.tgz#a19fcf371923c59c4712d63d7d194b1e4d8262cc" - integrity sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA== + version "0.4.6" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" + integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== webpack@4: version "4.46.0" @@ -25577,7 +25601,7 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -"webpack@>=4.43.0 <6.0.0", webpack@^5.9.0: +"webpack@>=4.43.0 <6.0.0": version "5.73.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== @@ -25607,6 +25631,36 @@ webpack@4: watchpack "^2.3.1" webpack-sources "^3.2.3" +webpack@^5.9.0: + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + websocket@^1.0.32: version "1.0.34" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"