From acb6f292ec3ac4f651f8f302d52c3e2b7254f291 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 11 Nov 2022 09:47:11 +0000 Subject: [PATCH] Bugfix/revert e5ba8616 (#5479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert e5ba8616 * Revert "Reverted Sentry for debug purposes (#5425)" This reverts commit 4466c4ad4bd227b1e50b7786e0df2c08d95c253b. Co-authored-by: Omar López --- .env.example | 9 +- app.json | 4 - apps/web/.gitignore | 4 +- apps/web/next.config.js | 15 +- apps/web/package.json | 1 + apps/web/pages/_error.tsx | 5 +- apps/web/pages/apps/installed/[category].tsx | 4 +- apps/web/sentry.client.config.js | 16 + apps/web/sentry.properties | 3 + apps/web/sentry.server.config.js | 16 + packages/app-store/_pages/setup/index.tsx | 1 - packages/app-store/apps.metadata.generated.ts | 2 - packages/app-store/apps.server.generated.ts | 1 - .../lib/CalendarService.ts | 11 +- .../closecomothercalendar/test/globals.ts | 11 +- .../test/lib/CalendarService.test.ts | 88 +- packages/app-store/index.ts | 2 - .../sendgridothercalendar/README.mdx | 10 - .../sendgridothercalendar/_metadata.ts | 10 - .../sendgridothercalendar/api/_getAdd.ts | 10 - .../sendgridothercalendar/api/_postAdd.ts | 39 - .../sendgridothercalendar/api/_postCheck.ts | 29 - .../sendgridothercalendar/api/add.ts | 6 - .../sendgridothercalendar/api/check.ts | 5 - .../sendgridothercalendar/api/index.ts | 2 - .../sendgridothercalendar/components/.gitkeep | 0 .../sendgridothercalendar/config.json | 16 - .../app-store/sendgridothercalendar/index.ts | 3 - .../lib/CalendarService.ts | 99 -- .../sendgridothercalendar/lib/index.ts | 1 - .../sendgridothercalendar/package.json | 16 - .../pages/setup/index.tsx | 157 --- .../sendgridothercalendar/static/1.png | Bin 20222 -> 0 bytes .../sendgridothercalendar/static/logo.png | Bin 4472 -> 0 bytes packages/lib/CloseCom.ts | 193 ---- packages/lib/CloseComeUtils.ts | 206 ++++ packages/lib/Sendgrid.ts | 131 --- packages/lib/sync/services/CloseComService.ts | 21 +- packages/lib/sync/services/SendgridService.ts | 124 ++- packages/prisma/seed-app-store.config.json | 6 - packages/prisma/seed-app-store.ts | 2 - turbo.json | 3 +- yarn.lock | 928 +++++++++--------- 43 files changed, 959 insertions(+), 1251 deletions(-) create mode 100644 apps/web/sentry.client.config.js create mode 100644 apps/web/sentry.properties create mode 100644 apps/web/sentry.server.config.js delete mode 100644 packages/app-store/sendgridothercalendar/README.mdx delete mode 100644 packages/app-store/sendgridothercalendar/_metadata.ts delete mode 100644 packages/app-store/sendgridothercalendar/api/_getAdd.ts delete mode 100644 packages/app-store/sendgridothercalendar/api/_postAdd.ts delete mode 100644 packages/app-store/sendgridothercalendar/api/_postCheck.ts delete mode 100644 packages/app-store/sendgridothercalendar/api/add.ts delete mode 100644 packages/app-store/sendgridothercalendar/api/check.ts delete mode 100644 packages/app-store/sendgridothercalendar/api/index.ts delete mode 100644 packages/app-store/sendgridothercalendar/components/.gitkeep delete mode 100644 packages/app-store/sendgridothercalendar/config.json delete mode 100644 packages/app-store/sendgridothercalendar/index.ts delete mode 100644 packages/app-store/sendgridothercalendar/lib/CalendarService.ts delete mode 100644 packages/app-store/sendgridothercalendar/lib/index.ts delete mode 100644 packages/app-store/sendgridothercalendar/package.json delete mode 100644 packages/app-store/sendgridothercalendar/pages/setup/index.tsx delete mode 100644 packages/app-store/sendgridothercalendar/static/1.png delete mode 100644 packages/app-store/sendgridothercalendar/static/logo.png create mode 100644 packages/lib/CloseComeUtils.ts delete mode 100644 packages/lib/Sendgrid.ts 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 ead1889ab2681ebb983bb0897dc6c7581791d443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20222 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 JU zZ4Z1Mt&5pf!FN$CY>anr60NzkOIxW6y<{`5a+?PDF3g%ld>0lujk+9uY6zPZp)D4H zw(&RW<3qS+MVNj;AUxpbMW{xjcCCoD>k9O0wrRH5T+eqQGtLXnK_LY+>iz%c#h6pN z^!Q?~QI~GP&kMeb&9(a2QQq{P&c>rlC*zltg^-UA*tDGuqQAZF*2!cy+$v)G zt_7-_Z7SPr4v0cp6nqyrFObP}0jKT1(g@(X#|*7nuJz(--37HChR;k;^TGulUK~F! z?6sWz*_dhRo4GG1EXJ%KtD^3Myu6u~2QEzBnoGve~wSu>Y zQUJyweYSqrm*V5k27v(?$~XQa1GkVD|4ayZ{!D^dprLhP)!p-O%Kf|L@QnPgVlZGo zCh#0P(QuDjW)A)A%Hhuwo+iK(+LlWIA(QK(^T`z6!yYhVFZbNJq6WPkcY@%#*K73 z?u89a*&CR$p6z#}JAR(s+mwCt#L0jEa*8X%F3^ZFgf6B%nPSuf1}(l9q3l0f?uxmV z<4=Q_UpF?~oi(fcmoTonXX?-1s-J^;oA&g~%B}n*6w-dgmk4Mi8A2DfJyQ%G*7U!= zXh^K--OJzRUb*@-i2XIIw{z!}rRUpgT6?xXzLfif@8a^6=0}Z}dukpHGB3ERJ`2Cq zKTO@`3*Z^LeH`%EB6BcuD-wWw(@r%Q5#@=6)A>y=u$u_a5v8M4xzNX!006VyXW<%9 z@;BV-LdxIaw=!2xOkZjZ)KmWuxE2C{FlzdVNtQ|v0Jq5kK%>|Yx`1i-4O!d;BQC15 zGtoZOk=(>Hb1)JML4 zi=z?_vn3IJtJJ`(_DR?+0oT9JElDD5hlBBHJC8-@&-8~)yYW5YQEdoaP_FjMlZSU| z1kjITI0}?<8~_KL{x?H`@&Gs<08oa}-*OaQifK9L&8#iok-R=qnXum30rsz7;jWxe zFvoGr0{Ap5U`=@P`i*RzbHN!2Q@3w%RPy?`zCEQ5gt5Er9qs@b5$vAzd&SSXuuBzJ zpZUyb{TvTqtg}5P2~}Hb0YJW5EX>?=laTD3v`AHMp}bB5K&uz~18j)|_L#TlDsKQ# z1*o~Sy!_xwc2693F{%xr3myRg3d75;!)ewe>+CG{^ zJ1k&w_Pl?!E?i~3E=dAupRgs-OowCZMnZw*yNG1g<>kj!WrtE@7jsp)(&~n^TTm7W z0NFu=mZex5_p(3l;CEtrWOiC4?Finp+nRu?VE3dQE6WZ8`;E7sPF@OZ)sOWCU~e36d3}TTqFd5@$<)<&h=5$ z?L*hqi1R*ZI_8HmN5TTuWT*JuKH*4|0TP<_iJ6}*UF-A6 zn*iwNMFgx%$xlkH`w9T$mi)X>9TQhyIT!}v#x7{tN{um#%s9!x?*Q~&xMfa{%Jl$Y zU)AbWwN-pUf^Ym!=G85BVcarj1^7wt?S=aA()(n`+|i4!V6y%0l?OMDV)i40a3YLOhG%M9KTz;KZ-GqQv?tZJDN2X9>e|B{;tzLhcQgC$}B?u&i%^<8|B!kA1K zl7h6YW%tiXjy(RryKY5kBq8K@H-MXu8UXSa0J!={;FS#jj}g{`w_&gy zjnseBP?3r60MC3J01&}sGt)Vb0-#(K01;XNr2v$na*hBy7JvxM7>1!lZU#WB1OPw@ zp==fT-KDTqV#+XP%(4>#0J2O7K;_JfSId&)H4ISB@PUzAfq}e=0sy}-Az}h^ltoG8`B%4S48BZ?g-sqjiY`khGb7nbAyLo|v%J4N}$4_w2zlAYxqI=X3E3rO`xD_NhDaKTsd(RYB*Nc9@?!gIo$;0p_si!}1g1x&_F{&{>CKg6Be z>c4tZ!Y%9qjbN`aFE*W#vX}RMlq6*nRyZxmvj$SV!uz8YPP@eki%XL-F680YT%eKa zHRgp}NGWTX9R{RN^3FQ~3cy_iZrQj#!j2nb&5Sh%ghr^>=t7SWxBt18kQnd3I;E3_ zQzg$XDP80gk#@-0X{$RR^l~Gii(#PrA(AO;&GEA*u3ObiYB?Y@n9;fU|0wL@IA?yMn z>;fSp>;j>IunU9+!Y&XR2)jUNAnXF6fv^jN2Er~78VI{UXdvtYp@Faqga*Pc5E=-( zKxiOS>0*o(deOUo8*cC4pE8I_tKsvHXROd*#{F>@W6_JYzdzjG?M@uTjEJ(pbLahKb#T>A%qY@2qA z?lzk!vJ_h^Mz9Y;px6qEC^SAP5lS(j75^X)t+hrFst-mIt5(DZ1-*B(8?%^%B+ceQ zvM|e?JLfz1JLjJ7aL#wMAK6~BuZAFq?a8B3CqYzJ5=6z#ZPjR}$GVIDi3ef47k1fw za7cCl5!Gx3kV#YS2c1CHhM)cvG$YhsdUr4EO&t?e+w{xW#-BCQ7)~^|WYe-b2q39| ze%*>tKVSWTB6Tf7_3$Ysm5zY{{pg4Tx<=Z&)saC}(5RNfWOG(T4om=LGHV)^D`q29 z-mi$(c$=okya^nPQ1hgEQypZ?b^zJr=X@%|Fl3Y9=R+Z&sJs$vhbtOfsWQEc1nrDap)~V4M3O{X?kdA$UhYD+fF~t3W7j09L;e)WZ`p%EhuMw zmRn!+AOTl(^fc6Mi^Lvf#m>M8g~-lFVWv~51;>_K$Q8;Oot4ux>t|@w#G&P_UDyf! zrLm;7+dZ5HbSH4_jH99}>8me-QTkRssA#CE3wG&@W8~x1R2mq-1Qv7=DK^gtF&B?J zI=VyIkZd)Bzb2&!mC5Lu$V(g(7Pz1gXiG?KEGw|VXqXomDZuhfI2Oi-VF!zWXveQ1 zY?O`1V_Y;Ej593D#-+A+AQ%sa!-=Mt5RXR_MQqY?p=_xDABwR$!ZL9o5N=BZgHkB5 zELMy;K!&!{ZQDk%T9Ss5aiN2^$yf{(2g{R3O&+=f{6 zyx<{-)>^bs&{Kz6RL+YQAED>|P0H;bvn(h7k}Q-VKPCQgAUOY%bze3R&WZh3Z`JIc zefEK=hhE*^IQ`6T-|cwOlhgL?A`Tv^9{J*8-R4AIuF5EhT$!xeh-xeGxpY}<733Oa zzrhV*`72uf%YP{3MsGIEOnms`#CsL3RMYFf@E31;>M9T37$e9F-{>=!?*2q*pKl3d zUDDkW$p1zlUrijZ?|Aq3@1Gc(dh^_Cy? z@5!AU-c?claR6(4>At)M^{--RX{{aGun}fuX7@iLt?WNPi*1G`aUknz7^~o4VzL=i z6b@u9Q|!wZrmL<^@M!+}`)y_P1Oj{RHB^;lA}+~AapGGG*Y#9f&dZ?KHb;3#c;&ug e?BDxFi>I2Ht3349tV{XP29b=nOYgKjb><(BMbrWS 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"