diff --git a/apps/web/components/App.tsx b/apps/web/components/App.tsx
new file mode 100644
index 0000000000..fbf678d0e8
--- /dev/null
+++ b/apps/web/components/App.tsx
@@ -0,0 +1,231 @@
+import {
+ BookOpenIcon,
+ DocumentTextIcon,
+ ExternalLinkIcon,
+ FlagIcon,
+ MailIcon,
+ ShieldCheckIcon,
+} from "@heroicons/react/outline";
+import { ChevronLeftIcon } from "@heroicons/react/solid";
+import Link from "next/link";
+import React from "react";
+
+import { InstallAppButton } from "@calcom/app-store/components";
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import { App as AppType } from "@calcom/types/App";
+import { Button } from "@calcom/ui";
+
+//import NavTabs from "@components/NavTabs";
+import Shell from "@components/Shell";
+import Badge from "@components/ui/Badge";
+
+export default function App({
+ name,
+ type,
+ logo,
+ body,
+ categories,
+ author,
+ price = 0,
+ commission,
+ isGlobal = false,
+ feeType,
+ docs,
+ website,
+ email,
+ tos,
+ privacy,
+}: {
+ name: string;
+ type: AppType["type"];
+ isGlobal?: AppType["isGlobal"];
+ logo: string;
+ body: React.ReactNode;
+ categories: string[];
+ author: string;
+ pro?: boolean;
+ price?: number;
+ commission?: number;
+ feeType?: AppType["feeType"];
+ docs?: string;
+ website?: string;
+ email: string; // required
+ tos?: string;
+ privacy?: string;
+}) {
+ const { t } = useLocale();
+
+ /*const tabs = [
+ {
+ name: t("description"),
+ href: "?description",
+ },
+ {
+ name: t("features"),
+ href: "?features",
+ },
+ {
+ name: t("permissions"),
+ href: "?permissions",
+ },
+ ];*/
+
+ const priceInDollar = Intl.NumberFormat("en-US", {
+ style: "currency",
+ currency: "USD",
+ useGrouping: false,
+ }).format(price);
+
+ return (
+ <>
+
+
+
+
+
+ {t("browse_apps")}
+
+
+
+
+
+
+ {name}
+
+ {categories[0]} • {t("published_by", { author })}
+
+
+
+
+
+ {isGlobal ? (
+
+ {t("installed")}
+
+ ) : (
+ {t("install_app")} }
+ />
+ )}
+ {price !== 0 && (
+
+ {feeType === "usage-based"
+ ? commission + "% + " + priceInDollar + "/booking"
+ : priceInDollar}
+ {feeType === "monthly" && "/" + t("month")}
+
+ )}
+
+
+ {/* reintroduce once we show permissions and features
+
*/}
+
+
+
+
{body}
+
+
{t("categories")}
+
+
{t("pricing")}
+
+ {price === 0 ? (
+ "Free"
+ ) : (
+ <>
+ {Intl.NumberFormat("en-US", {
+ style: "currency",
+ currency: "USD",
+ useGrouping: false,
+ }).format(price)}
+ {feeType === "monthly" && "/" + t("month")}
+ >
+ )}
+
+
{t("learn_more")}
+
+
+
+ Every app published on the Cal.com App Store is open source and thoroughly tested via peer
+ reviews. Nevertheless, Cal.com, Inc. does not endorse or certify these apps unless they are
+ published by Cal.com. If you encounter inappropriate content or behaviour please report it.
+
+
+ Report App
+
+
+
+
+
+ >
+ );
+}
diff --git a/apps/web/components/AppsShell.tsx b/apps/web/components/AppsShell.tsx
new file mode 100644
index 0000000000..16817268e4
--- /dev/null
+++ b/apps/web/components/AppsShell.tsx
@@ -0,0 +1,30 @@
+import { useSession } from "next-auth/react";
+import React from "react";
+
+import { useLocale } from "@lib/hooks/useLocale";
+
+import NavTabs from "./NavTabs";
+
+export default function AppsShell({ children }: { children: React.ReactNode }) {
+ const { t } = useLocale();
+ const { status } = useSession();
+ const tabs = [
+ {
+ name: t("app_store"),
+ href: "/apps",
+ },
+ {
+ name: t("installed_apps"),
+ href: "/apps/installed",
+ },
+ ];
+
+ return (
+ <>
+
+ {status === "authenticated" && }
+
+ {children}
+ >
+ );
+}
diff --git a/apps/web/components/DestinationCalendarSelector.tsx b/apps/web/components/DestinationCalendarSelector.tsx
index f2462dd9d0..7d829bdbbb 100644
--- a/apps/web/components/DestinationCalendarSelector.tsx
+++ b/apps/web/components/DestinationCalendarSelector.tsx
@@ -67,7 +67,7 @@ const DestinationCalendarSelector = ({
placeholder={!hidePlaceholder ? `${t("select_destination_calendar")}:` : undefined}
options={options}
isSearchable={false}
- className="focus:border-primary-500 focus:ring-primary-500 mt-1 mb-2 block w-full min-w-0 flex-1 rounded-none rounded-r-md border-gray-300 sm:text-sm"
+ className="focus:ring-primary-500 focus:border-primary-500 mt-1 mb-2 block w-full min-w-0 flex-1 rounded-none rounded-r-md border-gray-300 sm:text-sm"
onChange={(option) => {
setSelectedOption(option);
if (!option) {
diff --git a/apps/web/components/Shell.tsx b/apps/web/components/Shell.tsx
index 130ebbd814..4b67070f5e 100644
--- a/apps/web/components/Shell.tsx
+++ b/apps/web/components/Shell.tsx
@@ -1,20 +1,20 @@
import { SelectorIcon } from "@heroicons/react/outline";
import {
CalendarIcon,
- ArrowLeftIcon,
ClockIcon,
CogIcon,
ExternalLinkIcon,
LinkIcon,
LogoutIcon,
- PuzzleIcon,
+ ViewGridIcon,
MoonIcon,
MapIcon,
+ ArrowLeftIcon,
} from "@heroicons/react/solid";
import { signOut, useSession } from "next-auth/react";
import Link from "next/link";
import { useRouter } from "next/router";
-import React, { ReactNode, useEffect, useState } from "react";
+import React, { Fragment, ReactNode, useEffect, useState } from "react";
import { Toaster } from "react-hot-toast";
import Button from "@calcom/ui/Button";
@@ -59,6 +59,10 @@ function useRedirectToLoginIfUnauthenticated() {
const router = useRouter();
useEffect(() => {
+ if (router.pathname.startsWith("/apps")) {
+ return;
+ }
+
if (!loading && !session) {
router.replace({
pathname: "/auth/login",
@@ -121,10 +125,11 @@ export function ShellSubHeading(props: {
export default function Shell(props: {
centered?: boolean;
title?: string;
- heading: ReactNode;
+ heading?: ReactNode;
subtitle?: ReactNode;
children: ReactNode;
CTA?: ReactNode;
+ large?: boolean;
HeadingLeftIcon?: ReactNode;
backPath?: string; // renders back button to specified path
// use when content needs to expand with flex
@@ -157,10 +162,22 @@ export default function Shell(props: {
current: router.asPath.startsWith("/availability"),
},
{
- name: t("integrations"),
- href: "/integrations",
- icon: PuzzleIcon,
- current: router.asPath.startsWith("/integrations"),
+ name: t("apps"),
+ href: "/apps",
+ icon: ViewGridIcon,
+ current: router.asPath.startsWith("/apps"),
+ child: [
+ {
+ name: t("app_store"),
+ href: "/apps",
+ current: router.asPath === "/apps",
+ },
+ {
+ name: t("installed_apps"),
+ href: "/apps/installed",
+ current: router.asPath === "/apps/installed",
+ },
+ ],
},
{
name: t("settings"),
@@ -182,6 +199,7 @@ export default function Shell(props: {
const user = query.data;
const i18n = useViewerI18n();
+ const { status } = useSession();
if (i18n.status === "loading" || isRedirectingToOnboarding || loading) {
// show spinner whilst i18n is loading to avoid language flicker
@@ -206,95 +224,121 @@ export default function Shell(props: {
-
-
-
-
-
-
-
-
-
-
- {/* logo icon for tablet */}
-
-
-
-
-
-
- {navigation.map((item) => (
-
-
-
- {item.name}
-
-
- ))}
-
+
+ {status === "authenticated" && (
+
+
+
+
+
+
+
+
+
+ {/* logo icon for tablet */}
+
+
+
+
+
+
+ {navigation.map((item) => (
+
+
+
+
+ {item.name}
+
+
+ {item.child &&
+ router.asPath.startsWith(item.href) &&
+ item.child.map((item) => {
+ return (
+
+
+ {item.name}
+
+
+ );
+ })}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+ © {new Date().getFullYear()} Cal.com, Inc. v.{pkg.version + "-"}
+ {process.env.NEXT_PUBLIC_APP_URL === "https://cal.com" ? "h" : "sh"}
+ -{user && user.plan}
+
-
-
-
-
-
-
-
-
-
-
- © {new Date().getFullYear()} Cal.com, Inc. v.{pkg.version + "-"}
- {process.env.NEXT_PUBLIC_APP_URL === "https://cal.com" ? "h" : "sh"}
- -{user && user.plan}
-
-
+ )}
{/* show top navigation for md and smaller (tablet and phones) */}
-
-
-
-
-
-
-
-
- {t("view_notifications")}
-
-
-
-
-
-
-
-
-
+ {status === "authenticated" && (
+
+
+
+
+
+
+
+
+ {t("view_notifications")}
+
+
+
+
+
+
+
+
+
+ )}
{!!props.backPath && (
@@ -306,14 +350,22 @@ export default function Shell(props: {
)}
-
- {props.HeadingLeftIcon &&
{props.HeadingLeftIcon}
}
-
-
{props.heading}
-
{props.subtitle}
+ {props.heading && props.subtitle && (
+
+ {props.HeadingLeftIcon &&
{props.HeadingLeftIcon}
}
+
+
+ {props.heading}
+
+
{props.subtitle}
+
+ {props.CTA &&
{props.CTA}
}
-
{props.CTA}
-
+ )}
diff --git a/apps/web/components/apps/AllApps.tsx b/apps/web/components/apps/AllApps.tsx
new file mode 100644
index 0000000000..083d63c5bc
--- /dev/null
+++ b/apps/web/components/apps/AllApps.tsx
@@ -0,0 +1,28 @@
+import type { App } from "@calcom/types/App";
+
+import { useLocale } from "@lib/hooks/useLocale";
+
+import AppCard from "./AppCard";
+
+export default function AllApps({ apps }: { apps: App[] }) {
+ const { t } = useLocale();
+
+ return (
+
+
{t("all_apps")}
+
+ {apps.map((app) => (
+
+ ))}
+
+
+ );
+}
diff --git a/apps/web/components/apps/AppCard.tsx b/apps/web/components/apps/AppCard.tsx
new file mode 100644
index 0000000000..f435983580
--- /dev/null
+++ b/apps/web/components/apps/AppCard.tsx
@@ -0,0 +1,41 @@
+import { StarIcon } from "@heroicons/react/solid";
+import Link from "next/link";
+
+import Button from "@calcom/ui/Button";
+
+interface AppCardProps {
+ logo: string;
+ name: string;
+ slug?: string;
+ category?: string;
+ description: string;
+ rating: number;
+ reviews?: number;
+}
+
+export default function AppCard(props: AppCardProps) {
+ return (
+
+
+
+
+
{
+ // TODO: Actually add the integration
+ console.log("The magic is supposed to happen here");
+ }}>
+ Add
+
+
+ {props.name}
+
+ {props.rating} stars
+ {props.reviews} reviews
+
+ {props.description}
+
+
+ );
+}
diff --git a/apps/web/components/apps/Categories.tsx b/apps/web/components/apps/Categories.tsx
new file mode 100644
index 0000000000..f89b72c951
--- /dev/null
+++ b/apps/web/components/apps/Categories.tsx
@@ -0,0 +1,28 @@
+import { CreditCardIcon } from "@heroicons/react/outline";
+import Link from "next/link";
+
+import { useLocale } from "@lib/hooks/useLocale";
+
+export default function AppStoreCategories(props: any) {
+ const { t } = useLocale();
+ return (
+
+
{t("popular_categories")}
+
+
+ );
+}
diff --git a/apps/web/components/apps/Slider.tsx b/apps/web/components/apps/Slider.tsx
new file mode 100644
index 0000000000..355a4d3d8f
--- /dev/null
+++ b/apps/web/components/apps/Slider.tsx
@@ -0,0 +1,88 @@
+import Glide from "@glidejs/glide";
+import "@glidejs/glide/dist/css/glide.core.min.css";
+import "@glidejs/glide/dist/css/glide.theme.min.css";
+import { ArrowLeftIcon, ArrowRightIcon } from "@heroicons/react/solid";
+import { useEffect, useState } from "react";
+
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import type { App } from "@calcom/types/App";
+
+import useMediaQuery from "@lib/hooks/useMediaQuery";
+
+import AppCard from "./AppCard";
+
+const Slider =
({ items }: { items: T[] }) => {
+ const { t } = useLocale();
+ const isMobile = useMediaQuery("(max-width: 767px)");
+ const [size, setSize] = useState(3);
+
+ useEffect(() => {
+ if (isMobile) {
+ setSize(1);
+ } else {
+ setSize(3);
+ }
+ }, [isMobile]);
+
+ useEffect(() => {
+ const slider = new Glide(".glide", {
+ type: "carousel",
+ perView: size,
+ });
+
+ slider.mount();
+
+ // @ts-ignore TODO: This method is missing in types
+ return () => slider.destroy();
+ }, [size]);
+
+ return (
+
+
+
+
+
+
{t("trending_apps")}
+
+
+
+
+
+ {items.map((app) => {
+ return (
+ app.trending && (
+
+
+
+ )
+ );
+ })}
+
+
+
+
+ );
+};
+
+export default Slider;
diff --git a/apps/web/components/booking/pages/BookingPage.tsx b/apps/web/components/booking/pages/BookingPage.tsx
index e6b6ab7b86..ae160556cf 100644
--- a/apps/web/components/booking/pages/BookingPage.tsx
+++ b/apps/web/components/booking/pages/BookingPage.tsx
@@ -132,6 +132,7 @@ const BookingPage = ({ eventType, booking, profile }: BookingPageProps) => {
const locationInfo = (type: LocationType) => locations.find((location) => location.type === type);
// TODO: Move to translations
+ // Also TODO: Get these dynamically from App Store
const locationLabels = {
[LocationType.InPerson]: t("in_person_meeting"),
[LocationType.Phone]: t("phone_call"),
@@ -141,6 +142,7 @@ const BookingPage = ({ eventType, booking, profile }: BookingPageProps) => {
[LocationType.Daily]: "Daily.co Video",
[LocationType.Huddle01]: "Huddle01 Video",
[LocationType.Tandem]: "Tandem Video",
+ [LocationType.Teams]: "MS Teams",
};
const loggedInIsOwner = eventType?.users[0]?.name === session?.user?.name;
const defaultValues = () => {
diff --git a/apps/web/components/integrations/CalendarListContainer.tsx b/apps/web/components/integrations/CalendarListContainer.tsx
index 80f8eee924..dbb1f0366b 100644
--- a/apps/web/components/integrations/CalendarListContainer.tsx
+++ b/apps/web/components/integrations/CalendarListContainer.tsx
@@ -1,6 +1,7 @@
-import React, { Fragment } from "react";
+import { Fragment } from "react";
import { useMutation } from "react-query";
+import { InstallAppButton } from "@calcom/app-store/components";
import showToast from "@calcom/lib/notification";
import { Alert } from "@calcom/ui/Alert";
import Button from "@calcom/ui/Button";
@@ -14,7 +15,6 @@ import DestinationCalendarSelector from "@components/DestinationCalendarSelector
import { List } from "@components/List";
import { ShellSubHeading } from "@components/Shell";
-import ConnectIntegration from "./ConnectIntegrations";
import DisconnectIntegration from "./DisconnectIntegration";
import IntegrationListItem from "./IntegrationListItem";
import SubHeadingTitleWithConnections from "./SubHeadingTitleWithConnections";
@@ -110,7 +110,8 @@ function ConnectedCalendarsList(props: Props) {
{item.calendars ? (
(
@@ -174,16 +175,18 @@ function CalendarList(props: Props) {
{data.calendar.items.map((item) => (
(
-
+ render={(buttonProps) => (
+
{t("connect")}
)}
- onOpenChange={() => props.onChanged()}
+ onChanged={() => props.onChanged()}
/>
}
/>
@@ -193,6 +196,7 @@ function CalendarList(props: Props) {
/>
);
}
+
export function CalendarListContainer(props: { heading?: false }) {
const { t } = useLocale();
const { heading = true } = props;
diff --git a/apps/web/components/integrations/ConnectIntegrations.tsx b/apps/web/components/integrations/ConnectIntegrations.tsx
deleted file mode 100644
index 0ce01fe501..0000000000
--- a/apps/web/components/integrations/ConnectIntegrations.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import type { IntegrationOAuthCallbackState } from "pages/api/integrations/types";
-import { useState } from "react";
-import { useMutation } from "react-query";
-
-import { ButtonBaseProps } from "@calcom/ui/Button";
-
-import { NEXT_PUBLIC_BASE_URL } from "@lib/config/constants";
-import { AddAppleIntegrationModal } from "@lib/integrations/calendar/components/AddAppleIntegration";
-import { AddCalDavIntegrationModal } from "@lib/integrations/calendar/components/AddCalDavIntegration";
-
-export default function ConnectIntegration(props: {
- type: string;
- render: (renderProps: ButtonBaseProps) => JSX.Element;
- onOpenChange: (isOpen: boolean) => unknown | Promise;
-}) {
- const { type } = props;
- const [isLoading, setIsLoading] = useState(false);
-
- const mutation = useMutation(async () => {
- const state: IntegrationOAuthCallbackState = {
- returnTo: NEXT_PUBLIC_BASE_URL + location.pathname + location.search,
- };
- const stateStr = encodeURIComponent(JSON.stringify(state));
- const searchParams = `?state=${stateStr}`;
- const res = await fetch("/api/integrations/" + type.replace("_", "") + "/add" + searchParams);
- if (!res.ok) {
- throw new Error("Something went wrong");
- }
- const json = await res.json();
- window.location.href = json.url;
- setIsLoading(true);
- });
- const [isModalOpen, _setIsModalOpen] = useState(false);
-
- const setIsModalOpen = (v: boolean) => {
- _setIsModalOpen(v);
- props.onOpenChange(v);
- };
-
- return (
- <>
- {props.render({
- onClick() {
- if (["caldav_calendar", "apple_calendar"].includes(type)) {
- // special handlers
- setIsModalOpen(true);
- return;
- }
-
- mutation.mutate();
- },
- loading: mutation.isLoading || isLoading,
- disabled: isModalOpen,
- })}
- {type === "caldav_calendar" && (
-
- )}
-
- {type === "apple_calendar" && (
-
- )}
- >
- );
-}
diff --git a/apps/web/components/integrations/DisconnectIntegration.tsx b/apps/web/components/integrations/DisconnectIntegration.tsx
index a760955092..a66225dc44 100644
--- a/apps/web/components/integrations/DisconnectIntegration.tsx
+++ b/apps/web/components/integrations/DisconnectIntegration.tsx
@@ -1,6 +1,7 @@
import { useState } from "react";
import { useMutation } from "react-query";
+import showToast from "@calcom/lib/notification";
import { ButtonBaseProps } from "@calcom/ui/Button";
import { Dialog } from "@calcom/ui/Dialog";
@@ -25,12 +26,14 @@ export default function DisconnectIntegration(props: {
if (!res.ok) {
throw new Error("Something went wrong");
}
+ return res.json();
},
{
async onSettled() {
await props.onOpenChange(modalOpen);
},
- onSuccess() {
+ onSuccess(data) {
+ showToast(data.message, "success");
setModalOpen(false);
},
}
diff --git a/apps/web/components/integrations/IntegrationListItem.tsx b/apps/web/components/integrations/IntegrationListItem.tsx
index 4f4e37e91e..454a0e4330 100644
--- a/apps/web/components/integrations/IntegrationListItem.tsx
+++ b/apps/web/components/integrations/IntegrationListItem.tsx
@@ -1,4 +1,3 @@
-import Image from "next/image";
import { ReactNode } from "react";
import classNames from "@lib/classNames";
@@ -6,7 +5,7 @@ import classNames from "@lib/classNames";
import { ListItem, ListItemText, ListItemTitle } from "@components/List";
function IntegrationListItem(props: {
- imageSrc: string;
+ imageSrc?: string;
title: string;
description: string;
actions?: ReactNode;
@@ -15,7 +14,7 @@ function IntegrationListItem(props: {
return (
-
+ {props.imageSrc &&
}
{props.title}
{props.description}
diff --git a/apps/web/components/ui/form/DatePicker.tsx b/apps/web/components/ui/form/DatePicker.tsx
index 1f7e8f761b..f45d97bd51 100644
--- a/apps/web/components/ui/form/DatePicker.tsx
+++ b/apps/web/components/ui/form/DatePicker.tsx
@@ -16,7 +16,7 @@ export const DatePicker = ({ date, onDatesChange, className }: Props) => {
return (
-
+
Webhooks
{t("automation")}
diff --git a/apps/web/ee/components/team/availability/TeamAvailabilityModal.tsx b/apps/web/ee/components/team/availability/TeamAvailabilityModal.tsx
index 206c8fff22..2ac53e4cc1 100644
--- a/apps/web/ee/components/team/availability/TeamAvailabilityModal.tsx
+++ b/apps/web/ee/components/team/availability/TeamAvailabilityModal.tsx
@@ -74,7 +74,7 @@ export default function TeamAvailabilityModal(props: Props) {
]}
isSearchable={false}
classNamePrefix="react-select"
- className="react-select-container focus:border-primary-500 focus:ring-primary-500 block w-full min-w-0 flex-1 rounded-sm border border-gray-300 sm:text-sm"
+ className="react-select-container focus:ring-primary-500 focus:border-primary-500 block w-full min-w-0 flex-1 rounded-sm border border-gray-300 sm:text-sm"
value={{ value: frequency, label: `${frequency} minutes` }}
onChange={(newFrequency) => setFrequency(newFrequency?.value ?? 30)}
/>
diff --git a/apps/web/ee/components/team/availability/TeamAvailabilityScreen.tsx b/apps/web/ee/components/team/availability/TeamAvailabilityScreen.tsx
index 5dac84e75a..ec8e82129b 100644
--- a/apps/web/ee/components/team/availability/TeamAvailabilityScreen.tsx
+++ b/apps/web/ee/components/team/availability/TeamAvailabilityScreen.tsx
@@ -47,7 +47,7 @@ export default function TeamAvailabilityScreen(props: Props) {
{member?.name}
@@ -93,7 +93,7 @@ export default function TeamAvailabilityScreen(props: Props) {
]}
isSearchable={false}
classNamePrefix="react-select"
- className="react-select-container focus:border-primary-500 focus:ring-primary-500 block w-full min-w-0 flex-1 rounded-sm border border-gray-300 sm:text-sm"
+ className="react-select-container focus:ring-primary-500 focus:border-primary-500 block w-full min-w-0 flex-1 rounded-sm border border-gray-300 sm:text-sm"
value={{ value: frequency, label: `${frequency} minutes` }}
onChange={(newFrequency) => setFrequency(newFrequency?.value ?? 30)}
/>
diff --git a/apps/web/ee/components/web3/CryptoSection.tsx b/apps/web/ee/components/web3/CryptoSection.tsx
index f81a112e0e..6e0eb81447 100644
--- a/apps/web/ee/components/web3/CryptoSection.tsx
+++ b/apps/web/ee/components/web3/CryptoSection.tsx
@@ -94,7 +94,7 @@ const CryptoSection = (props: CryptoSectionProps) => {
const verifyButton = useMemo(() => {
return (
-
+
{t("verify_wallet")}
);
@@ -103,7 +103,7 @@ const CryptoSection = (props: CryptoSectionProps) => {
const connectButton = useMemo(() => {
return (
-
+
{t("connect_metamask")}
);
@@ -118,7 +118,7 @@ const CryptoSection = (props: CryptoSectionProps) => {
await connectMetamask();
await verifyWallet();
}}>
-
+
{t("verify_wallet")}
);
diff --git a/apps/web/ee/lib/stripe/server.ts b/apps/web/ee/lib/stripe/server.ts
index 64f2808bd9..1302fdea0a 100644
--- a/apps/web/ee/lib/stripe/server.ts
+++ b/apps/web/ee/lib/stripe/server.ts
@@ -6,9 +6,9 @@ import { getErrorFromUnknown } from "@calcom/lib/errors";
import prisma from "@calcom/prisma";
import { createPaymentLink } from "@calcom/stripe/client";
import stripe, { PaymentData } from "@calcom/stripe/server";
+import { CalendarEvent } from "@calcom/types/Calendar";
import { sendAwaitingPaymentEmail, sendOrganizerPaymentRefundFailedEmail } from "@lib/emails/email-manager";
-import { CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
export type PaymentInfo = {
link?: string | null;
diff --git a/apps/web/ee/pages/api/integrations/stripepayment/webhook.ts b/apps/web/ee/pages/api/integrations/stripepayment/webhook.ts
index cc5c6064ee..fbd2fc7893 100644
--- a/apps/web/ee/pages/api/integrations/stripepayment/webhook.ts
+++ b/apps/web/ee/pages/api/integrations/stripepayment/webhook.ts
@@ -2,14 +2,14 @@ import { buffer } from "micro";
import type { NextApiRequest, NextApiResponse } from "next";
import Stripe from "stripe";
+import EventManager from "@calcom/core/EventManager";
import { getErrorFromUnknown } from "@calcom/lib/errors";
+import prisma from "@calcom/prisma";
import stripe from "@calcom/stripe/server";
+import { CalendarEvent } from "@calcom/types/Calendar";
import { IS_PRODUCTION } from "@lib/config/constants";
import { HttpError as HttpCode } from "@lib/core/http/error";
-import EventManager from "@lib/events/EventManager";
-import { CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
-import prisma from "@lib/prisma";
import { getTranslation } from "@server/lib/i18n";
@@ -138,6 +138,11 @@ const webhookHandlers: Record
= {
"payment_intent.succeeded": handlePaymentSuccess,
};
+/**
+ * @deprecated
+ * We need to create a PaymentManager in `@calcom/core`
+ * to prevent circular dependencies on App Store migration
+ */
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
if (req.method !== "POST") {
diff --git a/apps/web/lib/config/constants.ts b/apps/web/lib/config/constants.ts
index b2f1800efd..1dd7c7a65e 100644
--- a/apps/web/lib/config/constants.ts
+++ b/apps/web/lib/config/constants.ts
@@ -1,6 +1,2 @@
-export const BASE_URL = process.env.BASE_URL || `https://${process.env.VERCEL_URL}`;
-export const WEBSITE_URL = process.env.NEXT_PUBLIC_APP_URL || "https://cal.com";
-export const IS_PRODUCTION = process.env.NODE_ENV === "production";
-export const TRIAL_LIMIT_DAYS = 14;
-export const HOSTED_CAL_FEATURES = process.env.HOSTED_CAL_FEATURES || BASE_URL === "https://app.cal.com";
-export const NEXT_PUBLIC_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL || `https://${process.env.VERCEL_URL}`;
+// TODO: Remove this file once everything is imported from `@calcom/lib`
+export * from "@calcom/lib/constants";
diff --git a/apps/web/lib/emails/email-manager.ts b/apps/web/lib/emails/email-manager.ts
index 195398f1a8..910b2bc33a 100644
--- a/apps/web/lib/emails/email-manager.ts
+++ b/apps/web/lib/emails/email-manager.ts
@@ -1,3 +1,5 @@
+import type { CalendarEvent, Person } from "@calcom/types/Calendar";
+
import AttendeeAwaitingPaymentEmail from "@lib/emails/templates/attendee-awaiting-payment-email";
import AttendeeCancelledEmail from "@lib/emails/templates/attendee-cancelled-email";
import AttendeeDeclinedEmail from "@lib/emails/templates/attendee-declined-email";
@@ -12,7 +14,6 @@ import OrganizerRequestReminderEmail from "@lib/emails/templates/organizer-reque
import OrganizerRescheduledEmail from "@lib/emails/templates/organizer-rescheduled-email";
import OrganizerScheduledEmail from "@lib/emails/templates/organizer-scheduled-email";
import TeamInviteEmail, { TeamInvite } from "@lib/emails/templates/team-invite-email";
-import { CalendarEvent, Person } from "@lib/integrations/calendar/interfaces/Calendar";
export const sendScheduledEmails = async (calEvent: CalendarEvent) => {
const emailsToSend: Promise[] = [];
diff --git a/apps/web/lib/emails/templates/attendee-rescheduled-email.ts b/apps/web/lib/emails/templates/attendee-rescheduled-email.ts
index cd50e05820..46bf6364cc 100644
--- a/apps/web/lib/emails/templates/attendee-rescheduled-email.ts
+++ b/apps/web/lib/emails/templates/attendee-rescheduled-email.ts
@@ -4,7 +4,7 @@ import timezone from "dayjs/plugin/timezone";
import toArray from "dayjs/plugin/toArray";
import utc from "dayjs/plugin/utc";
-import { getCancelLink } from "@lib/CalEventParser";
+import { getCancelLink } from "@calcom/lib/CalEventParser";
import AttendeeScheduledEmail from "./attendee-scheduled-email";
import {
diff --git a/apps/web/lib/emails/templates/attendee-scheduled-email.ts b/apps/web/lib/emails/templates/attendee-scheduled-email.ts
index 447bc84ed2..67b8a144eb 100644
--- a/apps/web/lib/emails/templates/attendee-scheduled-email.ts
+++ b/apps/web/lib/emails/templates/attendee-scheduled-email.ts
@@ -6,11 +6,11 @@ import utc from "dayjs/plugin/utc";
import { createEvent, DateArray } from "ics";
import nodemailer from "nodemailer";
+import { getAppName } from "@calcom/app-store/utils";
+import { getCancelLink, getRichDescription } from "@calcom/lib/CalEventParser";
import { getErrorFromUnknown } from "@calcom/lib/errors";
+import type { Person, CalendarEvent } from "@calcom/types/Calendar";
-import { getCancelLink, getRichDescription } from "@lib/CalEventParser";
-import { getIntegrationName } from "@lib/integrations";
-import { CalendarEvent, Person } from "@lib/integrations/calendar/interfaces/Calendar";
import { serverConfig } from "@lib/serverConfig";
import {
@@ -309,7 +309,7 @@ ${getRichDescription(this.calEvent)}
}
protected getLocation(): string {
- let providerName = this.calEvent.location ? getIntegrationName(this.calEvent.location) : "";
+ let providerName = this.calEvent.location ? getAppName(this.calEvent.location) : "";
if (this.calEvent.location && this.calEvent.location.includes("integrations:")) {
const location = this.calEvent.location.split(":")[1];
diff --git a/apps/web/lib/emails/templates/organizer-rescheduled-email.ts b/apps/web/lib/emails/templates/organizer-rescheduled-email.ts
index da26724902..5c9a7e5c4d 100644
--- a/apps/web/lib/emails/templates/organizer-rescheduled-email.ts
+++ b/apps/web/lib/emails/templates/organizer-rescheduled-email.ts
@@ -4,7 +4,7 @@ import timezone from "dayjs/plugin/timezone";
import toArray from "dayjs/plugin/toArray";
import utc from "dayjs/plugin/utc";
-import { getCancelLink } from "@lib/CalEventParser";
+import { getCancelLink } from "@calcom/lib/CalEventParser";
import {
emailHead,
diff --git a/apps/web/lib/emails/templates/organizer-scheduled-email.ts b/apps/web/lib/emails/templates/organizer-scheduled-email.ts
index a6ac4ba956..fe53820f24 100644
--- a/apps/web/lib/emails/templates/organizer-scheduled-email.ts
+++ b/apps/web/lib/emails/templates/organizer-scheduled-email.ts
@@ -6,11 +6,11 @@ import utc from "dayjs/plugin/utc";
import { createEvent, DateArray, Person } from "ics";
import nodemailer from "nodemailer";
+import { getAppName } from "@calcom/app-store/utils";
+import { getCancelLink, getRichDescription } from "@calcom/lib/CalEventParser";
import { getErrorFromUnknown } from "@calcom/lib/errors";
+import type { CalendarEvent } from "@calcom/types/Calendar";
-import { getCancelLink, getRichDescription } from "@lib/CalEventParser";
-import { getIntegrationName } from "@lib/integrations";
-import { CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
import { serverConfig } from "@lib/serverConfig";
import {
@@ -300,7 +300,7 @@ ${getRichDescription(this.calEvent)}
}
protected getLocation(): string {
- let providerName = this.calEvent.location ? getIntegrationName(this.calEvent.location) : "";
+ let providerName = this.calEvent.location ? getAppName(this.calEvent.location) : "";
if (this.calEvent.location && this.calEvent.location.includes("integrations:")) {
const location = this.calEvent.location.split(":")[1];
diff --git a/apps/web/lib/hooks/useMediaQuery.ts b/apps/web/lib/hooks/useMediaQuery.ts
new file mode 100644
index 0000000000..9d06c75005
--- /dev/null
+++ b/apps/web/lib/hooks/useMediaQuery.ts
@@ -0,0 +1,19 @@
+import { useState, useEffect } from "react";
+
+const useMediaQuery = (query: string) => {
+ const [matches, setMatches] = useState(false);
+
+ useEffect(() => {
+ const media = window.matchMedia(query);
+ if (media.matches !== matches) {
+ setMatches(media.matches);
+ }
+ const listener = () => setMatches(media.matches);
+ window.addEventListener("resize", listener);
+ return () => window.removeEventListener("resize", listener);
+ }, [matches, query]);
+
+ return matches;
+};
+
+export default useMediaQuery;
diff --git a/apps/web/lib/integrations.ts b/apps/web/lib/integrations.ts
deleted file mode 100644
index 9556dc9866..0000000000
--- a/apps/web/lib/integrations.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-export function getIntegrationName(name: string) {
- switch (name) {
- case "google_calendar":
- return "Google Calendar";
- case "office365_calendar":
- return "Office 365 Calendar";
- case "zoom_video":
- return "Zoom";
- case "caldav_calendar":
- return "CalDav Server";
- case "stripe_payment":
- return "Stripe";
- case "apple_calendar":
- return "Apple Calendar";
- case "daily_video":
- return "Daily";
- case "jitsi_video":
- return "Jitsi Meet";
- case "huddle01_video":
- return "Huddle01";
- case "tandem_video":
- return "Tandem";
- }
-}
-
-export function getIntegrationType(name: string): string {
- if (name.endsWith("_calendar")) {
- return "Calendar";
- }
- if (name.endsWith("_payment")) {
- return "Payment";
- }
- return "Unknown";
-}
diff --git a/apps/web/lib/integrations/calendar/constants/formats.ts b/apps/web/lib/integrations/calendar/constants/formats.ts
deleted file mode 100644
index 0d5ca6feec..0000000000
--- a/apps/web/lib/integrations/calendar/constants/formats.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const TIMEZONE_FORMAT = "YYYY-MM-DDTHH:mm:ss[Z]";
diff --git a/apps/web/lib/integrations/calendar/constants/generals.ts b/apps/web/lib/integrations/calendar/constants/generals.ts
deleted file mode 100644
index 079c86b2e7..0000000000
--- a/apps/web/lib/integrations/calendar/constants/generals.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export const CALDAV_CALENDAR_TYPE = "caldav";
-
-export const APPLE_CALENDAR_URL = "https://caldav.icloud.com";
-
-export const CALENDAR_INTEGRATIONS_TYPES = {
- apple: "apple_calendar",
- caldav: "caldav_calendar",
- google: "google_calendar",
- office365: "office365_calendar",
-};
diff --git a/apps/web/lib/integrations/calendar/constants/types.ts b/apps/web/lib/integrations/calendar/constants/types.ts
deleted file mode 100644
index 1a3cb2aa24..0000000000
--- a/apps/web/lib/integrations/calendar/constants/types.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import dayjs from "dayjs";
-import ICAL from "ical.js";
-
-import AppleCalendarService from "../services/AppleCalendarService";
-import CalDavCalendarService from "../services/CalDavCalendarService";
-import GoogleCalendarService from "../services/GoogleCalendarService";
-import Office365CalendarService from "../services/Office365CalendarService";
-
-export type EventBusyDate = Record<"start" | "end", Date | string>;
-
-export type CalendarServiceType =
- | typeof AppleCalendarService
- | typeof CalDavCalendarService
- | typeof GoogleCalendarService
- | typeof Office365CalendarService;
-
-export type NewCalendarEventType = {
- uid: string;
- id: string;
- type: string;
- password: string;
- url: string;
- additionalInfo: Record;
-};
-
-export type CalendarEventType = {
- uid: string;
- etag: string;
- /** This is the actual caldav event url, not the location url. */
- url: string;
- summary: string;
- description: string;
- location: string;
- sequence: number;
- startDate: Date | dayjs.Dayjs;
- endDate: Date | dayjs.Dayjs;
- duration: {
- weeks: number;
- days: number;
- hours: number;
- minutes: number;
- seconds: number;
- isNegative: boolean;
- };
- organizer: string;
- attendees: any[][];
- recurrenceId: ICAL.Time;
- timezone: any;
-};
-
-export type BatchResponse = {
- responses: SubResponse[];
-};
-
-export type SubResponse = {
- body: { value: { start: { dateTime: string }; end: { dateTime: string } }[] };
-};
diff --git a/apps/web/lib/integrations/calendar/interfaces/GoogleCalendar.ts b/apps/web/lib/integrations/calendar/interfaces/GoogleCalendar.ts
deleted file mode 100644
index a76d26a58b..0000000000
--- a/apps/web/lib/integrations/calendar/interfaces/GoogleCalendar.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { calendar_v3 } from "googleapis";
-
-export interface ConferenceData {
- createRequest?: calendar_v3.Schema$CreateConferenceRequest;
-}
diff --git a/apps/web/lib/integrations/calendar/services/AppleCalendarService.ts b/apps/web/lib/integrations/calendar/services/AppleCalendarService.ts
deleted file mode 100644
index 1ba55ca280..0000000000
--- a/apps/web/lib/integrations/calendar/services/AppleCalendarService.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Credential } from "@prisma/client";
-
-import { APPLE_CALENDAR_URL, CALENDAR_INTEGRATIONS_TYPES } from "../constants/generals";
-import CalendarService from "./BaseCalendarService";
-
-export default class AppleCalendarService extends CalendarService {
- constructor(credential: Credential) {
- super(credential, CALENDAR_INTEGRATIONS_TYPES.apple, APPLE_CALENDAR_URL);
- }
-}
diff --git a/apps/web/lib/integrations/calendar/services/CalDavCalendarService.ts b/apps/web/lib/integrations/calendar/services/CalDavCalendarService.ts
deleted file mode 100644
index f6bc2f726f..0000000000
--- a/apps/web/lib/integrations/calendar/services/CalDavCalendarService.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Credential } from "@prisma/client";
-
-import { CALENDAR_INTEGRATIONS_TYPES } from "../constants/generals";
-import CalendarService from "./BaseCalendarService";
-
-export default class CalDavCalendarService extends CalendarService {
- constructor(credential: Credential) {
- super(credential, CALENDAR_INTEGRATIONS_TYPES.caldav);
- }
-}
diff --git a/apps/web/lib/integrations/calendar/utils/CalendarUtils.ts b/apps/web/lib/integrations/calendar/utils/CalendarUtils.ts
deleted file mode 100644
index a5927e543c..0000000000
--- a/apps/web/lib/integrations/calendar/utils/CalendarUtils.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import dayjs from "dayjs";
-import { Attendee, DateArray, DurationObject, Person } from "ics";
-
-export const convertDate = (date: string): DateArray =>
- dayjs(date)
- .utc()
- .toArray()
- .slice(0, 6)
- .map((v, i) => (i === 1 ? v + 1 : v)) as DateArray;
-
-export const getDuration = (start: string, end: string): DurationObject => ({
- minutes: dayjs(end).diff(dayjs(start), "minute"),
-});
-
-export const getAttendees = (attendees: Person[]): Attendee[] =>
- attendees.map(({ email, name }) => ({ name, email, partstat: "NEEDS-ACTION" }));
diff --git a/apps/web/lib/integrations/getIntegrations.ts b/apps/web/lib/integrations/getIntegrations.ts
deleted file mode 100644
index 62d2a52008..0000000000
--- a/apps/web/lib/integrations/getIntegrations.ts
+++ /dev/null
@@ -1,164 +0,0 @@
-import { Prisma } from "@prisma/client";
-import _ from "lodash";
-
-import { validJson } from "@lib/jsonUtils";
-
-const credentialData = Prisma.validator()({
- select: { id: true, type: true },
-});
-
-type CredentialData = Prisma.CredentialGetPayload;
-
-export type Integration = {
- installed: boolean;
- type:
- | "google_calendar"
- | "office365_calendar"
- | "zoom_video"
- | "daily_video"
- | "tandem_video"
- | "caldav_calendar"
- | "apple_calendar"
- | "stripe_payment"
- | "jitsi_video"
- | "huddle01_video"
- | "metamask_web3";
- title: string;
- imageSrc: string;
- description: string;
- variant: "calendar" | "conferencing" | "payment" | "web3";
-};
-
-export const ALL_INTEGRATIONS = [
- {
- installed: !!(process.env.GOOGLE_API_CREDENTIALS && validJson(process.env.GOOGLE_API_CREDENTIALS)),
- type: "google_calendar",
- title: "Google Calendar",
- imageSrc: "integrations/google-calendar.svg",
- description: "For personal and business calendars",
- variant: "calendar",
- },
- {
- installed: !!(process.env.MS_GRAPH_CLIENT_ID && process.env.MS_GRAPH_CLIENT_SECRET),
- type: "office365_calendar",
- title: "Office 365 / Outlook.com Calendar",
- imageSrc: "integrations/outlook.svg",
- description: "For personal and business calendars",
- variant: "calendar",
- },
- {
- installed: !!(process.env.ZOOM_CLIENT_ID && process.env.ZOOM_CLIENT_SECRET),
- type: "zoom_video",
- title: "Zoom",
- imageSrc: "integrations/zoom.svg",
- description: "Video Conferencing",
- variant: "conferencing",
- },
- {
- installed: !!process.env.DAILY_API_KEY,
- type: "daily_video",
- title: "Daily.co Video",
- imageSrc: "integrations/daily.svg",
- description: "Video Conferencing",
- variant: "conferencing",
- },
- {
- installed: true,
- type: "jitsi_video",
- title: "Jitsi Meet",
- imageSrc: "integrations/jitsi.svg",
- description: "Video Conferencing",
- variant: "conferencing",
- },
- {
- installed: true,
- type: "huddle01_video",
- title: "Huddle01",
- imageSrc: "integrations/huddle.svg",
- description: "Video Conferencing",
- variant: "conferencing",
- },
- {
- installed: !!(process.env.TANDEM_CLIENT_ID && process.env.TANDEM_CLIENT_SECRET),
- type: "tandem_video",
- title: "Tandem Video",
- imageSrc: "integrations/tandem.svg",
- description: "Virtual Office | Video Conferencing",
- variant: "conferencing",
- },
- {
- installed: true,
- type: "caldav_calendar",
- title: "CalDav Server",
- imageSrc: "integrations/caldav.svg",
- description: "For personal and business calendars",
- variant: "calendar",
- },
- {
- installed: true,
- type: "apple_calendar",
- title: "Apple Calendar",
- imageSrc: "integrations/apple-calendar.svg",
- description: "For personal and business calendars",
- variant: "calendar",
- },
- {
- installed: !!(
- process.env.STRIPE_CLIENT_ID &&
- process.env.NEXT_PUBLIC_STRIPE_PUBLIC_KEY &&
- process.env.STRIPE_PRIVATE_KEY
- ),
- type: "stripe_payment",
- title: "Stripe",
- imageSrc: "integrations/stripe.svg",
- description: "Collect payments",
- variant: "payment",
- },
- {
- installed: true,
- type: "metamask_web3",
- title: "Metamask",
- imageSrc: "integrations/apple-calendar.svg",
- description: "For personal and business calendars",
- variant: "web3",
- },
-] as Integration[];
-
-function getIntegrations(userCredentials: CredentialData[]) {
- const integrations = ALL_INTEGRATIONS.map((integration) => {
- const credentials = userCredentials
- .filter((credential) => credential.type === integration.type)
- .map((credential) => _.pick(credential, ["id", "type"])); // ensure we don't leak `key` to frontend
-
- const credential: typeof credentials[number] | null = credentials[0] || null;
- return {
- ...integration,
- /**
- * @deprecated use `credentials`
- */
- credential,
- credentials,
- };
- });
-
- return integrations;
-}
-
-export type IntegrationMeta = ReturnType;
-
-export function hasIntegration(integrations: IntegrationMeta, type: string): boolean {
- return !!integrations.find(
- (i) =>
- i.type === type &&
- !!i.installed &&
- (type === "daily_video" ||
- type === "jitsi_video" ||
- type === "huddle01_video" ||
- i.credentials.length > 0)
- );
-}
-export function hasIntegrationInstalled(type: Integration["type"]): boolean {
- return ALL_INTEGRATIONS.some((i) => i.type === type && !!i.installed);
-}
-
-export default getIntegrations;
diff --git a/apps/web/lib/queries/availability/index.ts b/apps/web/lib/queries/availability/index.ts
index 3833c05d9c..19a8eeabaa 100644
--- a/apps/web/lib/queries/availability/index.ts
+++ b/apps/web/lib/queries/availability/index.ts
@@ -1,10 +1,10 @@
-// import { getBusyVideoTimes } from "@lib/videoClient";
import { Prisma } from "@prisma/client";
import dayjs from "dayjs";
+import { getBusyCalendarTimes } from "@calcom/core/CalendarManager";
+
import { asStringOrNull } from "@lib/asStringOrNull";
import { getWorkingHours } from "@lib/availability";
-import { getBusyCalendarTimes } from "@lib/integrations/calendar/CalendarManager";
import prisma from "@lib/prisma";
export async function getUserAvailability(query: {
@@ -67,8 +67,6 @@ export async function getUserAvailability(query: {
selectedCalendars
);
- // busyTimes.push(...await getBusyVideoTimes(currentUser.credentials, dateFrom.format(), dateTo.format()));
-
const bufferedBusyTimes = busyTimes.map((a) => ({
start: dayjs(a.start).subtract(currentUser.bufferTime, "minute").toString(),
end: dayjs(a.end).add(currentUser.bufferTime, "minute").toString(),
diff --git a/apps/web/lib/random.ts b/apps/web/lib/random.ts
index b817524fa3..998205392b 100644
--- a/apps/web/lib/random.ts
+++ b/apps/web/lib/random.ts
@@ -1,9 +1,2 @@
-export const randomString = function (length = 12) {
- let result = "";
- const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- const charactersLength = characters.length;
- for (let i = 0; i < length; i++) {
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
- }
- return result;
-};
+// TODO: Remove this file once everything is imported from `@calcom/lib`
+export * from "@calcom/lib/random";
diff --git a/apps/web/lib/timeFormat.ts b/apps/web/lib/timeFormat.ts
index 6ce6408b04..f4ce15e8d5 100644
--- a/apps/web/lib/timeFormat.ts
+++ b/apps/web/lib/timeFormat.ts
@@ -6,7 +6,7 @@
*/
export const isBrowserLocale24h = () => {
let locale = "en-US";
- if (process.browser && navigator) locale = navigator?.language;
+ if (typeof window !== "undefined" && navigator) locale = navigator?.language;
return !new Intl.DateTimeFormat(locale, { hour: "numeric" }).format(0).match(/AM/);
};
export const detectBrowserTimeFormat = isBrowserLocale24h() ? "H:mm" : "h:mma";
diff --git a/apps/web/lib/webhooks/sendPayload.tsx b/apps/web/lib/webhooks/sendPayload.tsx
index e9dbc3c62c..f201e76d7c 100644
--- a/apps/web/lib/webhooks/sendPayload.tsx
+++ b/apps/web/lib/webhooks/sendPayload.tsx
@@ -1,6 +1,6 @@
import { compile } from "handlebars";
-import { CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
+import type { CalendarEvent } from "@calcom/types/Calendar";
type ContentType = "application/json" | "application/x-www-form-urlencoded";
diff --git a/apps/web/next.config.js b/apps/web/next.config.js
index 71f7cf9e57..56430fc635 100644
--- a/apps/web/next.config.js
+++ b/apps/web/next.config.js
@@ -1,4 +1,6 @@
const withTM = require("next-transpile-modules")([
+ "@calcom/app-store",
+ "@calcom/core",
"@calcom/ee",
"@calcom/lib",
"@calcom/prisma",
diff --git a/apps/web/package.json b/apps/web/package.json
index 6a654176c2..2e64d0dd12 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -27,6 +27,8 @@
},
"dependencies": {
"@boxyhq/saml-jackson": "0.3.6",
+ "@calcom/app-store": "*",
+ "@calcom/core": "*",
"@calcom/ee": "*",
"@calcom/lib": "*",
"@calcom/prisma": "*",
@@ -34,6 +36,7 @@
"@calcom/tsconfig": "*",
"@calcom/ui": "*",
"@daily-co/daily-js": "^0.21.0",
+ "@glidejs/glide": "^3.5.2",
"@heroicons/react": "^1.0.5",
"@hookform/error-message": "^2.0.0",
"@hookform/resolvers": "^2.8.5",
@@ -100,19 +103,19 @@
"short-uuid": "^4.2.0",
"stripe": "^8.191.0",
"superjson": "1.8.1",
- "tsdav": "2.0.0",
- "tslog": "^3.2.1",
"uuid": "^8.3.2",
"web3": "^1.6.1",
"zod": "^3.8.2"
},
"devDependencies": {
"@calcom/config": "*",
+ "@calcom/types": "*",
"@microsoft/microsoft-graph-types-beta": "0.15.0-preview",
"@playwright/test": "^1.18.1",
"@types/accept-language-parser": "1.5.2",
"@types/async": "^3.2.10",
"@types/bcryptjs": "^2.4.2",
+ "@types/glidejs__glide": "^3.4.1",
"@types/jest": "^27.0.3",
"@types/lodash": "^4.14.177",
"@types/micro": "^7.3.6",
diff --git a/apps/web/pages/_error.tsx b/apps/web/pages/_error.tsx
index b7edbec8cb..9b52f31cc6 100644
--- a/apps/web/pages/_error.tsx
+++ b/apps/web/pages/_error.tsx
@@ -7,9 +7,9 @@ import NextError, { ErrorProps } from "next/error";
import React from "react";
import { getErrorFromUnknown } from "@calcom/lib/errors";
+import logger from "@calcom/lib/logger";
import { HttpError } from "@lib/core/http/error";
-import logger from "@lib/logger";
import { ErrorPage } from "@components/error/error-page";
diff --git a/apps/web/pages/api/auth/[...nextauth].tsx b/apps/web/pages/api/auth/[...nextauth].tsx
index e2ca2f0854..33dd77875a 100644
--- a/apps/web/pages/api/auth/[...nextauth].tsx
+++ b/apps/web/pages/api/auth/[...nextauth].tsx
@@ -5,8 +5,9 @@ import CredentialsProvider from "next-auth/providers/credentials";
import GoogleProvider from "next-auth/providers/google";
import { authenticator } from "otplib";
+import { symmetricDecrypt } from "@calcom/lib/crypto";
+
import { ErrorCode, verifyPassword } from "@lib/auth";
-import { symmetricDecrypt } from "@lib/crypto";
import prisma from "@lib/prisma";
import { randomString } from "@lib/random";
import { isSAMLLoginEnabled, samlLoginUrl, hostedCal } from "@lib/saml";
diff --git a/apps/web/pages/api/auth/two-factor/totp/enable.ts b/apps/web/pages/api/auth/two-factor/totp/enable.ts
index c04a295318..91aca8239a 100644
--- a/apps/web/pages/api/auth/two-factor/totp/enable.ts
+++ b/apps/web/pages/api/auth/two-factor/totp/enable.ts
@@ -1,8 +1,9 @@
import { NextApiRequest, NextApiResponse } from "next";
import { authenticator } from "otplib";
+import { symmetricDecrypt } from "@calcom/lib/crypto";
+
import { ErrorCode, getSession } from "@lib/auth";
-import { symmetricDecrypt } from "@lib/crypto";
import prisma from "@lib/prisma";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
diff --git a/apps/web/pages/api/auth/two-factor/totp/setup.ts b/apps/web/pages/api/auth/two-factor/totp/setup.ts
index e5b6a01ed5..f785113d21 100644
--- a/apps/web/pages/api/auth/two-factor/totp/setup.ts
+++ b/apps/web/pages/api/auth/two-factor/totp/setup.ts
@@ -3,8 +3,9 @@ import { NextApiRequest, NextApiResponse } from "next";
import { authenticator } from "otplib";
import qrcode from "qrcode";
+import { symmetricEncrypt } from "@calcom/lib/crypto";
+
import { ErrorCode, getSession, verifyPassword } from "@lib/auth";
-import { symmetricEncrypt } from "@lib/crypto";
import prisma from "@lib/prisma";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
diff --git a/apps/web/pages/api/availability/[user].ts b/apps/web/pages/api/availability/[user].ts
index 4ae595ee60..aa001df945 100644
--- a/apps/web/pages/api/availability/[user].ts
+++ b/apps/web/pages/api/availability/[user].ts
@@ -1,13 +1,14 @@
-// import { getBusyVideoTimes } from "@lib/videoClient";
+// import { getBusyVideoTimes } from "@calcom/core/videoClient";
import { Prisma } from "@prisma/client";
import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";
import type { NextApiRequest, NextApiResponse } from "next";
+import { getBusyCalendarTimes } from "@calcom/core/CalendarManager";
+
import { asStringOrNull } from "@lib/asStringOrNull";
import { getWorkingHours } from "@lib/availability";
-import { getBusyCalendarTimes } from "@lib/integrations/calendar/CalendarManager";
import prisma from "@lib/prisma";
dayjs.extend(utc);
diff --git a/apps/web/pages/api/availability/calendar.ts b/apps/web/pages/api/availability/calendar.ts
index a8f4c64d92..259dbd03df 100644
--- a/apps/web/pages/api/availability/calendar.ts
+++ b/apps/web/pages/api/availability/calendar.ts
@@ -1,8 +1,9 @@
import type { NextApiRequest, NextApiResponse } from "next";
+import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager";
+import notEmpty from "@calcom/lib/notEmpty";
+
import { getSession } from "@lib/auth";
-import { getCalendarCredentials, getConnectedCalendars } from "@lib/integrations/calendar/CalendarManager";
-import notEmpty from "@lib/notEmpty";
import prisma from "@lib/prisma";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
diff --git a/apps/web/pages/api/book/confirm.ts b/apps/web/pages/api/book/confirm.ts
index 77c05317e3..3e39bde53c 100644
--- a/apps/web/pages/api/book/confirm.ts
+++ b/apps/web/pages/api/book/confirm.ts
@@ -1,15 +1,16 @@
import { Prisma, User, Booking, SchedulingType, BookingStatus } from "@prisma/client";
import type { NextApiRequest, NextApiResponse } from "next";
+import EventManager from "@calcom/core/EventManager";
+import logger from "@calcom/lib/logger";
+import type { AdditionInformation } from "@calcom/types/Calendar";
+import type { CalendarEvent } from "@calcom/types/Calendar";
import { refund } from "@ee/lib/stripe/server";
import { asStringOrNull } from "@lib/asStringOrNull";
import { getSession } from "@lib/auth";
import { sendDeclinedEmails } from "@lib/emails/email-manager";
import { sendScheduledEmails } from "@lib/emails/email-manager";
-import EventManager from "@lib/events/EventManager";
-import { CalendarEvent, AdditionInformation } from "@lib/integrations/calendar/interfaces/Calendar";
-import logger from "@lib/logger";
import prisma from "@lib/prisma";
import { BookingConfirmBody } from "@lib/types/booking";
diff --git a/apps/web/pages/api/book/event.ts b/apps/web/pages/api/book/event.ts
index 8f1363e9a0..b9b933d348 100644
--- a/apps/web/pages/api/book/event.ts
+++ b/apps/web/pages/api/book/event.ts
@@ -9,27 +9,27 @@ import type { NextApiRequest, NextApiResponse } from "next";
import short from "short-uuid";
import { v5 as uuidv5 } from "uuid";
+import { getBusyCalendarTimes } from "@calcom/core/CalendarManager";
+import EventManager from "@calcom/core/EventManager";
+import { getBusyVideoTimes } from "@calcom/core/videoClient";
import { getErrorFromUnknown } from "@calcom/lib/errors";
+import logger from "@calcom/lib/logger";
+import notEmpty from "@calcom/lib/notEmpty";
+import type { BufferedBusyTime } from "@calcom/types/BufferedBusyTime";
+import type { AdditionInformation, CalendarEvent, EventBusyDate } from "@calcom/types/Calendar";
+import type { EventResult, PartialReference } from "@calcom/types/EventManager";
import { handlePayment } from "@ee/lib/stripe/server";
import {
- sendScheduledEmails,
- sendRescheduledEmails,
- sendOrganizerRequestEmail,
sendAttendeeRequestEmail,
+ sendOrganizerRequestEmail,
+ sendRescheduledEmails,
+ sendScheduledEmails,
} from "@lib/emails/email-manager";
import { ensureArray } from "@lib/ensureArray";
import { getEventName } from "@lib/event";
-import EventManager, { EventResult, PartialReference } from "@lib/events/EventManager";
-import { getBusyCalendarTimes } from "@lib/integrations/calendar/CalendarManager";
-import { EventBusyDate } from "@lib/integrations/calendar/constants/types";
-import { CalendarEvent, AdditionInformation } from "@lib/integrations/calendar/interfaces/Calendar";
-import { BufferedBusyTime } from "@lib/integrations/calendar/interfaces/Office365Calendar";
-import logger from "@lib/logger";
-import notEmpty from "@lib/notEmpty";
import prisma from "@lib/prisma";
import { BookingCreateBody } from "@lib/types/booking";
-import { getBusyVideoTimes } from "@lib/videoClient";
import sendPayload from "@lib/webhooks/sendPayload";
import getSubscribers from "@lib/webhooks/subscriptions";
diff --git a/apps/web/pages/api/cancel.ts b/apps/web/pages/api/cancel.ts
index dbeb4f4e43..c0977be385 100644
--- a/apps/web/pages/api/cancel.ts
+++ b/apps/web/pages/api/cancel.ts
@@ -1,18 +1,18 @@
-import { BookingStatus, WebhookTriggerEvents } from "@prisma/client";
+import { BookingStatus, Credential, WebhookTriggerEvents } from "@prisma/client";
import async from "async";
import dayjs from "dayjs";
import { NextApiRequest, NextApiResponse } from "next";
+import { FAKE_DAILY_CREDENTIAL } from "@calcom/app-store/dailyvideo/lib/VideoApiAdapter";
+import { getCalendar } from "@calcom/core/CalendarManager";
+import { deleteMeeting } from "@calcom/core/videoClient";
+import type { CalendarEvent } from "@calcom/types/Calendar";
import { refund } from "@ee/lib/stripe/server";
import { asStringOrNull } from "@lib/asStringOrNull";
import { getSession } from "@lib/auth";
import { sendCancelledEmails } from "@lib/emails/email-manager";
-import { FAKE_DAILY_CREDENTIAL } from "@lib/integrations/Daily/DailyVideoApiAdapter";
-import { getCalendar } from "@lib/integrations/calendar/CalendarManager";
-import { CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
import prisma from "@lib/prisma";
-import { deleteMeeting } from "@lib/videoClient";
import sendPayload from "@lib/webhooks/sendPayload";
import getSubscribers from "@lib/webhooks/subscriptions";
@@ -159,11 +159,12 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
},
});
+ /** TODO: Remove this without breaking functionality */
if (bookingToDelete.location === "integrations:daily") {
bookingToDelete.user.credentials.push(FAKE_DAILY_CREDENTIAL);
}
- const apiDeletes = async.mapLimit(bookingToDelete.user.credentials, 5, async (credential) => {
+ const apiDeletes = async.mapLimit(bookingToDelete.user.credentials, 5, async (credential: Credential) => {
const bookingRefUid = bookingToDelete.references.filter((ref) => ref.type === credential.type)[0]?.uid;
if (bookingRefUid) {
if (credential.type.endsWith("_calendar")) {
diff --git a/apps/web/pages/api/cron/bookingReminder.ts b/apps/web/pages/api/cron/bookingReminder.ts
index e68c2f2ade..f553ffa9e6 100644
--- a/apps/web/pages/api/cron/bookingReminder.ts
+++ b/apps/web/pages/api/cron/bookingReminder.ts
@@ -2,8 +2,9 @@ import { ReminderType } from "@prisma/client";
import dayjs from "dayjs";
import type { NextApiRequest, NextApiResponse } from "next";
+import type { CalendarEvent } from "@calcom/types/Calendar";
+
import { sendOrganizerRequestReminderEmail } from "@lib/emails/email-manager";
-import { CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
import prisma from "@lib/prisma";
import { getTranslation } from "@server/lib/i18n";
diff --git a/apps/web/pages/api/integrations/[...args].ts b/apps/web/pages/api/integrations/[...args].ts
new file mode 100644
index 0000000000..8edfec1286
--- /dev/null
+++ b/apps/web/pages/api/integrations/[...args].ts
@@ -0,0 +1,46 @@
+import { NextApiRequest, NextApiResponse } from "next";
+
+import appStore from "@calcom/app-store";
+
+import { getSession } from "@lib/auth";
+import { HttpError } from "@lib/core/http/error";
+
+const handler = async (req: NextApiRequest, res: NextApiResponse) => {
+ // Check that user is authenticated
+ req.session = await getSession({ req });
+
+ if (!req.session?.user?.id) {
+ res.status(401).json({ message: "You must be logged in to do this" });
+ return;
+ }
+
+ const { args } = req.query;
+
+ if (!Array.isArray(args)) {
+ return res.status(404).json({ message: `API route not found` });
+ }
+
+ const [_appName, apiEndpoint] = args;
+ const appName = _appName.split("_").join(""); // Transform `zoom_video` to `zoomvideo`;
+
+ try {
+ // TODO: Find a way to dynamically import these modules
+ // const app = (await import(`@calcom/${appName}`)).default;
+ const handler = appStore[appName].api[apiEndpoint];
+ if (typeof handler !== "function")
+ throw new HttpError({ statusCode: 404, message: `API handler not found` });
+
+ const response = await handler(req, res);
+ console.log("response", response);
+
+ res.status(200);
+ } catch (error) {
+ console.error(error);
+ if (error instanceof HttpError) {
+ return res.status(error.statusCode).json({ message: error.message });
+ }
+ return res.status(404).json({ message: `API handler not found` });
+ }
+};
+
+export default handler;
diff --git a/apps/web/pages/api/integrations/stripepayment/add.ts b/apps/web/pages/api/integrations/stripepayment/add.ts
deleted file mode 100644
index 1ad56d5efa..0000000000
--- a/apps/web/pages/api/integrations/stripepayment/add.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from "@ee/pages/api/integrations/stripepayment/add";
diff --git a/apps/web/pages/api/integrations/stripepayment/callback.ts b/apps/web/pages/api/integrations/stripepayment/callback.ts
deleted file mode 100644
index 49122d7682..0000000000
--- a/apps/web/pages/api/integrations/stripepayment/callback.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from "@ee/pages/api/integrations/stripepayment/callback";
diff --git a/apps/web/pages/api/integrations/stripepayment/portal.ts b/apps/web/pages/api/integrations/stripepayment/portal.ts
deleted file mode 100644
index eca9d1d0ec..0000000000
--- a/apps/web/pages/api/integrations/stripepayment/portal.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from "@ee/pages/api/integrations/stripepayment/portal";
diff --git a/apps/web/pages/api/integrations/types.d.ts b/apps/web/pages/api/integrations/types.d.ts
deleted file mode 100644
index bcdc5dde05..0000000000
--- a/apps/web/pages/api/integrations/types.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export type IntegrationOAuthCallbackState = {
- returnTo: string;
-};
diff --git a/apps/web/pages/api/integrations/utils.ts b/apps/web/pages/api/integrations/utils.ts
deleted file mode 100644
index 8353ac4379..0000000000
--- a/apps/web/pages/api/integrations/utils.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { NextApiRequest } from "next";
-
-import { IntegrationOAuthCallbackState } from "./types";
-
-export function encodeOAuthState(req: NextApiRequest) {
- if (typeof req.query.state !== "string") {
- return undefined;
- }
- const state: IntegrationOAuthCallbackState = JSON.parse(req.query.state);
-
- return JSON.stringify(state);
-}
-
-export function decodeOAuthState(req: NextApiRequest) {
- if (typeof req.query.state !== "string") {
- return undefined;
- }
- const state: IntegrationOAuthCallbackState = JSON.parse(req.query.state);
-
- return state;
-}
diff --git a/apps/web/pages/apps/[slug].tsx b/apps/web/pages/apps/[slug].tsx
new file mode 100644
index 0000000000..70fb094e5b
--- /dev/null
+++ b/apps/web/pages/apps/[slug].tsx
@@ -0,0 +1,68 @@
+import { GetStaticPaths, GetStaticPathsResult, GetStaticPropsContext } from "next";
+
+import { getAppRegistry } from "@calcom/app-store/_appRegistry";
+
+import { inferSSRProps } from "@lib/types/inferSSRProps";
+
+import App from "@components/App";
+
+function SingleAppPage({ data }: inferSSRProps) {
+ return (
+
+ );
+}
+
+export const getStaticPaths: GetStaticPaths<{ slug: string }> = async () => {
+ const appStore = getAppRegistry();
+ const paths = appStore.reduce((paths, app) => {
+ paths.push({ params: { slug: app.slug } });
+ return paths;
+ }, [] as GetStaticPathsResult<{ slug: string }>["paths"]);
+
+ return {
+ paths,
+ fallback: false,
+ };
+};
+
+export const getStaticProps = async (ctx: GetStaticPropsContext) => {
+ const appStore = getAppRegistry();
+
+ if (typeof ctx.params?.slug !== "string") {
+ return {
+ notFound: true,
+ };
+ }
+
+ const singleApp = appStore.find((app) => app.slug === ctx.params?.slug);
+
+ if (!singleApp) {
+ return {
+ notFound: true,
+ };
+ }
+
+ return {
+ props: {
+ data: singleApp,
+ },
+ };
+};
+
+export default SingleAppPage;
diff --git a/apps/web/pages/apps/categories/[category].tsx b/apps/web/pages/apps/categories/[category].tsx
new file mode 100644
index 0000000000..637cb3dd5f
--- /dev/null
+++ b/apps/web/pages/apps/categories/[category].tsx
@@ -0,0 +1,70 @@
+import { ChevronLeftIcon } from "@heroicons/react/solid";
+import { InferGetStaticPropsType } from "next";
+import { useRouter } from "next/router";
+
+import { getAppRegistry } from "@calcom/app-store/_appRegistry";
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import Button from "@calcom/ui/Button";
+
+import Shell from "@components/Shell";
+import AppCard from "@components/apps/AppCard";
+
+export default function Apps({ appStore }: InferGetStaticPropsType) {
+ const { t } = useLocale();
+ const router = useRouter();
+
+ return (
+
+
+
+
+
+
+
+
All {router.query.category} apps
+
+ {appStore.map((app) => {
+ return (
+ app.category === router.query.category && (
+
+ )
+ );
+ })}
+
+
+
+ );
+}
+
+export const getStaticPaths = async () => {
+ const appStore = getAppRegistry();
+ const paths = appStore.reduce((categories, app) => {
+ if (!categories.includes(app.category)) {
+ categories.push(app.category);
+ }
+ return categories;
+ }, [] as string[]);
+
+ return {
+ paths: paths.map((category) => ({ params: { category } })),
+ fallback: false,
+ };
+};
+
+export const getStaticProps = async () => {
+ return {
+ props: {
+ appStore: getAppRegistry(),
+ },
+ };
+};
diff --git a/apps/web/pages/apps/index.tsx b/apps/web/pages/apps/index.tsx
new file mode 100644
index 0000000000..74cc08bb5a
--- /dev/null
+++ b/apps/web/pages/apps/index.tsx
@@ -0,0 +1,40 @@
+import { InferGetStaticPropsType } from "next";
+
+import { getAppRegistry } from "@calcom/app-store/_appRegistry";
+
+import { useLocale } from "@lib/hooks/useLocale";
+
+import AppsShell from "@components/AppsShell";
+import Shell from "@components/Shell";
+import AllApps from "@components/apps/AllApps";
+import AppStoreCategories from "@components/apps/Categories";
+import Slider from "@components/apps/Slider";
+
+export default function Apps({ appStore, categories }: InferGetStaticPropsType) {
+ const { t } = useLocale();
+
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export const getStaticProps = async () => {
+ const appStore = getAppRegistry();
+ const categories = appStore.reduce((c, app) => {
+ c[app.category] = c[app.category] ? c[app.category] + 1 : 1;
+ return c;
+ }, {} as Record);
+
+ return {
+ props: {
+ categories: Object.entries(categories).map(([name, count]) => ({ name, count })),
+ appStore,
+ },
+ };
+};
diff --git a/apps/web/pages/integrations/index.tsx b/apps/web/pages/apps/installed.tsx
similarity index 86%
rename from apps/web/pages/integrations/index.tsx
rename to apps/web/pages/apps/installed.tsx
index aeddc900a7..54ef5aa0cf 100644
--- a/apps/web/pages/integrations/index.tsx
+++ b/apps/web/pages/apps/installed.tsx
@@ -3,7 +3,9 @@ import Image from "next/image";
import React, { useEffect, useState } from "react";
import { JSONObject } from "superjson/dist/types";
+import { InstallAppButton } from "@calcom/app-store/components";
import showToast from "@calcom/lib/notification";
+import { App } from "@calcom/types/App";
import { Alert } from "@calcom/ui/Alert";
import Button from "@calcom/ui/Button";
@@ -18,7 +20,6 @@ import { List, ListItem, ListItemText, ListItemTitle } from "@components/List";
import Loader from "@components/Loader";
import Shell, { ShellSubHeading } from "@components/Shell";
import { CalendarListContainer } from "@components/integrations/CalendarListContainer";
-import ConnectIntegration from "@components/integrations/ConnectIntegrations";
import DisconnectIntegration from "@components/integrations/DisconnectIntegration";
import IntegrationListItem from "@components/integrations/IntegrationListItem";
import SubHeadingTitleWithConnections from "@components/integrations/SubHeadingTitleWithConnections";
@@ -41,7 +42,7 @@ function IframeEmbedContainer() {
-
+
{t("standard_iframe")}
{t("embed_your_calendar")}
@@ -66,7 +67,7 @@ function IframeEmbedContainer() {
-
+
{t("responsive_fullscreen_iframe")}
A fullscreen scheduling experience on your website
@@ -108,7 +109,8 @@ function IframeEmbedContainer() {
function ConnectOrDisconnectIntegrationButton(props: {
//
credentialIds: number[];
- type: string;
+ type: App["type"];
+ isGlobal?: boolean;
installed: boolean;
}) {
const { t } = useLocale();
@@ -139,7 +141,7 @@ function ConnectOrDisconnectIntegrationButton(props: {
);
}
/** We don't need to "Connect", just show that it's installed */
- if (["daily_video", "huddle01_video", "jitsi_video"].includes(props.type)) {
+ if (props.isGlobal) {
return (
{t("installed")}
@@ -147,14 +149,14 @@ function ConnectOrDisconnectIntegrationButton(props: {
);
}
return (
-
(
-
+ render={(buttonProps) => (
+
{t("connect")}
)}
- onOpenChange={handleOpenChange}
+ onChanged={handleOpenChange}
/>
);
}
@@ -179,8 +181,17 @@ function IntegrationsContainer() {
{data.conferencing.items.map((item) => (
}
+ title={item.title}
+ imageSrc={item.imageSrc}
+ description={item.description}
+ actions={
+
+ }
/>
))}
@@ -195,8 +206,17 @@ function IntegrationsContainer() {
{data.payment.items.map((item) => (
}
+ imageSrc={item.imageSrc}
+ title={item.title}
+ description={item.description}
+ actions={
+
+ }
/>
))}
@@ -215,7 +235,7 @@ function Web3Container() {
-
+
MetaMask (
@@ -286,7 +306,7 @@ export default function IntegrationsPage() {
const { t } = useLocale();
return (
-
+
}>
diff --git a/apps/web/pages/apps/nuke-my-cal.tsx b/apps/web/pages/apps/nuke-my-cal.tsx
new file mode 100644
index 0000000000..0260b43d40
--- /dev/null
+++ b/apps/web/pages/apps/nuke-my-cal.tsx
@@ -0,0 +1,118 @@
+import showToast from "@calcom/lib/notification";
+
+import App from "@components/App";
+
+export default function NukeMyCal() {
+ return (
+
+
+
+ Have an emergency? Need to reschedule all of your upcoming calendar events? Just click{" "}
+ Nuke my Cal and auto-reschedule the entire day. Give it a try!
+
+
+ Demo:
+
+
+ (
+ new Audio("/apps/nuke-my-cal.wav").play(),
+ showToast("All of your calendar events for today have been rescheduled", "success")
+ )}
+ className="pushable">
+
+
+ Nuke my Cal
+
+ >
+ }
+ />
+ );
+}
diff --git a/apps/web/pages/event-types/[type].tsx b/apps/web/pages/event-types/[type].tsx
index 90f1081356..c8ae197249 100644
--- a/apps/web/pages/event-types/[type].tsx
+++ b/apps/web/pages/event-types/[type].tsx
@@ -13,8 +13,7 @@ import {
UsersIcon,
} from "@heroicons/react/solid";
import { zodResolver } from "@hookform/resolvers/zod";
-import { MembershipRole } from "@prisma/client";
-import { EventTypeCustomInput, PeriodType, Prisma, SchedulingType } from "@prisma/client";
+import { EventTypeCustomInput, MembershipRole, PeriodType, Prisma, SchedulingType } from "@prisma/client";
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@radix-ui/react-collapsible";
import * as RadioGroup from "@radix-ui/react-radio-group";
import classNames from "classnames";
@@ -30,6 +29,7 @@ import Select, { Props as SelectProps } from "react-select";
import { JSONObject } from "superjson/dist/types";
import { z } from "zod";
+import getApps, { getLocationOptions, hasIntegration } from "@calcom/app-store/utils";
import showToast from "@calcom/lib/notification";
import { StripeData } from "@calcom/stripe/server";
import Button from "@calcom/ui/Button";
@@ -42,7 +42,6 @@ import { asStringOrThrow, asStringOrUndefined } from "@lib/asStringOrNull";
import { getSession } from "@lib/auth";
import { HttpError } from "@lib/core/http/error";
import { useLocale } from "@lib/hooks/useLocale";
-import getIntegrations, { hasIntegration } from "@lib/integrations/getIntegrations";
import { LocationType } from "@lib/location";
import prisma from "@lib/prisma";
import { slugify } from "@lib/slugify";
@@ -346,6 +345,7 @@ const EventTypePage = (props: inferSSRProps) => {
);
case LocationType.Phone:
return {t("cal_invitee_phone_number_scheduling")}
;
+ /* TODO: Render this dynamically from App Store */
case LocationType.GoogleMeet:
return {t("cal_provide_google_meet_location")}
;
case LocationType.Zoom:
@@ -358,6 +358,8 @@ const EventTypePage = (props: inferSSRProps) => {
return {t("cal_provide_huddle01_meeting_url")}
;
case LocationType.Tandem:
return {t("cal_provide_tandem_meeting_url")}
;
+ case LocationType.Teams:
+ return {t("cal_provide_teams_meeting_url")}
;
default:
return null;
}
@@ -701,6 +703,78 @@ const EventTypePage = (props: inferSSRProps) => {
Jitsi Meet
)}
+ {location.type === LocationType.Teams && (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
MS Teams
+
+ )}
) => {
setShowLocationModal(true)}>
{t("add_location")}
@@ -1529,7 +1603,7 @@ const EventTypePage = (props: inferSSRProps) => {
-
+
id: true,
type: true,
key: true,
+ userId: true,
},
});
@@ -1872,17 +1947,9 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
eventType.users.push(fallbackUser);
}
- const integrations = getIntegrations(credentials);
+ const integrations = getApps(credentials);
+ const locationOptions = getLocationOptions(integrations);
- const locationOptions: OptionTypeBase[] = [];
-
- if (hasIntegration(integrations, "zoom_video")) {
- locationOptions.push({
- value: LocationType.Zoom,
- label: "Zoom Video",
- disabled: true,
- });
- }
const hasPaymentIntegration = hasIntegration(integrations, "stripe_payment");
if (hasIntegration(integrations, "google_calendar")) {
locationOptions.push({
@@ -1890,27 +1957,6 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
label: "Google Meet",
});
}
- if (hasIntegration(integrations, "daily_video")) {
- locationOptions.push({
- value: LocationType.Daily,
- label: "Daily.co Video",
- });
- }
- if (hasIntegration(integrations, "jitsi_video")) {
- locationOptions.push({
- value: LocationType.Jitsi,
- label: "Jitsi Meet",
- });
- }
- if (hasIntegration(integrations, "huddle01_video")) {
- locationOptions.push({
- value: LocationType.Huddle01,
- label: "Huddle01 Video",
- });
- }
- if (hasIntegration(integrations, "tandem_video")) {
- locationOptions.push({ value: LocationType.Tandem, label: "Tandem Video" });
- }
const currency =
(credentials.find((integration) => integration.type === "stripe_payment")?.key as unknown as StripeData)
?.default_currency || "usd";
diff --git a/apps/web/pages/getting-started.tsx b/apps/web/pages/getting-started.tsx
index 56be27dd63..0ef6f8c1ba 100644
--- a/apps/web/pages/getting-started.tsx
+++ b/apps/web/pages/getting-started.tsx
@@ -17,6 +17,8 @@ import { useForm } from "react-hook-form";
import TimezoneSelect from "react-timezone-select";
import * as z from "zod";
+import getApps from "@calcom/app-store/utils";
+import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager";
import { Alert } from "@calcom/ui/Alert";
import Button from "@calcom/ui/Button";
import { Form } from "@calcom/ui/form/fields";
@@ -25,8 +27,6 @@ import { asStringOrNull } from "@lib/asStringOrNull";
import { getSession } from "@lib/auth";
import { DEFAULT_SCHEDULE } from "@lib/availability";
import { useLocale } from "@lib/hooks/useLocale";
-import { getCalendarCredentials, getConnectedCalendars } from "@lib/integrations/calendar/CalendarManager";
-import getIntegrations from "@lib/integrations/getIntegrations";
import prisma from "@lib/prisma";
import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
import { trpc } from "@lib/trpc";
@@ -676,10 +676,11 @@ export async function getServerSideProps(context: NextPageContext) {
id: true,
type: true,
key: true,
+ userId: true,
},
});
- const integrations = getIntegrations(credentials)
+ const integrations = getApps(credentials)
.filter((item) => item.type.endsWith("_calendar"))
.map((item) => omit(item, "key"));
diff --git a/apps/web/pages/integrations/[integration].tsx b/apps/web/pages/integrations/[integration].tsx
deleted file mode 100644
index 1d431eed67..0000000000
--- a/apps/web/pages/integrations/[integration].tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-function RedirectPage() {
- return null;
-}
-
-export async function getServerSideProps() {
- return { redirect: { permanent: false, destination: "/integrations" } };
-}
-
-export default RedirectPage;
diff --git a/apps/web/playwright/booking-pages.test.ts b/apps/web/playwright/booking-pages.test.ts
index cbed0460c8..b727607ee6 100644
--- a/apps/web/playwright/booking-pages.test.ts
+++ b/apps/web/playwright/booking-pages.test.ts
@@ -1,8 +1,15 @@
-import { expect, test } from "@playwright/test";
+import { expect, Page, test } from "@playwright/test";
import { deleteAllBookingsByEmail } from "./lib/teardown";
import { selectFirstAvailableTimeSlotNextMonth, todo } from "./lib/testUtils";
+const bookTimeSlot = async (page: Page) => {
+ // --- fill form
+ await page.fill('[name="name"]', "Test Testson");
+ await page.fill('[name="email"]', "test@example.com");
+ await page.press('[name="email"]', "Enter");
+};
+
test.describe("free user", () => {
test.beforeEach(async ({ page }) => {
await page.goto("/free");
@@ -34,15 +41,8 @@ test.describe("free user", () => {
// save booking url
const bookingUrl: string = page.url();
- const bookTimeSlot = async () => {
- // --- fill form
- await page.fill('[name="name"]', "Test Testson");
- await page.fill('[name="email"]', "test@example.com");
- await page.press('[name="email"]', "Enter");
- };
-
// book same time spot twice
- await bookTimeSlot();
+ await bookTimeSlot(page);
// Make sure we're navigated to the success page
await page.waitForNavigation({
@@ -55,7 +55,7 @@ test.describe("free user", () => {
await page.goto(bookingUrl);
// book same time spot again
- await bookTimeSlot();
+ await bookTimeSlot(page);
// check for error message
await expect(page.locator("[data-testid=booking-fail]")).toBeVisible();
@@ -86,10 +86,7 @@ test.describe("pro user", () => {
// Click first event type
await page.click('[data-testid="event-type-link"]');
await selectFirstAvailableTimeSlotNextMonth(page);
- // --- fill form
- await page.fill('[name="name"]', "Test Testson");
- await page.fill('[name="email"]', "test@example.com");
- await page.press('[name="email"]', "Enter");
+ await bookTimeSlot(page);
// Make sure we're navigated to the success page
await page.waitForNavigation({
diff --git a/apps/web/playwright/integrations-stripe.test.ts b/apps/web/playwright/integrations-stripe.test.ts
index 14a7e51479..f2a2f52cca 100644
--- a/apps/web/playwright/integrations-stripe.test.ts
+++ b/apps/web/playwright/integrations-stripe.test.ts
@@ -1,21 +1,26 @@
import { expect, test } from "@playwright/test";
-import { hasIntegrationInstalled } from "../lib/integrations/getIntegrations";
import * as teardown from "./lib/teardown";
import { selectFirstAvailableTimeSlotNextMonth, todo } from "./lib/testUtils";
+const IS_STRIPE_ENABLED = !!(
+ process.env.STRIPE_CLIENT_ID &&
+ process.env.NEXT_PUBLIC_STRIPE_PUBLIC_KEY &&
+ process.env.STRIPE_PRIVATE_KEY
+);
+
test.describe.serial("Stripe integration", () => {
test.afterAll(() => {
teardown.deleteAllPaymentsByEmail("pro@example.com");
teardown.deleteAllBookingsByEmail("pro@example.com");
});
- test.skip(!hasIntegrationInstalled("stripe_payment"), "It should only run if Stripe is installed");
+ test.skip(!IS_STRIPE_ENABLED, "It should only run if Stripe is installed");
test.describe.serial("Stripe integration dashboard", () => {
test.use({ storageState: "playwright/artifacts/proStorageState.json" });
test("Can add Stripe integration", async ({ page }) => {
- await page.goto("/integrations");
+ await page.goto("/apps/installed");
/** We should see the "Connect" button for Stripe */
await expect(
page.locator(`li:has-text("Stripe") >> [data-testid="integration-connection-button"]`)
@@ -28,7 +33,7 @@ test.describe.serial("Stripe integration", () => {
]);
await Promise.all([
- page.waitForNavigation({ url: "/integrations" }),
+ page.waitForNavigation({ url: "/apps/installed" }),
/** We skip filling Stripe forms (testing mode only) */
page.click('[id="skip-account-app"]'),
]);
diff --git a/apps/web/playwright/integrations.test.ts b/apps/web/playwright/integrations.test.ts
index 1d2089c537..cf3d2d6d4c 100644
--- a/apps/web/playwright/integrations.test.ts
+++ b/apps/web/playwright/integrations.test.ts
@@ -12,7 +12,7 @@ test.describe("integrations", () => {
test.use({ storageState: "playwright/artifacts/proStorageState.json" });
test.beforeEach(async ({ page }) => {
- await page.goto("/integrations");
+ await page.goto("/apps/installed");
});
todo("Can add Zoom integration");
diff --git a/apps/web/public/integrations/apple-calendar.svg b/apps/web/public/apps/apple-calendar.svg
similarity index 100%
rename from apps/web/public/integrations/apple-calendar.svg
rename to apps/web/public/apps/apple-calendar.svg
diff --git a/apps/web/public/integrations/caldav.svg b/apps/web/public/apps/caldav.svg
similarity index 100%
rename from apps/web/public/integrations/caldav.svg
rename to apps/web/public/apps/caldav.svg
diff --git a/apps/web/public/integrations/daily.svg b/apps/web/public/apps/daily.svg
similarity index 100%
rename from apps/web/public/integrations/daily.svg
rename to apps/web/public/apps/daily.svg
diff --git a/apps/web/public/integrations/embed.svg b/apps/web/public/apps/embed.svg
similarity index 100%
rename from apps/web/public/integrations/embed.svg
rename to apps/web/public/apps/embed.svg
diff --git a/apps/web/public/integrations/google-calendar.svg b/apps/web/public/apps/google-calendar.svg
similarity index 100%
rename from apps/web/public/integrations/google-calendar.svg
rename to apps/web/public/apps/google-calendar.svg
diff --git a/apps/web/public/integrations/huddle.svg b/apps/web/public/apps/huddle.svg
similarity index 100%
rename from apps/web/public/integrations/huddle.svg
rename to apps/web/public/apps/huddle.svg
diff --git a/apps/web/public/integrations/jitsi.svg b/apps/web/public/apps/jitsi.svg
similarity index 100%
rename from apps/web/public/integrations/jitsi.svg
rename to apps/web/public/apps/jitsi.svg
diff --git a/apps/web/public/integrations/metamask.svg b/apps/web/public/apps/metamask.svg
similarity index 100%
rename from apps/web/public/integrations/metamask.svg
rename to apps/web/public/apps/metamask.svg
diff --git a/apps/web/public/integrations/microsoft-teams.svg b/apps/web/public/apps/microsoft-teams.svg
similarity index 100%
rename from apps/web/public/integrations/microsoft-teams.svg
rename to apps/web/public/apps/microsoft-teams.svg
diff --git a/apps/web/public/apps/msteams.svg b/apps/web/public/apps/msteams.svg
new file mode 100644
index 0000000000..3409e6cfae
--- /dev/null
+++ b/apps/web/public/apps/msteams.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/public/apps/nuke-my-cal.svg b/apps/web/public/apps/nuke-my-cal.svg
new file mode 100644
index 0000000000..56a9166287
--- /dev/null
+++ b/apps/web/public/apps/nuke-my-cal.svg
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+ Open Clip Art Library
+
+
+ one eyed sun
+ 2011-07-10T22:19:30
+ my mom came up with the name for this!
+ http://openclipart.org/detail/148927/one-eyed-sun-by-10binary
+
+
+ 10binary
+
+
+
+
+ clip art
+ clipart
+ eyed
+ one
+ sun
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/public/integrations/outlook.svg b/apps/web/public/apps/outlook.svg
similarity index 100%
rename from apps/web/public/integrations/outlook.svg
rename to apps/web/public/apps/outlook.svg
diff --git a/apps/web/public/integrations/stripe.svg b/apps/web/public/apps/stripe.svg
similarity index 100%
rename from apps/web/public/integrations/stripe.svg
rename to apps/web/public/apps/stripe.svg
diff --git a/apps/web/public/integrations/tandem.svg b/apps/web/public/apps/tandem.svg
similarity index 100%
rename from apps/web/public/integrations/tandem.svg
rename to apps/web/public/apps/tandem.svg
diff --git a/apps/web/public/integrations/web3.svg b/apps/web/public/apps/web3.svg
similarity index 100%
rename from apps/web/public/integrations/web3.svg
rename to apps/web/public/apps/web3.svg
diff --git a/apps/web/public/integrations/webhooks.svg b/apps/web/public/apps/webhooks.svg
similarity index 100%
rename from apps/web/public/integrations/webhooks.svg
rename to apps/web/public/apps/webhooks.svg
diff --git a/apps/web/public/integrations/zapier.svg b/apps/web/public/apps/zapier.svg
similarity index 100%
rename from apps/web/public/integrations/zapier.svg
rename to apps/web/public/apps/zapier.svg
diff --git a/apps/web/public/integrations/zoom.svg b/apps/web/public/apps/zoom.svg
similarity index 100%
rename from apps/web/public/integrations/zoom.svg
rename to apps/web/public/apps/zoom.svg
diff --git a/apps/web/public/integrations/go-to-meeting.svg b/apps/web/public/integrations/go-to-meeting.svg
deleted file mode 100644
index f18c92d4b4..0000000000
--- a/apps/web/public/integrations/go-to-meeting.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json
index 2ecc5fa3b8..41c2429634 100644
--- a/apps/web/public/static/locales/en/common.json
+++ b/apps/web/public/static/locales/en/common.json
@@ -583,6 +583,7 @@
"cal_provide_video_meeting_url": "Cal will provide a Daily video meeting URL.",
"cal_provide_jitsi_meeting_url": "We will generate a Jitsi Meet URL for you.",
"cal_provide_huddle01_meeting_url": "Cal will provide a Huddle01 web3 video meeting URL.",
+ "cal_provide_teams_meeting_url": "Cal will provide a MS Teams meeting URL. NOTE: MUST HAVE A WORK OR SCHOOL ACCOUNT",
"require_payment": "Require Payment",
"commission_per_transaction": "commission per transaction",
"event_type_updated_successfully_description": "Your event type has been updated successfully.",
@@ -608,6 +609,9 @@
"confirm_delete_account": "Yes, delete account",
"delete_account_confirmation_message": "Are you sure you want to delete your Cal.com account? Anyone who you've shared your account link with will no longer be able to book using it and any preferences you have saved will be lost.",
"integrations": "Integrations",
+ "apps": "Apps",
+ "app_store": "App Store",
+ "app_store_description": "Connecting people, technology and the workplace.",
"settings": "Settings",
"event_type_moved_successfully": "Event type has been moved successfully",
"next_step": "Skip step",
@@ -655,6 +659,24 @@
"import_from": "Import from",
"access_token": "Access token",
"visit_roadmap": "Roadmap",
+ "popular_categories": "Popular Categories",
+ "trending_apps": "Trending Apps",
+ "all_apps": "All Apps",
+ "installed_apps": "Installed Apps",
+ "manage_your_connected_apps": "Manage your connected apps",
+ "browse_apps": "Browse Apps",
+ "features": "Features",
+ "permissions": "Permissions",
+ "terms_and_privacy": "Terms and Privacy",
+ "published_by": "Published by {{author}}",
+ "subscribe": "Subscribe",
+ "buy": "Buy",
+ "install_app": "Install App",
+ "categories": "Categories",
+ "pricing": "Pricing",
+ "learn_more": "Learn more",
+ "privacy_policy": "Privacy Policy",
+ "terms_of_service": "Terms of Service",
"remove": "Remove",
"add": "Add",
"verify_wallet": "Verify Wallet",
diff --git a/apps/web/server/createContext.ts b/apps/web/server/createContext.ts
index 5acb5903fc..4c4ef8b42b 100644
--- a/apps/web/server/createContext.ts
+++ b/apps/web/server/createContext.ts
@@ -54,6 +54,7 @@ async function getUserFromSession({
id: true,
type: true,
key: true,
+ userId: true,
},
orderBy: {
id: "asc",
diff --git a/apps/web/server/routers/viewer.tsx b/apps/web/server/routers/viewer.tsx
index 5708fadb5b..cf420afe60 100644
--- a/apps/web/server/routers/viewer.tsx
+++ b/apps/web/server/routers/viewer.tsx
@@ -3,11 +3,11 @@ import _ from "lodash";
import { JSONObject } from "superjson/dist/types";
import { z } from "zod";
+import getApps from "@calcom/app-store/utils";
+import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager";
import { checkPremiumUsername } from "@calcom/ee/lib/core/checkPremiumUsername";
import { checkRegularUsername } from "@lib/core/checkRegularUsername";
-import { getCalendarCredentials, getConnectedCalendars } from "@lib/integrations/calendar/CalendarManager";
-import { ALL_INTEGRATIONS } from "@lib/integrations/getIntegrations";
import jackson from "@lib/jackson";
import {
isSAMLLoginEnabled,
@@ -519,16 +519,16 @@ const loggedInViewerRouter = createProtectedRouter()
function countActive(items: { credentialIds: unknown[] }[]) {
return items.reduce((acc, item) => acc + item.credentialIds.length, 0);
}
- const integrations = ALL_INTEGRATIONS.map((integration) => ({
- ...integration,
- credentialIds: credentials
- .filter((credential) => credential.type === integration.type)
- .map((credential) => credential.id),
- }));
+ const apps = getApps(credentials).map(
+ ({ credentials: _, credential: _1 /* don't leak to frontend */, ...app }) => ({
+ ...app,
+ credentialIds: credentials.filter((c) => c.type === app.type).map((c) => c.id),
+ })
+ );
// `flatMap()` these work like `.filter()` but infers the types correctly
- const conferencing = integrations.flatMap((item) => (item.variant === "conferencing" ? [item] : []));
- const payment = integrations.flatMap((item) => (item.variant === "payment" ? [item] : []));
- const calendar = integrations.flatMap((item) => (item.variant === "calendar" ? [item] : []));
+ const conferencing = apps.flatMap((item) => (item.variant === "conferencing" ? [item] : []));
+ const payment = apps.flatMap((item) => (item.variant === "payment" ? [item] : []));
+ const calendar = apps.flatMap((item) => (item.variant === "calendar" ? [item] : []));
return {
conferencing: {
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
index 535881752a..a79b70b08a 100644
--- a/apps/web/tsconfig.json
+++ b/apps/web/tsconfig.json
@@ -9,9 +9,15 @@
"@ee/*": ["ee/*"],
"@prisma/client/*": ["@calcom/prisma/client/*"]
},
- "typeRoots": ["./types"],
+ "typeRoots": ["./types", "@calcom/types"],
"types": ["@types/jest"]
},
- "include": ["next-env.d.ts", "@types/*.d.ts", "**/*.ts", "**/*.tsx"],
+ "include": [
+ "next-env.d.ts",
+ "../../packages/types/*.d.ts",
+ "../../packages/types/next-auth.d.ts",
+ "**/*.ts",
+ "**/*.tsx"
+ ],
"exclude": ["node_modules"]
}
diff --git a/apps/web/yarn.lock b/apps/web/yarn.lock
index 69346ee7f5..79ff7b9d31 100644
--- a/apps/web/yarn.lock
+++ b/apps/web/yarn.lock
@@ -9,17 +9,17 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
- integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
dependencies:
- "@babel/highlight" "^7.16.0"
+ "@babel/highlight" "^7.16.7"
-"@babel/compat-data@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa"
- integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==
+"@babel/compat-data@^7.16.4":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60"
+ integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==
"@babel/core@7.13.10":
version "7.13.10"
@@ -43,41 +43,20 @@
semver "^6.3.0"
source-map "^0.5.0"
-"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4"
- integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==
+"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.8", "@babel/core@^7.7.5":
+ version "7.16.12"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784"
+ integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==
dependencies:
- "@babel/code-frame" "^7.16.0"
- "@babel/generator" "^7.16.0"
- "@babel/helper-compilation-targets" "^7.16.0"
- "@babel/helper-module-transforms" "^7.16.0"
- "@babel/helpers" "^7.16.0"
- "@babel/parser" "^7.16.0"
- "@babel/template" "^7.16.0"
- "@babel/traverse" "^7.16.0"
- "@babel/types" "^7.16.0"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.2"
- json5 "^2.1.2"
- semver "^6.3.0"
- source-map "^0.5.0"
-
-"@babel/core@^7.14.8":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.5.tgz#924aa9e1ae56e1e55f7184c8bf073a50d8677f5c"
- integrity sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==
- dependencies:
- "@babel/code-frame" "^7.16.0"
- "@babel/generator" "^7.16.5"
- "@babel/helper-compilation-targets" "^7.16.3"
- "@babel/helper-module-transforms" "^7.16.5"
- "@babel/helpers" "^7.16.5"
- "@babel/parser" "^7.16.5"
- "@babel/template" "^7.16.0"
- "@babel/traverse" "^7.16.5"
- "@babel/types" "^7.16.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.16.8"
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.16.7"
+ "@babel/helpers" "^7.16.7"
+ "@babel/parser" "^7.16.12"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.16.10"
+ "@babel/types" "^7.16.8"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@@ -356,89 +335,84 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.10.tgz#8f8f9bf7b3afa3eabd061f7a5bcdf4fec3c48409"
integrity sha512-0s7Mlrw9uTWkYua7xWr99Wpk2bnGa0ANleKfksYAES8LpWH4gW1OUr42vqKNf0us5UQNfru2wPqMqRITzq/SIQ==
-"@babel/parser@^7.1.0", "@babel/parser@^7.13.0", "@babel/parser@^7.13.10", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0":
- version "7.16.2"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac"
- integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==
-
-"@babel/parser@^7.16.5":
- version "7.16.6"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314"
- integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==
+"@babel/parser@^7.1.0", "@babel/parser@^7.13.0", "@babel/parser@^7.13.10", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7":
+ version "7.16.12"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6"
+ integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==
"@babel/plugin-proposal-class-properties@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz#3269f44b89122110f6339806e05d43d84106468a"
- integrity sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0"
+ integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.5"
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-create-class-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-proposal-dynamic-import@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz#2e0d19d5702db4dcb9bc846200ca02f2e9d60e9e"
- integrity sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2"
+ integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-proposal-export-namespace-from@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz#3b4dd28378d1da2fea33e97b9f25d1c2f5bf1ac9"
- integrity sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163"
+ integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-proposal-logical-assignment-operators@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz#df1f2e4b5a0ec07abf061d2c18e53abc237d3ef5"
- integrity sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea"
+ integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz#652555bfeeeee2d2104058c6225dc6f75e2d0f07"
- integrity sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99"
+ integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
"@babel/plugin-proposal-numeric-separator@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz#edcb6379b6cf4570be64c45965d8da7a2debf039"
- integrity sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9"
+ integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-proposal-optional-chaining@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz#a5fa61056194d5059366c0009cb9a9e66ed75c1f"
- integrity sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a"
+ integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
"@babel/plugin-proposal-private-methods@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz#2086f7d78c1b0c712d49b5c3fbc2d1ca21a7ee12"
- integrity sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==
+ version "7.16.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50"
+ integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.5"
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-create-class-features-plugin" "^7.16.10"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-proposal-private-property-in-object@^7.14.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz#a42d4b56005db3d405b12841309dbca647e7a21b"
- integrity sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce"
+ integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.0"
- "@babel/helper-create-class-features-plugin" "^7.16.5"
- "@babel/helper-plugin-utils" "^7.16.5"
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-async-generators@^7.8.4":
@@ -644,34 +618,19 @@
globals "^11.1.0"
lodash "^4.17.19"
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b"
- integrity sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7":
+ version "7.16.10"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f"
+ integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==
dependencies:
- "@babel/code-frame" "^7.16.0"
- "@babel/generator" "^7.16.0"
- "@babel/helper-function-name" "^7.16.0"
- "@babel/helper-hoist-variables" "^7.16.0"
- "@babel/helper-split-export-declaration" "^7.16.0"
- "@babel/parser" "^7.16.0"
- "@babel/types" "^7.16.0"
- debug "^4.1.0"
- globals "^11.1.0"
-
-"@babel/traverse@^7.16.5":
- version "7.16.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3"
- integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==
- dependencies:
- "@babel/code-frame" "^7.16.0"
- "@babel/generator" "^7.16.5"
- "@babel/helper-environment-visitor" "^7.16.5"
- "@babel/helper-function-name" "^7.16.0"
- "@babel/helper-hoist-variables" "^7.16.0"
- "@babel/helper-split-export-declaration" "^7.16.0"
- "@babel/parser" "^7.16.5"
- "@babel/types" "^7.16.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.16.8"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.16.10"
+ "@babel/types" "^7.16.8"
debug "^4.1.0"
globals "^11.1.0"
@@ -770,16 +729,16 @@
fast-equals "^1.6.3"
lodash "^4.17.15"
-"@emotion/cache@^11.4.0", "@emotion/cache@^11.5.0":
- version "11.5.0"
- resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.5.0.tgz#a5eb78cbef8163939ee345e3ddf0af217b845e62"
- integrity sha512-mAZ5QRpLriBtaj/k2qyrXwck6yeoz1V5lMt/jfj6igWU35yYlNKs2LziXVgvH81gnJZ+9QQNGelSsnuoAy6uIw==
+"@emotion/cache@^11.4.0", "@emotion/cache@^11.7.1":
+ version "11.7.1"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.7.1.tgz#08d080e396a42e0037848214e8aa7bf879065539"
+ integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==
dependencies:
"@emotion/memoize" "^0.7.4"
- "@emotion/sheet" "^1.0.3"
+ "@emotion/sheet" "^1.1.0"
"@emotion/utils" "^1.0.0"
"@emotion/weak-memoize" "^0.2.5"
- stylis "^4.0.10"
+ stylis "4.0.13"
"@emotion/hash@^0.8.0":
version "0.8.0"
@@ -792,14 +751,14 @@
integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
"@emotion/react@^11.1.1":
- version "11.5.0"
- resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.5.0.tgz#19b5771bbfbda5e8517e948a2d9064810f0022bd"
- integrity sha512-MYq/bzp3rYbee4EMBORCn4duPQfgpiEB5XzrZEBnUZAL80Qdfr7CEv/T80jwaTl/dnZmt9SnTa8NkTrwFNpLlw==
+ version "11.7.1"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.7.1.tgz#3f800ce9b20317c13e77b8489ac4a0b922b2fe07"
+ integrity sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==
dependencies:
"@babel/runtime" "^7.13.10"
- "@emotion/cache" "^11.5.0"
+ "@emotion/cache" "^11.7.1"
"@emotion/serialize" "^1.0.2"
- "@emotion/sheet" "^1.0.3"
+ "@emotion/sheet" "^1.1.0"
"@emotion/utils" "^1.0.0"
"@emotion/weak-memoize" "^0.2.5"
hoist-non-react-statics "^3.3.1"
@@ -815,10 +774,10 @@
"@emotion/utils" "^1.0.0"
csstype "^3.0.2"
-"@emotion/sheet@^1.0.3":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.3.tgz#00c326cd7985c5ccb8fe2c1b592886579dcfab8f"
- integrity sha512-YoX5GyQ4db7LpbmXHMuc8kebtBGP6nZfRC5Z13OKJMixBEwdZrJ914D6yJv/P+ZH/YY3F5s89NYX2hlZAf3SRQ==
+"@emotion/sheet@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2"
+ integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==
"@emotion/unitless@^0.7.5":
version "0.7.5"
@@ -1042,80 +1001,85 @@
"@ethersproject/properties" "^5.5.0"
"@ethersproject/strings" "^5.5.0"
-"@formatjs/ecma402-abstract@1.10.0":
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.10.0.tgz#f51b9167535c9463113c24644de90262aa5d31a7"
- integrity sha512-WNkcUHC6xw12rWY87TUw6KXzb1LnOooYBLLqtyn1kW2j197rcwpqmUOJMBED56YcLzaJPfVw1L2ShiDhL5pVnQ==
+"@formatjs/ecma402-abstract@1.11.2":
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.2.tgz#7f01595e6985a28983aae26bede9b78b273fee3d"
+ integrity sha512-qDgOL0vtfJ51cc0pRbFB/oXc4qDbamG22Z6h/QWy6FBxaQgppiy8JF0iYbmNO35cC8r88bQGsgfd/eM6/eTEQQ==
dependencies:
- "@formatjs/intl-localematcher" "0.2.21"
+ "@formatjs/intl-localematcher" "0.2.23"
tslib "^2.1.0"
-"@formatjs/fast-memoize@1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.0.tgz#1123bfcc5d21d761f15d8b1c32d10e1b6530355d"
- integrity sha512-fObitP9Tlc31SKrPHgkPgQpGo4+4yXfQQITTCNH8AZdEqB7Mq4nPrjpUL/tNGN3lEeJcFxDbi0haX8HM7QvQ8w==
+"@formatjs/fast-memoize@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz#e6f5aee2e4fd0ca5edba6eba7668e2d855e0fc21"
+ integrity sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==
dependencies:
tslib "^2.1.0"
-"@formatjs/icu-messageformat-parser@2.0.14":
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.14.tgz#d794af24e4896f4d2b400e28c25b1ba72604c106"
- integrity sha512-M79MdUMLnfLK8eMrznUwke6afH9G/eOQeYvMUJ7uElXIL+//PyyjOzb42hAYfDAGYsAcKA2TsUo33Yuy2lE4AQ==
+"@formatjs/icu-messageformat-parser@2.0.17":
+ version "2.0.17"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.17.tgz#0f817aa06d3b9f23ae0a8bd667b5d7785df5017c"
+ integrity sha512-GO4DzmyiDUyT4p9UxSlOcdnRL1CCt43oHBBGe21s5043UjP6dwMbOotugKs1bRiN+FrNrRUSW+TLdT3+4CBI5A==
dependencies:
- "@formatjs/ecma402-abstract" "1.10.0"
- "@formatjs/icu-skeleton-parser" "1.3.1"
+ "@formatjs/ecma402-abstract" "1.11.2"
+ "@formatjs/icu-skeleton-parser" "1.3.4"
tslib "^2.1.0"
-"@formatjs/icu-skeleton-parser@1.3.1":
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.1.tgz#02ad3209cb518096b830582068a322fee050adcf"
- integrity sha512-WdPNjhv9e7EfyrIVYk6hN6/mC9YF+PcfFViDI2kATwoi1uKHr+AkQCMoNrWyCDdUQ+Dn50mQOlrEkCBXoLrkPQ==
+"@formatjs/icu-skeleton-parser@1.3.4":
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.4.tgz#5508ff60cce4eb4698917cb50cb9ff576dde6e5b"
+ integrity sha512-BbKjX3rF3hq2bRjI9NjnSPUrNqI1TwwbMomOBamWfAkpOEf4LYEezPL9tHEds/+sN2/82Z+qEmK7s/l9G2J+qA==
dependencies:
- "@formatjs/ecma402-abstract" "1.10.0"
+ "@formatjs/ecma402-abstract" "1.11.2"
tslib "^2.1.0"
-"@formatjs/intl-displaynames@5.2.5":
- version "5.2.5"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-5.2.5.tgz#c8cb4983a3ce3bdc18d11e22cffc7dad9ceb3050"
- integrity sha512-iYlce/hG31ohJOwpv3yhOiEIwEBMqOt2kzA2BQTx1ra8ferBn4WlTxkouoDNiAKEBD1LFYZBIC25jsSJUJOEbg==
+"@formatjs/intl-displaynames@5.4.1":
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-5.4.1.tgz#09a4b956468a3a1ed332b93f380546ed02dac431"
+ integrity sha512-a95nwJcTM5xRsdwC1Y4msjXPINA6dbDsI043VPlSJRpUtBHWcvdSKvPDZP+KgB9RmR3zYfbJof5BSyPsAHK65w==
dependencies:
- "@formatjs/ecma402-abstract" "1.10.0"
- "@formatjs/intl-localematcher" "0.2.21"
+ "@formatjs/ecma402-abstract" "1.11.2"
+ "@formatjs/intl-localematcher" "0.2.23"
tslib "^2.1.0"
-"@formatjs/intl-listformat@6.3.5":
- version "6.3.5"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-6.3.5.tgz#9631b6853e3b6cdedff371e132b310d259a6410f"
- integrity sha512-GtiMMx5RB/gID7ydGr+i1lRbGu728plTfT196X151cE2PYEqC05BEuHQFlE1rcUGC2+RfFqlvmipYcbOqJTQug==
+"@formatjs/intl-listformat@6.5.1":
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-6.5.1.tgz#609ebba0cf7301989a261f8c239ec3e46f02ffca"
+ integrity sha512-ijsOM7J7aNnGx+1JYUGWgMAcisnK0CxdlPx7KJpUXKj9Mf2Ph28H2WMTL1h1xv9T7SSvH0Nd6asI0Qw4ffw17w==
dependencies:
- "@formatjs/ecma402-abstract" "1.10.0"
- "@formatjs/intl-localematcher" "0.2.21"
+ "@formatjs/ecma402-abstract" "1.11.2"
+ "@formatjs/intl-localematcher" "0.2.23"
tslib "^2.1.0"
-"@formatjs/intl-localematcher@0.2.21":
- version "0.2.21"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.21.tgz#39ef33d701fe8084f3d693cd3ff7cbe03cdd3a49"
- integrity sha512-JTJeLiNwexN4Gy0cMxoUPvJbKhXdnSuo5jPrDafEZpnDWlJ5VDYta8zUVVozO/pwzEmFVHEUpgiEDj+39L4oMg==
+"@formatjs/intl-localematcher@0.2.23":
+ version "0.2.23"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.23.tgz#5a0b1d81df1f392ecf37e556ca7040a7ec9f72e8"
+ integrity sha512-oCe2TOciTtB1bEbJ85EvYrXQxD0epusmVJfJ7AduO0tlbXP42CmDIYIH2CZ+kP2GE+PTLQD1Hbt9kpOpl939MQ==
dependencies:
tslib "^2.1.0"
-"@formatjs/intl@1.16.0":
- version "1.16.0"
- resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.16.0.tgz#118388adc0566532d8739039f64d288ef12b1665"
- integrity sha512-LdOAHbg6FJz6mV5SQBMyB8D6/qHoatdoG2eke2Z2uVIFG4kgIG9ytJ4bVQ+5UMrn06StR3T5XxDKV7gg9nR6Ng==
+"@formatjs/intl@1.18.4":
+ version "1.18.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.18.4.tgz#034b99949a1bf18ac7d8d1dff2b5fb3cdbca6c48"
+ integrity sha512-1l93aCrAWRoK8KPD6W5Re9f3XUuNwMuxP12ZFebiG/Wb3eqTASIl9yTUoHwa/FJlNTL1JBRs4PYGCxKeqOod2w==
dependencies:
- "@formatjs/ecma402-abstract" "1.10.0"
- "@formatjs/fast-memoize" "1.2.0"
- "@formatjs/icu-messageformat-parser" "2.0.14"
- "@formatjs/intl-displaynames" "5.2.5"
- "@formatjs/intl-listformat" "6.3.5"
- intl-messageformat "9.9.6"
+ "@formatjs/ecma402-abstract" "1.11.2"
+ "@formatjs/fast-memoize" "1.2.1"
+ "@formatjs/icu-messageformat-parser" "2.0.17"
+ "@formatjs/intl-displaynames" "5.4.1"
+ "@formatjs/intl-listformat" "6.5.1"
+ intl-messageformat "9.11.3"
tslib "^2.1.0"
+"@glidejs/glide@^3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@glidejs/glide/-/glide-3.5.2.tgz#7012c5920ecf202bbda44d8526fc979984b6dd54"
+ integrity sha512-7jGciNJ2bQ4eZLSNlSZ+VAyW63kALf420CvkEpK4lEsUfWJq9odqimci0YCiyNyMUFB+pWHwLYyNc57dijYsCg==
+
"@headlessui/react@^1.4.2":
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.4.2.tgz#87e264f190dbebbf8dfdd900530da973dad24576"
- integrity sha512-N8tv7kLhg9qGKBkVdtg572BvKvWhmiudmeEpOCyNwzOsZHCXBtl8AazGikIfUS+vBoub20Fse3BjawXDVPPdug==
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.4.3.tgz#f77c6bb5cb4a614a5d730fb880cab502d48abf37"
+ integrity sha512-n2IQkaaw0aAAlQS5MEXsM4uRK+w18CrM72EqnGRl/UBOQeQajad8oiKXR9Nk15jOzTFQjpxzrZMf1NxHidFBiw==
"@heroicons/react@^1.0.5":
version "1.0.5"
@@ -1322,23 +1286,23 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
-"@jest/transform@^27.3.1":
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.3.1.tgz#ff80eafbeabe811e9025e4b6f452126718455220"
- integrity sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ==
+"@jest/transform@^27.4.6":
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.6.tgz#153621940b1ed500305eacdb31105d415dc30231"
+ integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==
dependencies:
"@babel/core" "^7.1.0"
- "@jest/types" "^27.2.5"
- babel-plugin-istanbul "^6.0.0"
+ "@jest/types" "^27.4.2"
+ babel-plugin-istanbul "^6.1.1"
chalk "^4.0.0"
convert-source-map "^1.4.0"
fast-json-stable-stringify "^2.0.0"
graceful-fs "^4.2.4"
- jest-haste-map "^27.3.1"
- jest-regex-util "^27.0.6"
- jest-util "^27.3.1"
+ jest-haste-map "^27.4.6"
+ jest-regex-util "^27.4.0"
+ jest-util "^27.4.2"
micromatch "^4.0.4"
- pirates "^4.0.1"
+ pirates "^4.0.4"
slash "^3.0.0"
source-map "^0.6.1"
write-file-atomic "^3.0.0"
@@ -1354,18 +1318,7 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
-"@jest/types@^27.2.5":
- version "27.2.5"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132"
- integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==
- dependencies:
- "@types/istanbul-lib-coverage" "^2.0.0"
- "@types/istanbul-reports" "^3.0.0"
- "@types/node" "*"
- "@types/yargs" "^16.0.0"
- chalk "^4.0.0"
-
-"@jest/types@^27.4.2":
+"@jest/types@^27.2.5", "@jest/types@^27.4.2":
version "27.4.2"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5"
integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==
@@ -1667,9 +1620,9 @@
regenerator-runtime "^0.13.3"
"@jitsu/sdk-js@^2.2.4":
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/@jitsu/sdk-js/-/sdk-js-2.2.5.tgz#319a18d57592aeb8b450739b807a2f3567ab91bc"
- integrity sha512-ltoOqmIgbaSp66qTG+zDPPBYtARVP6VbLM4XY5YarInbicEG+J0KS99WC15P6kvo7N/kXJ2UDGbF3AQrnFJD3A==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@jitsu/sdk-js/-/sdk-js-2.3.0.tgz#bedaa0d2419336b8154907f48f2d4b3779344cdc"
+ integrity sha512-NOoZdJQhSHv7g7evPUjnzqBKaJ0pQTRKicq511zLbaaIU/okJoLPXSzS+Z4XLI919o5rT1ME/STzaIYSr4Fwbg==
"@metamask/object-multiplex@^1.1.0":
version "1.2.0"
@@ -1715,70 +1668,70 @@
dependencies:
webpack-bundle-analyzer "4.3.0"
-"@next/env@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.9.tgz#4c9e9eef00226145d9629a846b8cc31878e1328c"
- integrity sha512-oBlkyDop0Stf7MPIzETGv5r0YT/G/weBrknoPOUTaa5qwOeGjuy6gsOVc/SBtrBkOoBmRpD+fFhQJPvmo1mS+g==
+"@next/env@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.10.tgz#561640fd62279218ccd2798ae907bae8d94a7730"
+ integrity sha512-mQVj0K6wQ5WEk/sL9SZ+mJXJUaG7el8CpZ6io1uFe9GgNTSC7EgUyNGqM6IQovIFc5ukF4O/hqsdh3S/DCgT2g==
-"@next/swc-android-arm64@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.9.tgz#2cdbcc1814471044ea0e057b475090d25654833c"
- integrity sha512-aVqgsEn5plmUH2X58sjzhHsH/6majucWTMaaBEs7hHO2+GCwCZc7zaLH4XCBMKPES9Yaja8/pYUbvZQE9DqgFw==
+"@next/swc-android-arm64@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.0.10.tgz#fd9d716433cc9d361021b0052f8b002bcaff948d"
+ integrity sha512-xYwXGkNhzZZsM5MD7KRwF5ZNiC8OLPtVMUiagpPnwENg8Hb0GSQo/NbYWXM8YrawEwp9LaZ7OXiuRKPh2JyBdA==
-"@next/swc-darwin-arm64@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.9.tgz#ea200929d7116de12c6f3b13ff75f9522c2153e3"
- integrity sha512-uAgRKm4a2nVdyBiPPJokvmDD1saugOvxljz9ld2ih0CCg5S9vBhqaj3kPGCQBj9hSu3q+Lng2CHnQqG3ga1jzA==
+"@next/swc-darwin-arm64@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.10.tgz#34b2d0dc62eb89efb9176af111e3820a11fdb3f0"
+ integrity sha512-f2zngulkpIJKWHckhRi7X8GZ+J/tNgFF7lYIh7Qx15JH0OTBsjkqxORlkzy+VZyHJ5sWTCaI6HYYd3ow6qkEEg==
-"@next/swc-darwin-x64@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.9.tgz#32800a7a9aff4bfd2038b0bce3657ece8708a87b"
- integrity sha512-fDOs2lZIyrAdU18IxMA5orBPn9qLbOdu55gXSTNZOhyRJ8ugtbUAejsK7OL0boJy0CCHPAdVRXm01Mwk8tZ9RQ==
+"@next/swc-darwin-x64@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.10.tgz#a4306795159293c7d4d58a2c88ce1710ff0a8baa"
+ integrity sha512-Qykcu/gVC5oTvOQoRBhyuS5GYm5SbcgrFTsaLFkGBmEkg9eMQRiaCswk4IafpDXVzITkVFurzSM28q3tLW2qUw==
-"@next/swc-linux-arm-gnueabihf@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.9.tgz#da012dfb69ad2abc3d4045395581b650048bdd7c"
- integrity sha512-/ni0p9DBvATUML9RQ1ycQuf05uOYKdzA6iI8+eRsARjpGbFVUFbge7XPzlj9g2Q9YWgoN8CSjFGnKRlyky5uHA==
+"@next/swc-linux-arm-gnueabihf@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.10.tgz#1ad15af3d5fca2fef57894d61e16f73aee61ec2e"
+ integrity sha512-EhqrTFsIXAXN9B/fiiW/QKUK/lSLCXRsLalkUp58KDfMqVLLlj1ORbESAcswiNQOChLuHQSldGEEtOBPQZcd9A==
-"@next/swc-linux-arm64-gnu@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.9.tgz#fe704c0a1cb048ef19d4a24b2c990574c96c933b"
- integrity sha512-AphxilJDf95rUxJDHgM9Ww1DaYXZWqTvoKwXeej/0SgSvICcRZrLaFDrkojdXz0Rxr4igX2OdYR1S4/Hj1jWOQ==
+"@next/swc-linux-arm64-gnu@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.10.tgz#a84a92d0e1a179c4346c9ed8f22e26f708101ad6"
+ integrity sha512-kqGtC72g3+JYXZbY2ca6digXR5U6AQ6Dzv4eAxYluMePLHjI/Xye1mf9dwVsgmeXfrD/IRDp5K/3A6UNvBm4oQ==
-"@next/swc-linux-arm64-musl@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.9.tgz#b2bb68940903cd64f7875979ed9907e946dc4f3e"
- integrity sha512-K5jbvNNzF3mRjWmPdxP5Bg87i7FHivfBj/L0KJlxpkLSC8sffBJDmB6jtMnI7wiPj9J6vmLkbGtSosln78xAlQ==
+"@next/swc-linux-arm64-musl@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.10.tgz#973ec96c77f845bd0a6eecbf1892caa1ee4defaf"
+ integrity sha512-bG9zTSNwnSgc1Un/7oz1ZVN4UeXsTWrsQhAGWU78lLLCn4Zj9HQoUCRCGLt0OVs2DBZ+WC8CzzFliQ1SKipVbg==
-"@next/swc-linux-x64-gnu@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.9.tgz#b700ba095551d4f6e830b92d4593a3b6e73bba82"
- integrity sha512-bJZ9bkMkQzsY+UyWezEZ77GWQ4TzwKeXdayX3U3+aEkL8k5C6eKBXlidWdrhu0teLmaUXIyWerWrLnJzwGXdfw==
+"@next/swc-linux-x64-gnu@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.10.tgz#efcc7f8252ea8225834760eaf09350f1bead73f7"
+ integrity sha512-c79PcfWtyThiYRa1+3KVfDq0zXaI8o1d6dQWNVqDrtLz5HKM/rbjLdvoNuxDwUeZhxI/d9CtyH6GbuKPw5l/5A==
-"@next/swc-linux-x64-musl@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.9.tgz#678460266f544b52f1190ef0c3494e436608591e"
- integrity sha512-SR9p0R+v1T32DTXPVAXZw31pmJAkSDotC6Afy+mfC0xrEL3pp95R8sGXYAAUCEPkQp0MEeUOVy2LrToe92X7hQ==
+"@next/swc-linux-x64-musl@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.10.tgz#c2a73d939dfd310acc1892a0a132762500dd5757"
+ integrity sha512-g/scgn+21/MLfizOCZOZt+MxNj2/8Tdlwjvy+QZcSUPZRUI2Y5o3HwBvI1f/bSci+NGRU+bUAO0NFtRJ9MzH5w==
-"@next/swc-win32-arm64-msvc@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.9.tgz#f70e5bd0821ca168aeef117e51ab870265ceeeb1"
- integrity sha512-mzQ1A8vfHhJrvEy5KJZGZWEByXthyKfWofvFaf+oo/5nJl/0Bz1ODP2ajSmbLG++77Eo2AROgbm9pkW1ucvG2A==
+"@next/swc-win32-arm64-msvc@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.10.tgz#2316af5f612cde1691abdf2571ff40ec32ea3429"
+ integrity sha512-gl6B/ravwMeY5Nv4Il2/ARYJQ6u+KPRwGMjS1ZrNudIKlNn4YBeXh5A4cIVm+dHaff6/O/lGOa5/SUYDMZpkww==
-"@next/swc-win32-ia32-msvc@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.9.tgz#0b853793754642cde9f9099087d4a86b6a99a24d"
- integrity sha512-MpD2vj1zjo1u3J3wiz3pEKse19Etz+P0GL6XfQkB/9a84vJQ1JWMaWBjmIdivzZv718Il2pRSSx8hymwPfguYQ==
+"@next/swc-win32-ia32-msvc@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.10.tgz#98a4f74d164871cfaccb0df6efddf2b7bcbaa54b"
+ integrity sha512-7RVpZ3tSThC6j+iZB0CUYmFiA3kXmN+pE7QcfyAxFaflKlaZoWNMKHIEZDuxSJc6YmQ6kyxsjqxVay2F5+/YCg==
-"@next/swc-win32-x64-msvc@12.0.9":
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.9.tgz#f7d3b59000082cf65c84fdc61930b708aa5446e5"
- integrity sha512-1c/sxp/4Qz4F6rCxiYqAnrmghCOFt5hHZ9Kd+rXFW5Mqev4C4XDOUMHdBH55HgnJZqngYhOE0r/XNkCtsIojig==
+"@next/swc-win32-x64-msvc@12.0.10":
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.10.tgz#5c0ba98b695c4be44d8793aff42971a0dac65c2d"
+ integrity sha512-oUIWRKd24jFLRWUYO1CZmML5+32BcpVfqhimGaaZIXcOkfQW+iqiAzdqsv688zaGtyKGeB9ZtiK3NDf+Q0v+Vw==
"@node-redis/client@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@node-redis/client/-/client-1.0.1.tgz#ddca6021097ce1026fedc193cac8c36b05c6cad8"
- integrity sha512-o0I4LdzJXP6QYxRnBPrQ7cIG5tF3SNM/PBnjC3mV6QkzIiGRElzWqSr9a9JCJdcyB1SIA80bhgGhpdTpCQ1Sdw==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@node-redis/client/-/client-1.0.2.tgz#7f09fb739675728fbc6e73536f7cd1be99bf7b8f"
+ integrity sha512-C+gkx68pmTnxfV+y4pzasvCH3s4UGHNOAUNhdJxGI27aMdnXNDZct7ffDHBL7bAZSGv9FSwCP5PeYvEIEKGbiA==
dependencies:
cluster-key-slot "1.1.0"
generic-pool "3.8.2"
@@ -1786,19 +1739,19 @@
yallist "4.0.0"
"@node-redis/json@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@node-redis/json/-/json-1.0.1.tgz#8cd987c1855392adf21bc4f06163a7eda97a40a3"
- integrity sha512-2EB96ZN0yUr4mgA9Odme48jX8eF5Ji0jrsRn4rLfEhME7L3rHLdKeUfxJKxbPOxadP6k8+6ViElxPZrKuV2nvQ==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@node-redis/json/-/json-1.0.2.tgz#8ad2d0f026698dc1a4238cc3d1eb099a3bee5ab8"
+ integrity sha512-qVRgn8WfG46QQ08CghSbY4VhHFgaTY71WjpwRBGEuqGPfWwfRcIf3OqSpR7Q/45X+v3xd8mvYjywqh0wqJ8T+g==
"@node-redis/search@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@node-redis/search/-/search-1.0.1.tgz#8d0936049f4858b9aefab40524ce8e5a52e5d08e"
- integrity sha512-iA2Gw6gr0X6IfNSjTyme9W1tDlLkwQ1bPApo4s8aVwZ2Ju8Z4COVik0vT6BJPRin79f5xPZgnaec3DIoC2UpHA==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@node-redis/search/-/search-1.0.2.tgz#8cfc91006ea787df801d41410283e1f59027f818"
+ integrity sha512-gWhEeji+kTAvzZeguUNJdMSZNH2c5dv3Bci8Nn2f7VGuf6IvvwuZDSBOuOlirLVgayVuWzAG7EhwaZWK1VDnWQ==
"@node-redis/time-series@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@node-redis/time-series/-/time-series-1.0.0.tgz#3db4caa63d7c158f0b73ab6cd46bd6c9c187dfaf"
- integrity sha512-QcaCIL/DlYJXedSfmjF+IRxKJbBUXBrjA5Gv0IiPlXXFFOkRnbPGKq6hmwBAAWyk1U03wyBHDFKVS3/9GnZV8g==
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@node-redis/time-series/-/time-series-1.0.1.tgz#703149f8fa4f6fff377c61a0873911e7c1ba5cc3"
+ integrity sha512-+nTn6EewVj3GlUXPuD3dgheWqo219jTxlo6R+pg24OeVvFHx9aFGGiyOgj3vBPhWUdRZ0xMcujXV5ki4fbLyMw==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -2114,50 +2067,50 @@
dependencies:
"@babel/runtime" "^7.13.10"
-"@radix-ui/react-arrow@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-0.1.1.tgz#e8e05444b37b9f71bf712a8cd4dd07dbd419e749"
- integrity sha512-layhfVIJE/mahiHUi9YZ/k2Of41TO20y1kEynUEq3j+KLUy/pi0mjb+jrPYRqmlznEl8/jye2jwilyGs2Uyx/g==
+"@radix-ui/react-arrow@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-0.1.3.tgz#17f86eab216c48aff17b13b811569a9bbabaa44d"
+ integrity sha512-9x1gRYdlUD5OUwY7L+M+4FY/YltDSsrNSj8QXGPbxZxL5ghWXB/4lhyIGccCwk/e8ggfmQYv9SRNmn3LavPo3A==
dependencies:
"@babel/runtime" "^7.13.10"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-avatar@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-0.1.1.tgz#a5e2c660f5e2564ad75fb30587bfdbba64137411"
- integrity sha512-yFWO2VZNmO6EkwwdKSIf5Wabd97iGFzKNrLI8aIHFYuZe+WBOnfF99SeU52wm2a18k/sdIiwTZlsxUCiSBadEw==
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-0.1.3.tgz#202192e55b4e0d0b98f88ad386066ca0f032f756"
+ integrity sha512-hzf8PCV4L34fekjg1Peos+csz3nNtwV2hnZSifmnug1TLBPI/tHXFlr43qp3G4rCB2YOJVW2ZpGBuKpomRyzGw==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-callback-ref" "0.1.0"
"@radix-ui/react-use-layout-effect" "0.1.0"
"@radix-ui/react-collapsible@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-0.1.1.tgz#a3f257aa7ab27358ab2a16c6a5815a307a7ce474"
- integrity sha512-GIiCo8wYz53ZZEbp4LOkSysK8B+gZSi8/X/5NotBvyZpKntnf93i+NXPmtPPr+l0uPBr4EnEG1aZnItnrJpSEQ==
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-0.1.5.tgz#086ebc9fb6ee35035dc3e755fa6940bc5b1e5206"
+ integrity sha512-jhj0h+gGc04D04mQW1zJgBxMJecYV21XaeyghjyXtp+ObM4EHkXnfOA5MyRMzSNB4u8wQ6P1zGtAbxHz1A4Vvg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
+ "@radix-ui/react-id" "0.1.4"
"@radix-ui/react-presence" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-use-layout-effect" "0.1.0"
-"@radix-ui/react-collection@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-0.1.1.tgz#c03b671f56b3e7af03f50929b513526c0b71c62b"
- integrity sha512-WabFzfkvG1uCMHVQd8V++W6qnDqvr+QrbCAXhzzWheKbiXSrwsvA2lTthMn1L6aPn1wyXlX56Xvbzz7Z3nOJAQ==
+"@radix-ui/react-collection@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-0.1.3.tgz#7b584f5db40ce165883b87c383d3bd16c0000d69"
+ integrity sha512-tMBY65l87tj77fMX44EBjm5p8clR6swkcNFr0/dDVdEPC0Vf3fwkv62dezCnZyrRBpkOgZPDOp2kO73hYlCfXw==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
- "@radix-ui/react-slot" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
+ "@radix-ui/react-slot" "0.1.2"
"@radix-ui/react-compose-refs@0.1.0":
version "0.1.0"
@@ -2174,50 +2127,51 @@
"@babel/runtime" "^7.13.10"
"@radix-ui/react-dialog@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-0.1.1.tgz#515bcda3ab6a3a9b1cc20237eedc38b6c5921a7d"
- integrity sha512-+M/tY9n2/5yhpZrWankiVPJPFHkmgn4q+lXOeVRkMOFsyXQKhwhmPihYFUBk3BszsdKeV5BrZvdDpbWve3ZKKA==
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-0.1.5.tgz#4310659607f5ad0b8796623d5f7490dc47d3d295"
+ integrity sha512-WftvXcQSszUphCTLQkkpBIkrYYU0IYqgIvACLQady4BN4YHDgdNlrwdg2ti9QrXgq1PZ+0S/6BIaA1dmSuRQ2g==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-dismissable-layer" "0.1.1"
+ "@radix-ui/react-dismissable-layer" "0.1.3"
"@radix-ui/react-focus-guards" "0.1.0"
- "@radix-ui/react-focus-scope" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
- "@radix-ui/react-portal" "0.1.1"
+ "@radix-ui/react-focus-scope" "0.1.3"
+ "@radix-ui/react-id" "0.1.4"
+ "@radix-ui/react-portal" "0.1.3"
"@radix-ui/react-presence" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
+ "@radix-ui/react-slot" "0.1.2"
"@radix-ui/react-use-controllable-state" "0.1.0"
aria-hidden "^1.1.1"
react-remove-scroll "^2.4.0"
-"@radix-ui/react-dismissable-layer@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-0.1.1.tgz#1be9d1c6945b27a69dfd6742928904a526d1d345"
- integrity sha512-OrwRfYE3dqX6nbCnAcIaxsTg6QrLu/HT1GwzxpX0Mbx+AxFNBvE6czBTM5/a7D1CfK8jxORNZ/WsjoOTLudY+A==
+"@radix-ui/react-dismissable-layer@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-0.1.3.tgz#d427c7520c3799d2b957e40e7d67045d96120356"
+ integrity sha512-3veE7M8K13Qb+6+tC3DHWmWV9VMuuRoZvRLdrvz7biSraK/qkGBN4LbKZDaTdw2D2HS7RNpSd/sF8pFd3TaAgA==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-body-pointer-events" "0.1.0"
"@radix-ui/react-use-callback-ref" "0.1.0"
"@radix-ui/react-use-escape-keydown" "0.1.0"
"@radix-ui/react-dropdown-menu@^0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-0.1.1.tgz#a596ff9f37e1eeb11f337bec3d7bf5763e059dfb"
- integrity sha512-YxnGI/SpukCYFMzP8ZbOeaaba7tVv3YNmEOaUK8lymVm2mOb+bKpjYWgvm0DMHgkhvLAU1tcb18CDEjSaQnyfQ==
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-0.1.4.tgz#c5e7db72b4854ea8d8f9151f7053fa6873eb372f"
+ integrity sha512-KNFHOK+zKKqZ7x3OoxCXZ2TRESRmHpgxkXpY75i/GFt3i5N/RIH5rB9WSdwhdQXM7gkihYZIDwjdmhhSsgzHkw==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
- "@radix-ui/react-menu" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-id" "0.1.4"
+ "@radix-ui/react-menu" "0.1.4"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-focus-guards@0.1.0":
@@ -2227,81 +2181,81 @@
dependencies:
"@babel/runtime" "^7.13.10"
-"@radix-ui/react-focus-scope@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-0.1.1.tgz#2639a2abd268bc435348313cfd90026241deb58c"
- integrity sha512-0b9MwvHwhuIhD46lrf4G2j53/oYzPa2hN9Ylu+4Jg0Qa0kW04/vpKCX2Gh8M8fTlI0YaGVQsN40sYc5fe8RBSA==
+"@radix-ui/react-focus-scope@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-0.1.3.tgz#b1cc825b6190001d731417ed90d192d13b41bce1"
+ integrity sha512-bKi+lw14SriQqYWMBe13b/wvxSqYMC+3FylMUEwOKA6JrBoldpkhX5XffGDdpDRTTpjbncdH3H7d1PL5Bs7Ikg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs" "0.1.0"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-callback-ref" "0.1.0"
-"@radix-ui/react-id@0.1.1", "@radix-ui/react-id@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-0.1.1.tgz#42c8f3967875e6824b2ac9d49c66317047c8d6ff"
- integrity sha512-Vlg5me65+NUgxPBuA0Lk6FerNe+Mq4EuJ8xzpskGxS2t8p1puI3IkyLZ2wWtDSb1KXazoaHn8adBypagt+1P0g==
+"@radix-ui/react-id@0.1.4", "@radix-ui/react-id@^0.1.0":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-0.1.4.tgz#4cd6126e6ac8a43ebe6d52948a068b797cc9ad71"
+ integrity sha512-/hq5m/D0ZfJWOS7TLF+G0l08KDRs87LBE46JkAvgKkg1fW4jkucx9At9D9vauIPSbdNmww5kXEp566hMlA8eXA==
dependencies:
"@babel/runtime" "^7.13.10"
- "@radix-ui/react-context" "0.1.1"
+ "@radix-ui/react-use-layout-effect" "0.1.0"
-"@radix-ui/react-label@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-0.1.1.tgz#c2970b19214248c2b3a0425c3c0d299290b559a5"
- integrity sha512-52mHm7gxDcbY1+XuFwe0zBvUHp+JP424QC5V2nloPH9JUpCsM2MfviqA/nyW4nKuoGAeF6MhedjtlrXyze8DFw==
+"@radix-ui/react-label@0.1.4":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-0.1.4.tgz#d62855ff6bb2950d6117462f8e00a0c5378651eb"
+ integrity sha512-I59IMdUhHixk6cG4D00UN+oFxTpur9cJQSOl+4EfSTJZs+x4PqDpM7p402/gb9sXJqylsUkDMHDdaPzLwPNf7g==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-id" "0.1.4"
+ "@radix-ui/react-primitive" "0.1.3"
-"@radix-ui/react-menu@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-0.1.1.tgz#2146352813ac086df5f021d06bce10f7f56d2577"
- integrity sha512-j9ptTx6aNYbuc7ygNzl8ou5z010HLXgEKZQE5EAiTrdTOCrwullDDLvQR1M0+VGYQkfRvD5Y1MnJEp6ISQDEVg==
+"@radix-ui/react-menu@0.1.4":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-0.1.4.tgz#ed9aca2c2328038e2210e629228db6e3c67495c1"
+ integrity sha512-50HvBojjj2CrwIxcECRF9MdReoALRdpG7vtCAGbYs3eciIOLqtP6+Dx/sVz1YWe6Fsree/5vFQXZGImZYY/3TQ==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
- "@radix-ui/react-collection" "0.1.1"
+ "@radix-ui/react-collection" "0.1.3"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-dismissable-layer" "0.1.1"
+ "@radix-ui/react-dismissable-layer" "0.1.3"
"@radix-ui/react-focus-guards" "0.1.0"
- "@radix-ui/react-focus-scope" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
- "@radix-ui/react-popper" "0.1.1"
- "@radix-ui/react-portal" "0.1.1"
+ "@radix-ui/react-focus-scope" "0.1.3"
+ "@radix-ui/react-id" "0.1.4"
+ "@radix-ui/react-popper" "0.1.3"
+ "@radix-ui/react-portal" "0.1.3"
"@radix-ui/react-presence" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
- "@radix-ui/react-roving-focus" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
+ "@radix-ui/react-roving-focus" "0.1.4"
"@radix-ui/react-use-callback-ref" "0.1.0"
"@radix-ui/react-use-direction" "0.1.0"
aria-hidden "^1.1.1"
react-remove-scroll "^2.4.0"
-"@radix-ui/react-popper@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-0.1.1.tgz#239eac72cdd7861636f14ff736f21fcb27237afd"
- integrity sha512-LsjeV9MEdikDHi+uBvMpPyLHrDa7A8UlX2s7c9GPgqU9non7kjcijO4NERaoXvhEu6E7NTqApb5axhZxB23R4w==
+"@radix-ui/react-popper@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-0.1.3.tgz#a93bdd72845566007e5f3868caddd62318bb781e"
+ integrity sha512-2OV2YaJv7iTZexJY3HJ7B6Fs1A/3JXd3fRGU4JY0guACfGMD1C/jSgds505MKQOTiHE/quI6j3/q8yfzFjJR9g==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/popper" "0.1.0"
- "@radix-ui/react-arrow" "0.1.1"
+ "@radix-ui/react-arrow" "0.1.3"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-rect" "0.1.1"
"@radix-ui/react-use-size" "0.1.0"
"@radix-ui/rect" "0.1.1"
-"@radix-ui/react-portal@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-0.1.1.tgz#c373f1fe7ea3b83a817240689e6885b9c115cee8"
- integrity sha512-ZJFgUBsaFS4cryONfRZXuYxtv87ziRGqFu+wP91rVKF8TpkeQgvPP2QBLIfIGzotr3G1n8t7gHaNJkZtKVeXvw==
+"@radix-ui/react-portal@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-0.1.3.tgz#56826e789b3d4e37983f6d23666e3f1b1b9ee358"
+ integrity sha512-DrV+sPYLs0HhmX5/b7yRT6nLM9Nl6FtQe2KUG+46kiCOKQ+0XzNMO5hmeQtyq0mRf/qlC02rFu6OMsWpIqVsJg==
dependencies:
"@babel/runtime" "^7.13.10"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-layout-effect" "0.1.0"
"@radix-ui/react-presence@0.1.1":
@@ -2313,108 +2267,107 @@
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-use-layout-effect" "0.1.0"
-"@radix-ui/react-primitive@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-0.1.1.tgz#98e64d9c3094df737d0f49f0e9e48ff2f44498b0"
- integrity sha512-65GCHeDV/ikicXKR2rLSO6w+dyUQwSG2J1JD2qm4suK1259nTuRvPsPBrbhZpoXWQKj2drMZfhhclXVfzwW1Kw==
+"@radix-ui/react-primitive@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-0.1.3.tgz#585c35ef2ec06bab0ea9e0fc5c916e556661b881"
+ integrity sha512-fcyADaaAx2jdqEDLsTs6aX50S3L1c9K9CC6XMpJpuXFJCU4n9PGTFDZRtY2gAoXXoRCPIBsklCopSmGb6SsDjQ==
dependencies:
"@babel/runtime" "^7.13.10"
- "@radix-ui/react-slot" "0.1.1"
+ "@radix-ui/react-slot" "0.1.2"
"@radix-ui/react-radio-group@^0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-0.1.1.tgz#e46861abd472f52ed57c8379e4e8301bbc503ed1"
- integrity sha512-K6vrFSI62qEnF6ltlyK0pzY9w/Y/HnmheUFcHSfWpyyBU6vmoU/Vdy1ZDAejDtDfdthSrk/L8wczF1OPmIjB2w==
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-0.1.4.tgz#a02eaa3c84ccba706b2b231f06c6dd5e1eb0ceae"
+ integrity sha512-ciFiJ/xX6Kn2+ylGlfbkfXUSBkV7FqX6Q3cHx/PH1h5FcCFdh7+FOIOem26AgI/i8NXhKIVJtlNaU6HUa6Sshg==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-label" "0.1.1"
+ "@radix-ui/react-label" "0.1.4"
"@radix-ui/react-presence" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
- "@radix-ui/react-roving-focus" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
+ "@radix-ui/react-roving-focus" "0.1.4"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-use-previous" "0.1.0"
"@radix-ui/react-use-size" "0.1.0"
-"@radix-ui/react-roving-focus@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-0.1.1.tgz#6a7965f6315fae91061b14d6380949a4697e87b9"
- integrity sha512-JK60DVpLjn0RsvJ4DnmuKTJGHuqfBID0/xaJ9tTM5DZ9WqHHhMBtaAi+68yZLSfTfQFajXjN7vaKD3UtmAmavA==
+"@radix-ui/react-roving-focus@0.1.4":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-0.1.4.tgz#693ca3eaab153feabe37f9d50987d6d2911cf819"
+ integrity sha512-zaixcAxRcWQliUSx6l9rdfJhvcbuY7Tb4Emb7H4DWCTx1kenXH8+n9mwa8gaSIJLLSSSMzBpQATlpFw9xv/bJQ==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
- "@radix-ui/react-collection" "0.1.1"
+ "@radix-ui/react-collection" "0.1.3"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-id" "0.1.4"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-callback-ref" "0.1.0"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-slider@^0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-0.1.1.tgz#cbf793b7a7e23907252bffc791693f84518e16ff"
- integrity sha512-4OK46wlX2BmVsYbVYw3gml6CitQSTohkOP6mJEXVVlGAAJXgRWt5GmC35cMNpQFdmmQ5vj1oqTEDEB/8dZAQEA==
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-0.1.3.tgz#f3de16ca348a367dec8aac0f29af1c45459465fe"
+ integrity sha512-B4qf7ex4DHJsRv5wFCUeIRpzkDRjzTey9OclrLrp5yLI/AHij+zNgT9JBM9b8Q/uoPrrKQ2mulYl0NpBy9ghGA==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/number" "0.1.0"
"@radix-ui/primitive" "0.1.0"
- "@radix-ui/react-collection" "0.1.1"
+ "@radix-ui/react-collection" "0.1.3"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-use-direction" "0.1.0"
"@radix-ui/react-use-layout-effect" "0.1.0"
"@radix-ui/react-use-previous" "0.1.0"
"@radix-ui/react-use-size" "0.1.0"
-"@radix-ui/react-slot@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-0.1.1.tgz#9dbc2070ccc492847f7e43747b4847bc54786a76"
- integrity sha512-deq3K7cCXQ+tWMZF2GKl3zGMcwVbyQDiMY/UcPI0Q1DDudRG2dWrEwcYbYajEelc07oOxzNyKpaXZLOpNxquuA==
+"@radix-ui/react-slot@0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-0.1.2.tgz#e6f7ad9caa8ce81cc8d532c854c56f9b8b6307c8"
+ integrity sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-switch@^0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-0.1.1.tgz#a60090a26387fc018feecb0eb8ae108e2d693472"
- integrity sha512-QlLGNj7NnMUoYj+9msP4q9/X7ZtHLqVLlH5CSzEgoDxxU+wh5+65oTyBynWJLsF9QligE9pJqOwMdqo4qqnBhg==
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-0.1.4.tgz#92f21a5150c55535ea432998e40e5fb4f059730d"
+ integrity sha512-GUK0hw/FQX/MJ5Zp5W6e69fqk/KO6bRP0t0Sx89Sl//WSdcgpwk3CimV5seqk8LxL1wwBkDR5zE185U+LdBCOQ==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-label" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-label" "0.1.4"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-use-previous" "0.1.0"
"@radix-ui/react-use-size" "0.1.0"
"@radix-ui/react-tooltip@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-0.1.1.tgz#cab234fb62740626794a8008c95cd02f3bcad904"
- integrity sha512-EVZoZ/268kJ/eo+iYN5iGdh5sYAkPMdqdTL51GhTdfG5pskgoeYJQFNP8peObcikKgoyKqkV+5iXGQGa9zzwYg==
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-0.1.6.tgz#46a3e385e004aaebd16ecaa1da7d1af70ba3bb45"
+ integrity sha512-0uaRpRmTCQo5yMUkDpv4LEDnaQDoeLXcNNhZonCZdbZBQ7ntvjURIWIigq1/pXZp0UX7oPpFzsXD9jUp8JT0WA==
dependencies:
"@babel/runtime" "^7.13.10"
"@radix-ui/primitive" "0.1.0"
"@radix-ui/react-compose-refs" "0.1.0"
"@radix-ui/react-context" "0.1.1"
- "@radix-ui/react-id" "0.1.1"
- "@radix-ui/react-popper" "0.1.1"
- "@radix-ui/react-portal" "0.1.1"
+ "@radix-ui/react-id" "0.1.4"
+ "@radix-ui/react-popper" "0.1.3"
+ "@radix-ui/react-portal" "0.1.3"
"@radix-ui/react-presence" "0.1.1"
- "@radix-ui/react-primitive" "0.1.1"
- "@radix-ui/react-slot" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
+ "@radix-ui/react-slot" "0.1.2"
"@radix-ui/react-use-controllable-state" "0.1.0"
"@radix-ui/react-use-escape-keydown" "0.1.0"
- "@radix-ui/react-use-layout-effect" "0.1.0"
"@radix-ui/react-use-previous" "0.1.0"
"@radix-ui/react-use-rect" "0.1.1"
- "@radix-ui/react-visually-hidden" "0.1.1"
+ "@radix-ui/react-visually-hidden" "0.1.3"
"@radix-ui/react-use-body-pointer-events@0.1.0":
version "0.1.0"
@@ -2483,13 +2436,13 @@
dependencies:
"@babel/runtime" "^7.13.10"
-"@radix-ui/react-visually-hidden@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-0.1.1.tgz#19be23414d4d731159a2c86d69a2c7319750a80f"
- integrity sha512-9tH9yD5fwPOtQO4X5Xq3rv27g30bMY4S9T7Jx2SAhqdIhRfojuMnu3hUNOtGdrVwahm+/AFHwMEs2w+Dq+fdZw==
+"@radix-ui/react-visually-hidden@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-0.1.3.tgz#406a2f1e2f2cf27e5b85a29dc3aca718e695acaf"
+ integrity sha512-dPU6ZR2WQ/W9qv7E1Y8/I8ymqG+8sViU6dQQ6sfr2/8yGr0I4mmI7ywTnqXaE+YS9gHLEZHdQcEqTNESg6YfdQ==
dependencies:
"@babel/runtime" "^7.13.10"
- "@radix-ui/react-primitive" "0.1.1"
+ "@radix-ui/react-primitive" "0.1.3"
"@radix-ui/rect@0.1.1":
version "0.1.1"
@@ -2499,9 +2452,9 @@
"@babel/runtime" "^7.13.10"
"@rollup/plugin-inject@^4.0.0":
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-4.0.3.tgz#6f04ebc14790a8bf892286fe9b8c0eb1ddf4d5ce"
- integrity sha512-lzMXmj0LZjd67MI+M8H9dk/oCxR0TYqYAdZ6ZOejWQLSUtud+FUPu4NCMAO8KyWWAalFo8ean7yFHCMvCNsCZw==
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz#fbeee66e9a700782c4f65c8b0edbafe58678fbc2"
+ integrity sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==
dependencies:
"@rollup/pluginutils" "^3.1.0"
estree-walker "^2.0.1"
@@ -2546,16 +2499,16 @@
integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==
"@stripe/react-stripe-js@^1.4.1":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-1.6.0.tgz#e3adf6a6ea6d839193164fa3cfe73cf52db3a080"
- integrity sha512-tMmsPD+wkpiiVJZgQ1E06tklG5MZHG462s6OWja9abpxq76kerAxMFN+KdhUg0LIEY79THbzvH3s/WGHasnV3w==
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-1.7.0.tgz#83c993a09a903703205d556617f9729784a896c3"
+ integrity sha512-L20v8Jq0TDZFL2+y+uXD751t6q9SalSFkSYZpmZ2VWrGZGK7HAGfRQ804dzYSSr5fGenW6iz6y7U0YKfC/TK3g==
dependencies:
prop-types "^15.7.2"
"@stripe/stripe-js@^1.16.0":
- version "1.21.1"
- resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.21.1.tgz#e56cd01f889dc06af4a68ebf61d2492a87e80da1"
- integrity sha512-/HhRol0Bia/6L7JstXUOpg3m0U3nBW8c2tvaBE6QdonN+OMusYT9AIqCMR/PyzoF3ROifFJ2kbWT7xQjbKN3tw==
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.22.0.tgz#9d3d2f0a1ce81f185ec477fd7cc67544b2b2a00c"
+ integrity sha512-fm8TR8r4LwbXgBIYdPmeMjJJkxxFC66tvoliNnmXOpUgZSgQKoNPW3ON0ZphZIiif1oqWNhAaSrr7tOvGu+AFg==
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
@@ -2571,6 +2524,15 @@
dependencies:
mini-svg-data-uri "^1.2.3"
+"@tailwindcss/typography@^0.5.1":
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.1.tgz#486248a9426501f11a9b0295f7cfc0eb29659c46"
+ integrity sha512-AmSzZSgLhHKlILKduU+PKBTHL6c+al82syZlRid1xgmlWwXagLigO+O++B4C0scpMfzW//f/3YCRcwwEHWoU3w==
+ dependencies:
+ lodash.castarray "^4.4.0"
+ lodash.isplainobject "^4.0.6"
+ lodash.merge "^4.6.2"
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
@@ -2591,38 +2553,38 @@
lodash "4.17.21"
"@trpc/client@^9.16.0":
- version "9.16.0"
- resolved "https://registry.yarnpkg.com/@trpc/client/-/client-9.16.0.tgz#73c9ab291191bf6f3bb6b406f3b43a2bfb30306f"
- integrity sha512-IwH3xQ792IKq9Q3nLOCYzxMe2xZg+B1iyiX0ueBF7P2blO/3791DJjUFyzVT3bXPJj3rISoL1Ermd0mtPRxGpQ==
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/@trpc/client/-/client-9.18.0.tgz#6f90217c60be6b4eda46159afd111167a7d92a63"
+ integrity sha512-kqC0/nuA+/wVvddaFbSRMbSZ3oGAY4nl2pHVxM7jqDBLkn6nbk0IHK0oJ0g1tDZxyfg4xuZtTrzh0yYpE4C69w==
dependencies:
"@babel/runtime" "^7.9.0"
"@trpc/next@^9.16.0":
- version "9.16.0"
- resolved "https://registry.yarnpkg.com/@trpc/next/-/next-9.16.0.tgz#294da9a256130257980659116d2dda9fcbd14c7c"
- integrity sha512-j3gyZYqNTqzchWJKCEAQdwzr2aNoQjfW5sgpObktAD0YofTogXi3nl9mKzHq7HaiRQFEDU6/O6CSg4coVj+U7g==
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/@trpc/next/-/next-9.18.0.tgz#26deff05254c3efe667ba926e35db81f675e1fe6"
+ integrity sha512-c61Ggj2OBWhfKXkomPpDOAtZ/joKDcOu0Uf9syZTIQanb1AzXMxHebD5vusaMAbIecvTqhiA8cpmOWakJCRDew==
dependencies:
"@babel/runtime" "^7.9.0"
- react-ssr-prepass "^1.4.0"
+ react-ssr-prepass "^1.5.0"
"@trpc/react@^9.16.0":
- version "9.16.0"
- resolved "https://registry.yarnpkg.com/@trpc/react/-/react-9.16.0.tgz#1d4bfac470beb43b5f43557822c98b6947cd65f6"
- integrity sha512-gaF+631mXWaziUlDYNksiAhRV7VdjcA04a7by9ZhFVgTzsHXc5VMX57X1Uo2LdWUcW7zOfWiaYBpYs7fRbAv9w==
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/@trpc/react/-/react-9.18.0.tgz#15bf8f7b839c60f0dc068e0997e1b46d38092109"
+ integrity sha512-stoHIA/9OJtVnmnR/JtVLs52A3gKfTUjvoID8lQTL3LHJbDOzDxKnefUdMr8RfgeC92ALeIbdzeO08P1/0THjQ==
dependencies:
"@babel/runtime" "^7.9.0"
"@trpc/server@^9.16.0":
- version "9.16.0"
- resolved "https://registry.yarnpkg.com/@trpc/server/-/server-9.16.0.tgz#93fc30166f92a4f1286da63ad3bad42c955c7e15"
- integrity sha512-IENsJs41ZR4oeFUJhsNNTSgEOtuRN0m9u7ec4u3eG/qOc7bIoo1nDoYtx4bl6OJJSQYEytG9tlcVz9G8OAaHbg==
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/@trpc/server/-/server-9.18.0.tgz#03136197494454b7441e5a3bb08feaf4d2e56d17"
+ integrity sha512-xWBC2+Q5OuJfK4kN9LqvpnncOP3T2I1duc5xDAnYOhhmvnKrfoUQoBReSqA5MohomAB/EDcRVCea2sKoNIoa0g==
dependencies:
tslib "^2.1.0"
-"@ts-morph/common@~0.12.2":
- version "0.12.2"
- resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.12.2.tgz#61d07a47d622d231e833c44471ab306faaa41aed"
- integrity sha512-m5KjptpIf1K0t0QL38uE+ol1n+aNn9MgRq++G3Zym1FlqfN+rThsXlp3cAgib14pIeXF7jk3UtJQOviwawFyYg==
+"@ts-morph/common@~0.12.3":
+ version "0.12.3"
+ resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.12.3.tgz#a96e250217cd30e480ab22ec6a0ebbe65fd784ff"
+ integrity sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==
dependencies:
fast-glob "^3.2.7"
minimatch "^3.0.4"
@@ -2660,25 +2622,14 @@
integrity sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==
"@types/async@^3.2.10":
- version "3.2.10"
- resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.10.tgz#0d575eb2988398f754121aa19e3e08f9c5d5f11f"
- integrity sha512-/bPr8eB1/00J14EGHrZiGqCal/zA0nE/8W1YCM3lGnUcfiWPW6liQwThgGzjt/3uIrYbLtLCPg3ZmpUe6YmFRw==
+ version "3.2.12"
+ resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.12.tgz#0ebbfaf3f249ffa0fdc50179b07705f69c90d70c"
+ integrity sha512-4i4w4tfNDo73BOjk0qHcB2YJ8A2SjITCrU4BTsgdJFTsVr6atPDXa0T9r0QZTrX3axtWwkqpZqF4B3gR0TqBGw==
-"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
- version "7.1.16"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702"
- integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==
- dependencies:
- "@babel/parser" "^7.1.0"
- "@babel/types" "^7.0.0"
- "@types/babel__generator" "*"
- "@types/babel__template" "*"
- "@types/babel__traverse" "*"
-
-"@types/babel__core@^7.1.7":
- version "7.1.17"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.17.tgz#f50ac9d20d64153b510578d84f9643f9a3afbe64"
- integrity sha512-6zzkezS9QEIL8yCBvXWxPTJPNuMeECJVxSOhxNY/jfq9LxOTHivaYTqr37n9LknWWRTIkzqH2UilS5QFvfa90A==
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7":
+ version "7.1.18"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8"
+ integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==
dependencies:
"@babel/parser" "^7.1.0"
"@babel/types" "^7.0.0"
@@ -2687,9 +2638,9 @@
"@types/babel__traverse" "*"
"@types/babel__generator@*":
- version "7.6.3"
- resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5"
- integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==
+ version "7.6.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
+ integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
dependencies:
"@babel/types" "^7.0.0"
@@ -2773,6 +2724,11 @@
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee"
integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==
+"@types/glidejs__glide@^3.4.1":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@types/glidejs__glide/-/glidejs__glide-3.4.1.tgz#220bbce087500eda3700e476c728e17d096eb6f0"
+ integrity sha512-ib2VRchnLSXGOdiZFfCt6QEIYviw5g+Yey8Q2+kMzUxGXsnR9ZwZi1qPXI1ttrvR/AtUYZmSSHDVVSoIyt6LPw==
+
"@types/graceful-fs@^4.1.2":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
@@ -2794,9 +2750,9 @@
hoist-non-react-statics "^3.3.0"
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
- integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
+ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
"@types/istanbul-lib-report@*":
version "3.0.0"
@@ -2813,9 +2769,9 @@
"@types/istanbul-lib-report" "*"
"@types/jest@^27.0.3":
- version "27.0.3"
- resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.3.tgz#0cf9dfe9009e467f70a342f0f94ead19842a783a"
- integrity sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==
+ version "27.4.0"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.0.tgz#037ab8b872067cae842a320841693080f9cb84ed"
+ integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==
dependencies:
jest-diff "^27.0.0"
pretty-format "^27.0.0"
@@ -2830,15 +2786,10 @@
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008"
integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==
-"@types/lodash@^4.14.175":
- version "4.14.176"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.176.tgz#641150fc1cda36fbfa329de603bbb175d7ee20c0"
- integrity sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==
-
-"@types/lodash@^4.14.177":
- version "4.14.177"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.177.tgz#f70c0d19c30fab101cad46b52be60363c43c4578"
- integrity sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==
+"@types/lodash@^4.14.175", "@types/lodash@^4.14.177":
+ version "4.14.178"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8"
+ integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==
"@types/micro@^7.3.6":
version "7.3.6"
@@ -2859,9 +2810,9 @@
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@types/node@*", "@types/node@>=8.1.0":
- version "16.11.6"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae"
- integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==
+ version "17.0.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3"
+ integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw==
"@types/node@^12.12.6":
version "12.20.43"
@@ -2869,9 +2820,9 @@
integrity sha512-HCfJdaYqJX3BCzeihgZrD7b85Cu05OC/GVJ4kEYIflwUs4jbnUlLLWoq7hw1LBcdvUyehO+gr6P5JQ895/2ZfA==
"@types/node@^16.11.10":
- version "16.11.10"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.10.tgz#2e3ad0a680d96367103d3e670d41c2fed3da61ae"
- integrity sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==
+ version "16.11.21"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.21.tgz#474d7589a30afcf5291f59bd49cca9ad171ffde4"
+ integrity sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==
"@types/nodemailer@^6.4.4":
version "6.4.4"
@@ -2898,9 +2849,9 @@
"@types/node" "*"
"@types/prettier@^2.0.0":
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281"
- integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.3.tgz#a3c65525b91fca7da00ab1a3ac2b5a2a4afbffbf"
+ integrity sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==
"@types/prop-types@*":
version "15.7.4"
@@ -2908,16 +2859,16 @@
integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
"@types/qrcode@^1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.4.1.tgz#0689f400c3a95d2db040c99c99834faa09ee9dc1"
- integrity sha512-vxMyr7JM7tYPxu8vUE83NiosWX5DZieCyYeJRoOIg0pAkyofCBzknJ2ycUZkPGDFis2RS8GN/BeJLnRnAPxeCA==
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.4.2.tgz#7d7142d6fa9921f195db342ed08b539181546c74"
+ integrity sha512-7uNT9L4WQTNJejHTSTdaJhfBSCN73xtXaHFyBJ8TSwiLhe4PRuTue7Iph0s2nG9R/ifUaSnGhLUOZavlBEqDWQ==
dependencies:
"@types/node" "*"
"@types/react-calendar@^3.0.0":
- version "3.4.3"
- resolved "https://registry.yarnpkg.com/@types/react-calendar/-/react-calendar-3.4.3.tgz#f2475519b44a1495562c526556074df947ce5bc6"
- integrity sha512-k56OS9d62/g3OCTepULEpNoClVUKuWxHBBuKS4hX8/qNiNup+Gf1Qn0SXHakbqBGWEfdLK93RlIRy5XOA4+Iaw==
+ version "3.4.5"
+ resolved "https://registry.yarnpkg.com/@types/react-calendar/-/react-calendar-3.4.5.tgz#bf156c2bfac37b5b201a212d321317d9f3f50aaf"
+ integrity sha512-GAilbiUjVlD7RZzb6mxEMd80a2dbwpo8oFabvqmg1BLxs28xPxnvHZ+zCo38VztBnQwt3qHqgmyBcXbYczPN2w==
dependencies:
"@types/react" "*"
@@ -2949,19 +2900,10 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@16 || 17":
- version "17.0.34"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.34.tgz#797b66d359b692e3f19991b6b07e4b0c706c0102"
- integrity sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg==
- dependencies:
- "@types/prop-types" "*"
- "@types/scheduler" "*"
- csstype "^3.0.2"
-
-"@types/react@^17.0.37":
- version "17.0.37"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959"
- integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg==
+"@types/react@*", "@types/react@16 || 17", "@types/react@^17.0.37":
+ version "17.0.38"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd"
+ integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
@@ -3226,9 +3168,9 @@ acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1:
- version "8.5.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
- integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
+ integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
agent-base@6, agent-base@^6.0.2:
version "6.0.2"
@@ -3256,9 +3198,9 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4:
uri-js "^4.2.2"
ajv@^8.0.1:
- version "8.6.3"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764"
- integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==
+ version "8.9.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18"
+ integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
@@ -3439,9 +3381,9 @@ asn1@~0.2.3:
safer-buffer "~2.1.0"
asn1js@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.1.1.tgz#bb3896191ebb5fb1caeda73436a6c6e20a2eedff"
- integrity sha512-t9u0dU0rJN4ML+uxgN6VM2Z4H5jWIYm0w8LsZLzMJaQsgL3IJNbxHgmbWDvJAwspyHpDFuzUaUFh4c05UB4+6g==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-2.2.0.tgz#d890fcdda86b8a005693df14a986bfb2c2069c57"
+ integrity sha512-oagLNqpfNv7CvmyMoexMDNyVDSiq1rya0AEUgcLlNHdHgNl6U/hi8xY370n5y+ZIFEXOx0J4B1qF2NDjMRxklA==
dependencies:
pvutils latest
@@ -3466,9 +3408,9 @@ async-limiter@~1.0.0:
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async@^3.2.1:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/async/-/async-3.2.2.tgz#2eb7671034bb2194d45d30e31e24ec7e7f9670cd"
- integrity sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
+ integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
asynckit@^0.4.0:
version "0.4.0"
@@ -3481,16 +3423,16 @@ atob@^2.1.2:
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^10.4.0:
- version "10.4.0"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8"
- integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==
+ version "10.4.2"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.2.tgz#25e1df09a31a9fba5c40b578936b90d35c9d4d3b"
+ integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==
dependencies:
- browserslist "^4.17.5"
- caniuse-lite "^1.0.30001272"
- fraction.js "^4.1.1"
+ browserslist "^4.19.1"
+ caniuse-lite "^1.0.30001297"
+ fraction.js "^4.1.2"
normalize-range "^0.1.2"
picocolors "^1.0.0"
- postcss-value-parser "^4.1.0"
+ postcss-value-parser "^4.2.0"
available-typed-arrays@^1.0.5:
version "1.0.5"
@@ -3522,15 +3464,15 @@ babel-jest@^26.6.3:
slash "^3.0.0"
babel-jest@^27.3.1:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.3.1.tgz#0636a3404c68e07001e434ac4956d82da8a80022"
- integrity sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ==
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.6.tgz#4d024e69e241cdf4f396e453a07100f44f7ce314"
+ integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==
dependencies:
- "@jest/transform" "^27.3.1"
- "@jest/types" "^27.2.5"
+ "@jest/transform" "^27.4.6"
+ "@jest/types" "^27.4.2"
"@types/babel__core" "^7.1.14"
- babel-plugin-istanbul "^6.0.0"
- babel-preset-jest "^27.2.0"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^27.4.0"
chalk "^4.0.0"
graceful-fs "^4.2.4"
slash "^3.0.0"
@@ -3542,7 +3484,7 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies:
object.assign "^4.1.0"
-babel-plugin-istanbul@^6.0.0:
+babel-plugin-istanbul@^6.0.0, babel-plugin-istanbul@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
@@ -3610,12 +3552,12 @@ babel-preset-jest@^26.6.2:
babel-plugin-jest-hoist "^26.6.2"
babel-preset-current-node-syntax "^1.0.0"
-babel-preset-jest@^27.2.0:
- version "27.2.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885"
- integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==
+babel-preset-jest@^27.4.0:
+ version "27.4.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz#70d0e676a282ccb200fbabd7f415db5fdf393bca"
+ integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg==
dependencies:
- babel-plugin-jest-hoist "^27.2.0"
+ babel-plugin-jest-hoist "^27.4.0"
babel-preset-current-node-syntax "^1.0.0"
balanced-match@^1.0.0:
@@ -3666,14 +3608,14 @@ bcryptjs@^2.4.3:
integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
big-integer@^1.6.16:
- version "1.6.50"
- resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.50.tgz#299a4be8bd441c73dcc492ed46b7169c34e92e70"
- integrity sha512-+O2uoQWFRo8ysZNo/rjtri2jIwjr3XfeAgRjAUADRqGG+ZITvyn8J1kvXLTaKVr3hhGXk+f23tKfdzmklVM9vQ==
+ version "1.6.51"
+ resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
+ integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
bignumber.js@^9.0.0:
- version "9.0.1"
- resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5"
- integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673"
+ integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==
binary-extensions@^2.0.0:
version "2.2.0"
@@ -3856,13 +3798,13 @@ browserify-sign@^4.0.0:
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
-browserslist@^4.16.6, browserslist@^4.17.5:
- version "4.17.6"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d"
- integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==
+browserslist@^4.17.5, browserslist@^4.19.1:
+ version "4.19.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3"
+ integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==
dependencies:
- caniuse-lite "^1.0.30001274"
- electron-to-chromium "^1.3.886"
+ caniuse-lite "^1.0.30001286"
+ electron-to-chromium "^1.4.17"
escalade "^3.1.1"
node-releases "^2.0.1"
picocolors "^1.0.0"
@@ -4029,19 +3971,14 @@ camelcase@^5.0.0, camelcase@^5.3.1:
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
camelcase@^6.0.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e"
- integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001274:
- version "1.0.30001277"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001277.tgz#9416dae5e075f47eacd8e0475ae1dcc5a20e9ca5"
- integrity sha512-J2WtYj2Pl6LBEG214XmbGw1gzZEsYuinQFPqYtpZDB3/vm49qNlrcbJrTMkHKmdRDdmXYwkG0tgOBJsuI+J12Q==
-
-caniuse-lite@^1.0.30001283:
- version "1.0.30001303"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz#9b168e4f43ccfc372b86f4bc5a551d9b909c95c9"
- integrity sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==
+caniuse-lite@^1.0.30001283, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297:
+ version "1.0.30001304"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz#38af55ed3fc8220cb13e35e6e7309c8c65a05559"
+ integrity sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==
capture-exit@^2.0.0:
version "2.0.0"
@@ -4077,10 +4014,10 @@ char-regex@^1.0.2:
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
-chokidar@^3.5.2:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
- integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+chokidar@^3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
@@ -4103,9 +4040,9 @@ ci-info@^2.0.0:
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
ci-info@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6"
- integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
+ integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
cids@^0.7.1:
version "0.7.5"
@@ -4208,11 +4145,6 @@ clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
-clone@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
-
clone@~0.1.9:
version "0.1.19"
resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85"
@@ -4383,9 +4315,9 @@ copy-descriptor@^0.1.0:
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
core-js@^3:
- version "3.19.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641"
- integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==
+ version "3.20.3"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a"
+ integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==
core-util-is@1.0.2:
version "1.0.2"
@@ -4417,9 +4349,9 @@ cosmiconfig@^7.0.1:
yaml "^1.10.0"
country-flag-icons@^1.0.2:
- version "1.4.11"
- resolved "https://registry.yarnpkg.com/country-flag-icons/-/country-flag-icons-1.4.11.tgz#79fc3ab2ef5cd328973152f036ff53e23d5d7026"
- integrity sha512-OCaZ9gUjY4HvnXit8DPjBEnM2f4rk/eO7gwm6ZVbbxFTO46jnqnFh+2yT1N8juSzriMjdG0OqFFMSsiztkpl+w==
+ version "1.4.20"
+ resolved "https://registry.yarnpkg.com/country-flag-icons/-/country-flag-icons-1.4.20.tgz#6676e68ad62dab4c0dcaa09f900f163609b32b92"
+ integrity sha512-f9/cO9IEDIkLdOQeTUMDLEWMcDk4qbTRjbQLpy5pm+yil7Fa7QkKxgiMOQ2z1+Jht8/BAD3JJAmPG4qtK/tbUw==
crc-32@^1.2.0:
version "1.2.1"
@@ -4532,9 +4464,9 @@ cssstyle@^2.3.0:
cssom "~0.3.6"
csstype@^3.0.2, csstype@^3.0.4:
- version "3.0.9"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b"
- integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5"
+ integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
d@1, d@^1.0.1:
version "1.0.1"
@@ -4579,14 +4511,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@~4.3.1:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
- integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
- dependencies:
- ms "2.1.2"
-
-debug@4.3.3:
+debug@4, debug@4.3.3, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@~4.3.1:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
@@ -4760,11 +4685,6 @@ diff-sequences@^26.6.2:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
-diff-sequences@^27.0.6:
- version "27.0.6"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723"
- integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==
-
diff-sequences@^27.4.0:
version "27.4.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5"
@@ -4870,10 +4790,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.886:
- version "1.3.889"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.889.tgz#0b7c6f7628559592d5406deda281788f37107790"
- integrity sha512-suEUoPTD1mExjL9TdmH7cvEiWJVM2oEiAi+Y1p0QKxI2HcRlT44qDTP2c1aZmVwRemIPYOpxmV7CxQCOWcm4XQ==
+electron-to-chromium@^1.4.17:
+ version "1.4.57"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz#2b2766df76ac8dbc0a1d41249bc5684a31849892"
+ integrity sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw==
elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.3, elliptic@^6.5.4:
version "6.5.4"
@@ -5081,9 +5001,9 @@ eslint-plugin-react-hooks@^4.3.0:
integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==
eslint-plugin-react@^7.27.1:
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz#469202442506616f77a854d91babaae1ec174b45"
- integrity sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf"
+ integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==
dependencies:
array-includes "^3.1.4"
array.prototype.flatmap "^1.2.5"
@@ -5567,10 +5487,10 @@ fast-equals@^1.6.3:
resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-1.6.3.tgz#84839a1ce20627c463e1892f2ae316380c81b459"
integrity sha512-4WKW0AL5+WEqO0zWavAfYGY1qwLsBgE//DN4TTcVEN2UlINgkv9b3vm2iHicoenWKSX9mKWmGOsU/iI5IST7pQ==
-fast-glob@^3.1.1, fast-glob@^3.2.7:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
- integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
+fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -5700,9 +5620,9 @@ flat-cache@^3.0.4:
rimraf "^3.0.2"
flatted@^3.1.0:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561"
- integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
+ integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
for-in@^1.0.2:
version "1.0.2"
@@ -5742,10 +5662,10 @@ forwarded@0.2.0:
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
-fraction.js@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.1.tgz#ac4e520473dae67012d618aab91eda09bcb400ff"
- integrity sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==
+fraction.js@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8"
+ integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==
fragment-cache@^0.2.1:
version "0.2.1"
@@ -5973,26 +5893,26 @@ globals@^13.6.0, globals@^13.9.0:
type-fest "^0.20.2"
globby@^11.0.3:
- version "11.0.4"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
- integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
slash "^3.0.0"
-goober@^2.0.35:
- version "2.0.41"
- resolved "https://registry.yarnpkg.com/goober/-/goober-2.0.41.tgz#0a3d786ff9917bcf2a096eef703bf717838cbec9"
- integrity sha512-kwjegMT5018zWydhOQlQneCgCtrKJaPsru7TaBWmTYV0nsMeUrM6L6O8JmNYb9UbPMgWcmtf+9p4Y3oJabIH1A==
+goober@^2.1.1:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.7.tgz#5b1e742a9c7014ba8586a49f2df18d539410e679"
+ integrity sha512-aCR8u3A/tTgSrZAHfJObhYC0xgdKoYm4GvE/UFmxmzgvj3TSF+3oFYWtmJ459WBewjOIoEsoOG81sDs1rn+W5w==
google-auth-library@^7.0.2:
- version "7.10.2"
- resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-7.10.2.tgz#7e48176f50e725e1d65b6a838ec9e9464e6ba689"
- integrity sha512-M37o9Kxa/TLvOLgF71SXvLeVEP5sbSTmKl1zlIgl72SFy5PtsU3pOdu8G8MIHHpQ3/NZabDI8rQkA9DvQVKkPA==
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-7.11.0.tgz#b63699c65037310a424128a854ba7e736704cbdb"
+ integrity sha512-3S5jn2quRumvh9F/Ubf7GFrIq71HZ5a6vqosgdIu105kkk0WtSqc2jGCRqtWWOLRS8SX3AHACMOEDxhyWAQIcg==
dependencies:
arrify "^2.0.0"
base64-js "^1.3.0"
@@ -6005,11 +5925,11 @@ google-auth-library@^7.0.2:
lru-cache "^6.0.0"
google-p12-pem@^3.0.3:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.2.tgz#c3d61c2da8e10843ff830fdb0d2059046238c1d4"
- integrity sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.3.tgz#5497998798ee86c2fc1f4bb1f92b7729baf37537"
+ integrity sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==
dependencies:
- node-forge "^0.10.0"
+ node-forge "^1.0.0"
googleapis-common@^5.0.2:
version "5.0.5"
@@ -6068,12 +5988,7 @@ got@^7.1.0:
url-parse-lax "^1.0.0"
url-to-options "^1.0.1"
-graceful-fs@^4.1.2, graceful-fs@^4.2.4:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
- integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
-
-graceful-fs@^4.1.6:
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.4:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
@@ -6263,7 +6178,7 @@ html-encoding-sniffer@^2.0.1:
dependencies:
whatwg-encoding "^1.0.5"
-html-escaper@^2.0.0:
+html-escaper@^2.0.0, html-escaper@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
@@ -6348,9 +6263,9 @@ husky@^7.0.1:
integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==
i18next-fs-backend@^1.0.7:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/i18next-fs-backend/-/i18next-fs-backend-1.1.1.tgz#1d8028926803f63784ffa0f2b1478fb369f92735"
- integrity sha512-RFkfy10hNxJqc7MVAp5iAZq0Tum6msBCNebEe3OelOBvrROvzHUPaR8Qe10RQrOGokTm0W4vJGEJzruFkEt+hQ==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/i18next-fs-backend/-/i18next-fs-backend-1.1.4.tgz#d0e9b9ed2fa7a0f11002d82b9fa69c3c3d6482da"
+ integrity sha512-/MfAGMP0jHonV966uFf9PkWWuDjPYLIcsipnSO3NxpNtAgRUKLTwvm85fEmsF6hGeu0zbZiCQ3W74jwO6K9uXA==
i18next@^20.1.0:
version "20.6.1"
@@ -6360,9 +6275,9 @@ i18next@^20.1.0:
"@babel/runtime" "^7.12.0"
ical.js@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/ical.js/-/ical.js-1.4.0.tgz#fc5619dc55fe03d909bf04362aa0677f4541b9d7"
- integrity sha512-ltHZuOFNNjcyEYbzDgjemS7LWIFh2vydJeznxQHUh3dnarbxqOYsWONYteBVAq1MEOHnwXFGN2eskZReHclnrA==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/ical.js/-/ical.js-1.5.0.tgz#23213accd1d8f7248d01705acb06270a70d20662"
+ integrity sha512-7ZxMkogUkkaCx810yp0ZGKvq1ZpRgJeornPttpoxe6nYZ3NLesZe1wWMXDdwTkj/b5NtXT+Y16Aakph/ao98ZQ==
iconv-lite@0.4.19:
version "0.4.19"
@@ -6384,9 +6299,9 @@ iconv-lite@^0.6.3:
safer-buffer ">= 2.1.2 < 3.0.0"
ics@^2.31.0:
- version "2.31.0"
- resolved "https://registry.yarnpkg.com/ics/-/ics-2.31.0.tgz#4c26b755d017ee64c963cfbaa5ea9766e604ceec"
- integrity sha512-3pW62uD097nl6LfFXIt92eBZtbwDESXsaRcgZPn3NO01zpUUM+L2G6fjf6qXhiyFcGIrJjsGuNB/y3AV58CvFg==
+ version "2.35.0"
+ resolved "https://registry.yarnpkg.com/ics/-/ics-2.35.0.tgz#9cf3d7bcc9526f78d838b119613adb2a3baf19b8"
+ integrity sha512-uxHoiu9VnE/1RUIWoUqn9GVswUzrejHFa5Gk20gGySw+2FO8xzgJe7GLFk+hzmevHViG/6zANLhjVY6kFWctKQ==
dependencies:
nanoid "^3.1.23"
yup "^0.32.9"
@@ -6413,23 +6328,16 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-ignore@^5.1.4, ignore@^5.1.8:
- version "5.1.9"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb"
- integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==
+ignore@^5.1.8, ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
image-q@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056"
integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=
-import-cwd@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92"
- integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==
- dependencies:
- import-from "^3.0.0"
-
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -6438,17 +6346,10 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
-import-from@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
- integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
- dependencies:
- resolve-from "^5.0.0"
-
import-local@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0"
- integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
dependencies:
pkg-dir "^4.2.0"
resolve-cwd "^3.0.0"
@@ -6486,10 +6387,10 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-input-format@^0.3.6:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/input-format/-/input-format-0.3.6.tgz#b9b167dbd16435eb3c0012347964b230ea0024c8"
- integrity sha512-SbUu43CDVV5GlC8Xi6NYBUoiU+tLpN/IMYyQl0mzSXDiU1w0ql8wpcwjDOFpaCVLySLoreLUimhI82IA5y42Pw==
+input-format@^0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/input-format/-/input-format-0.3.7.tgz#08d63fc629985d604d1910e1d1a220b7a521bdc3"
+ integrity sha512-hgwiCjV7MnhFvX4Hwrvk7hB2a2rcB2CQb7Ex7GlK1ISbEXuLtflwBUnadFSA1rVNDPFh9yWBaJJ4/o1XkzhPIg==
dependencies:
prop-types "^15.7.2"
@@ -6502,13 +6403,14 @@ internal-slot@^1.0.3:
has "^1.0.3"
side-channel "^1.0.4"
-intl-messageformat@9.9.6:
- version "9.9.6"
- resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.9.6.tgz#d76e0ebbef7ae71c16b8b4328bf780180a5a1250"
- integrity sha512-xgoBydnw9zGUtgCiUcxNTzrRLzAbBIgWyKvMjL2jFNCx7H0148GGQWNVOpoiON5SlcFr8lyMWdbb0m+HjydanQ==
+intl-messageformat@9.11.3:
+ version "9.11.3"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.11.3.tgz#e9b26b582891ff0fca327a9ddcb2caf6d26c84e7"
+ integrity sha512-sFOaEw2cytBASTsJkfVod8IJzTx9oOPdU0C7jzprfGATn22FjQGJ60UCyCkKJo6UW+NnpKpwBjO73Pnhvv6HHg==
dependencies:
- "@formatjs/fast-memoize" "1.2.0"
- "@formatjs/icu-messageformat-parser" "2.0.14"
+ "@formatjs/ecma402-abstract" "1.11.2"
+ "@formatjs/fast-memoize" "1.2.1"
+ "@formatjs/icu-messageformat-parser" "2.0.17"
tslib "^2.1.0"
invariant@^2.2.4:
@@ -6599,10 +6501,10 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
-is-core-module@^2.2.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
- integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
+is-core-module@^2.2.0, is-core-module@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+ integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
dependencies:
has "^1.0.3"
@@ -6709,9 +6611,9 @@ is-hex-prefixed@1.0.0:
integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
is-negative-zero@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
- integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
is-number-object@^1.0.4:
version "1.0.6"
@@ -6833,11 +6735,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-weakref@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2"
- integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
is-windows@^1.0.2:
version "1.0.2"
@@ -6938,9 +6840,9 @@ istanbul-lib-source-maps@^4.0.0:
source-map "^0.6.1"
istanbul-reports@^3.0.2:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.5.tgz#a2580107e71279ea6d661ddede929ffc6d693384"
- integrity sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2"
+ integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==
dependencies:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
@@ -7020,25 +6922,15 @@ jest-diff@^26.6.2:
jest-get-type "^26.3.0"
pretty-format "^26.6.2"
-jest-diff@^27.0.0:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.3.1.tgz#d2775fea15411f5f5aeda2a5e02c2f36440f6d55"
- integrity sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==
- dependencies:
- chalk "^4.0.0"
- diff-sequences "^27.0.6"
- jest-get-type "^27.3.1"
- pretty-format "^27.3.1"
-
-jest-diff@^27.2.5, jest-diff@^27.4.2:
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.2.tgz#786b2a5211d854f848e2dcc1e324448e9481f36f"
- integrity sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==
+jest-diff@^27.0.0, jest-diff@^27.2.5, jest-diff@^27.4.6:
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d"
+ integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==
dependencies:
chalk "^4.0.0"
diff-sequences "^27.4.0"
jest-get-type "^27.4.0"
- pretty-format "^27.4.2"
+ pretty-format "^27.4.6"
jest-docblock@^26.0.0:
version "26.0.0"
@@ -7093,11 +6985,6 @@ jest-get-type@^27.0.6, jest-get-type@^27.4.0:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5"
integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==
-jest-get-type@^27.3.1:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.3.1.tgz#a8a2b0a12b50169773099eee60a0e6dd11423eff"
- integrity sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==
-
jest-haste-map@^26.6.2:
version "26.6.2"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa"
@@ -7119,21 +7006,21 @@ jest-haste-map@^26.6.2:
optionalDependencies:
fsevents "^2.1.2"
-jest-haste-map@^27.3.1:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.3.1.tgz#7656fbd64bf48bda904e759fc9d93e2c807353ee"
- integrity sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg==
+jest-haste-map@^27.4.6:
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.6.tgz#c60b5233a34ca0520f325b7e2cc0a0140ad0862a"
+ integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ==
dependencies:
- "@jest/types" "^27.2.5"
+ "@jest/types" "^27.4.2"
"@types/graceful-fs" "^4.1.2"
"@types/node" "*"
anymatch "^3.0.3"
fb-watchman "^2.0.0"
graceful-fs "^4.2.4"
- jest-regex-util "^27.0.6"
- jest-serializer "^27.0.6"
- jest-util "^27.3.1"
- jest-worker "^27.3.1"
+ jest-regex-util "^27.4.0"
+ jest-serializer "^27.4.0"
+ jest-util "^27.4.2"
+ jest-worker "^27.4.6"
micromatch "^4.0.4"
walker "^1.0.7"
optionalDependencies:
@@ -7192,14 +7079,14 @@ jest-matcher-utils@^26.6.2:
pretty-format "^26.6.2"
jest-matcher-utils@^27.2.5:
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz#d17c5038607978a255e0a9a5c32c24e984b6c60b"
- integrity sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ==
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz#53ca7f7b58170638590e946f5363b988775509b8"
+ integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA==
dependencies:
chalk "^4.0.0"
- jest-diff "^27.4.2"
+ jest-diff "^27.4.6"
jest-get-type "^27.4.0"
- pretty-format "^27.4.2"
+ pretty-format "^27.4.6"
jest-message-util@^26.6.2:
version "26.6.2"
@@ -7217,9 +7104,9 @@ jest-message-util@^26.6.2:
stack-utils "^2.0.2"
jest-message-util@^27.2.5:
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.2.tgz#07f3f1bf207d69cf798ce830cc57f1a849f99388"
- integrity sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w==
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.6.tgz#9fdde41a33820ded3127465e1a5896061524da31"
+ integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA==
dependencies:
"@babel/code-frame" "^7.12.13"
"@jest/types" "^27.4.2"
@@ -7227,7 +7114,7 @@ jest-message-util@^27.2.5:
chalk "^4.0.0"
graceful-fs "^4.2.4"
micromatch "^4.0.4"
- pretty-format "^27.4.2"
+ pretty-format "^27.4.6"
slash "^3.0.0"
stack-utils "^2.0.3"
@@ -7249,10 +7136,10 @@ jest-regex-util@^26.0.0:
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
-jest-regex-util@^27.0.6:
- version "27.0.6"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5"
- integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==
+jest-regex-util@^27.0.6, jest-regex-util@^27.4.0:
+ version "27.4.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca"
+ integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg==
jest-resolve-dependencies@^26.6.3:
version "26.6.3"
@@ -7344,10 +7231,10 @@ jest-serializer@^26.6.2:
"@types/node" "*"
graceful-fs "^4.2.4"
-jest-serializer@^27.0.6:
- version "27.0.6"
- resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1"
- integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==
+jest-serializer@^27.4.0:
+ version "27.4.0"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.4.0.tgz#34866586e1cae2388b7d12ffa2c7819edef5958a"
+ integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ==
dependencies:
"@types/node" "*"
graceful-fs "^4.2.4"
@@ -7386,12 +7273,12 @@ jest-util@^26.1.0, jest-util@^26.6.2:
is-ci "^2.0.0"
micromatch "^4.0.2"
-jest-util@^27.3.1:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.3.1.tgz#a58cdc7b6c8a560caac9ed6bdfc4e4ff23f80429"
- integrity sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw==
+jest-util@^27.4.2:
+ version "27.4.2"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.4.2.tgz#ed95b05b1adfd761e2cda47e0144c6a58e05a621"
+ integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA==
dependencies:
- "@jest/types" "^27.2.5"
+ "@jest/types" "^27.4.2"
"@types/node" "*"
chalk "^4.0.0"
ci-info "^3.2.0"
@@ -7432,10 +7319,10 @@ jest-worker@^26.6.2:
merge-stream "^2.0.0"
supports-color "^7.0.0"
-jest-worker@^27.3.1:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2"
- integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==
+jest-worker@^27.4.6:
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e"
+ integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==
dependencies:
"@types/node" "*"
merge-stream "^2.0.0"
@@ -7462,9 +7349,9 @@ jimp@^0.16.1:
regenerator-runtime "^0.13.3"
jose@^4.1.4, jose@^4.3.7:
- version "4.3.7"
- resolved "https://registry.yarnpkg.com/jose/-/jose-4.3.7.tgz#5000e4a2d41ae411a5abdd11e6baf63fc2973a69"
- integrity sha512-S7Xfsy8nN9Iw/AZxk+ZxEbd5ImIwJPM0TfAo8zI8FF+3lidQ2yiK4dqzsaPKSbZD0woNVSY0KCql6rlKc5V7ug==
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/jose/-/jose-4.4.0.tgz#459954544088244836a361172eb32a704bc55c5f"
+ integrity sha512-3CsqCQWuEUPpNlSLRcLRC8eO/ATFe1tLJMZCtjx2+ma1gkjGQ62HF50oWs3cwtWjLCpM8bdMPpQbxpgc3fhxrQ==
jpeg-js@0.4.2:
version "0.4.2"
@@ -7817,20 +7704,20 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
-libphonenumber-js@^1.9.43:
- version "1.9.43"
- resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.43.tgz#2371e4383e6780990381d5b900b8c22666221cbb"
- integrity sha512-tNB87ZutAiAkl3DE/Bo0Mxqn/XZbNxhPg4v9bYBwQQW4dlhBGqXl1vtmPxeDWbrijzwOA9vRjOOFm5V9SK/W3w==
+libphonenumber-js@^1.9.46:
+ version "1.9.46"
+ resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.46.tgz#7ddae167654fb96306209b09e4a05cb7e41e0524"
+ integrity sha512-QqTX4UVsGy24njtCgLRspiKpxfRniRBZE/P+d0vQXuYWQ+hwDS6X0ouo0O/SRyf7bhhMCE71b6vAvLMtY5PfEw==
-lilconfig@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd"
- integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==
+lilconfig@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082"
+ integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==
lines-and-columns@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
- integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
lint-staged@^11.1.2:
version "11.2.6"
@@ -7853,16 +7740,16 @@ lint-staged@^11.1.2:
supports-color "8.1.1"
listr2@^3.12.2:
- version "3.13.3"
- resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.13.3.tgz#d8f6095c9371b382c9b1c2bc33c5941d8e177f11"
- integrity sha512-VqAgN+XVfyaEjSaFewGPcDs5/3hBbWVaX1VgWv2f52MF7US45JuARlArULctiB44IIcEk3JF7GtoFCLqEdeuPA==
+ version "3.14.0"
+ resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e"
+ integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==
dependencies:
cli-truncate "^2.1.0"
- clone "^2.1.2"
colorette "^2.0.16"
log-update "^4.0.0"
p-map "^4.0.0"
- rxjs "^7.4.0"
+ rfdc "^1.3.0"
+ rxjs "^7.5.1"
through "^2.3.8"
wrap-ansi "^7.0.0"
@@ -7918,11 +7805,21 @@ lodash-es@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+lodash.castarray@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115"
+ integrity sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=
+
lodash.clonedeep@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -8095,7 +7992,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.3.0:
+merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -8155,24 +8052,12 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
-mime-db@1.50.0:
- version "1.50.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
- integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
-
mime-db@1.51.0:
version "1.51.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
-mime-types@^2.1.12:
- version "2.1.33"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
- integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
- dependencies:
- mime-db "1.50.0"
-
-mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
+mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24:
version "2.1.34"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
@@ -8184,7 +8069,7 @@ mime@1.6.0, mime@^1.3.4:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-mime@^2.3.1, mime@^2.4.6:
+mime@^2.4.6:
version "2.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
@@ -8318,6 +8203,11 @@ mongodb@4.3.0:
optionalDependencies:
saslprep "^1.0.3"
+mrmime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b"
+ integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -8421,9 +8311,9 @@ nanoclone@^0.2.1:
integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
nanoid@^3.1.23, nanoid@^3.1.30:
- version "3.1.30"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
- integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
+ integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
nanomatch@^1.2.9:
version "1.2.13"
@@ -8458,9 +8348,9 @@ neo-async@^2.6.0:
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
next-auth@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.0.6.tgz#93ca158993fc259c3d00029f644fc98825321e3c"
- integrity sha512-44IwABioPpfI+T8zEHfCH3S7xigd+7XxbqVj2uUTwLZaaYXpjhsNYgiE2ZCh5+8vbj/ls89ypl0TLL7mQeKA8Q==
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.1.2.tgz#9ae50e2b6ccbbbac02b7f627a6568fd29b56ac66"
+ integrity sha512-r5Km0eIDgGad+yhegk6OpulAnf7pyxsIpLec3xYB3PIb7F3bUTsvgWm/n/wAvlT0aAF1xKQWOgqhwPjrjte89g==
dependencies:
"@babel/runtime" "^7.16.3"
"@panva/hkdf" "^1.0.1"
@@ -8486,9 +8376,9 @@ next-i18next@^8.9.0:
react-i18next "^11.8.13"
next-seo@^4.26.0:
- version "4.28.1"
- resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-4.28.1.tgz#c98ee559c8ab7196c62d0f6903afd7a8cde47a03"
- integrity sha512-WZgwdM+UhpNF3A37zFllzmPhnOVJ9vYeYlc0n3Z/kYfz/QQgy8NEdncNNggS9dU4JD8xriaCcyknhy5OsrFsJw==
+ version "4.29.0"
+ resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-4.29.0.tgz#d281e95ba47914117cc99e9e468599f0547d9b9b"
+ integrity sha512-xmwzcz4uHaYJ8glbuhs6FSBQ7z3irmdPYdJJ5saWm72Uy3o+mPKGaPCXQetTCE6/xxVnpoDV4yFtFlEjUcljSg==
next-tick@~1.0.0:
version "1.0.0"
@@ -8512,27 +8402,27 @@ next-transpile-modules@^9.0.0:
escalade "^3.1.1"
next@^12.0.9:
- version "12.0.9"
- resolved "https://registry.yarnpkg.com/next/-/next-12.0.9.tgz#4eb3006b63bb866f5c2918ca0003e98f4259e063"
- integrity sha512-omfYqoR/DvbdOIJ6SS1unKJ4mGIxUPs0RPa7wr/Mft22OCKgJhuG+aI9KFYi5ZJBwoFQk1vqaMKpWz5qr+dN0Q==
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/next/-/next-12.0.10.tgz#fcc4584177418bd777ce157f3165b7ba5e7708f7"
+ integrity sha512-1y3PpGzpb/EZzz1jgne+JfZXKAVJUjYXwxzrADf/LWN+8yi9o79vMLXpW3mevvCHkEF2sBnIdjzNn16TJrINUw==
dependencies:
- "@next/env" "12.0.9"
+ "@next/env" "12.0.10"
caniuse-lite "^1.0.30001283"
postcss "8.4.5"
styled-jsx "5.0.0"
use-subscription "1.5.1"
optionalDependencies:
- "@next/swc-android-arm64" "12.0.9"
- "@next/swc-darwin-arm64" "12.0.9"
- "@next/swc-darwin-x64" "12.0.9"
- "@next/swc-linux-arm-gnueabihf" "12.0.9"
- "@next/swc-linux-arm64-gnu" "12.0.9"
- "@next/swc-linux-arm64-musl" "12.0.9"
- "@next/swc-linux-x64-gnu" "12.0.9"
- "@next/swc-linux-x64-musl" "12.0.9"
- "@next/swc-win32-arm64-msvc" "12.0.9"
- "@next/swc-win32-ia32-msvc" "12.0.9"
- "@next/swc-win32-x64-msvc" "12.0.9"
+ "@next/swc-android-arm64" "12.0.10"
+ "@next/swc-darwin-arm64" "12.0.10"
+ "@next/swc-darwin-x64" "12.0.10"
+ "@next/swc-linux-arm-gnueabihf" "12.0.10"
+ "@next/swc-linux-arm64-gnu" "12.0.10"
+ "@next/swc-linux-arm64-musl" "12.0.10"
+ "@next/swc-linux-x64-gnu" "12.0.10"
+ "@next/swc-linux-x64-musl" "12.0.10"
+ "@next/swc-win32-arm64-msvc" "12.0.10"
+ "@next/swc-win32-ia32-msvc" "12.0.10"
+ "@next/swc-win32-x64-msvc" "12.0.10"
nice-try@^1.0.4:
version "1.0.5"
@@ -8544,24 +8434,17 @@ node-addon-api@^2.0.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
-node-fetch@2.6.7:
+node-fetch@2.6.7, node-fetch@^2.6.1:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
dependencies:
whatwg-url "^5.0.0"
-node-fetch@^2.6.1:
- version "2.6.6"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89"
- integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==
- dependencies:
- whatwg-url "^5.0.0"
-
-node-forge@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
- integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
+node-forge@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c"
+ integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==
node-gyp-build@^4.2.0, node-gyp-build@^4.3.0:
version "4.3.0"
@@ -8573,11 +8456,6 @@ node-int64@^0.4.0:
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-node-modules-regexp@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
- integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
-
node-notifier@^8.0.0:
version "8.0.2"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5"
@@ -8709,9 +8587,9 @@ object-hash@^2.0.1, object-hash@^2.2.0:
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
object-inspect@^1.11.0, object-inspect@^1.9.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
- integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
+ integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1"
@@ -8854,9 +8732,9 @@ opener@^1.5.2:
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
openid-client@^5.1.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.1.1.tgz#4b6597c34444f77494e1a057e93ad83875529324"
- integrity sha512-vwbS4T7hpaWol0GerNabnslUWTxq1NHjnLqdFovzqWlLHW5kp08Tme8FSSeTswABjSC9d88ofTFnfAYy/zwtlQ==
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.1.2.tgz#a80cc6a7d8d7159ad97c51781338f5a954396bba"
+ integrity sha512-AV5wCy011lrZZvzQa4HGhItTb64+D8V50vEtS/HhaFjiM8jDItUyDu4C73nMr6zrlEvgprFdbyGGwkGiQ4ggJg==
dependencies:
jose "^4.1.4"
lru-cache "^6.0.0"
@@ -9201,11 +9079,11 @@ pg@8.7.1:
pgpass "1.x"
pgpass@1.x:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c"
- integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
+ integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
dependencies:
- split2 "^3.1.1"
+ split2 "^4.1.0"
phin@^2.9.1:
version "2.9.3"
@@ -9218,9 +9096,9 @@ picocolors@^1.0.0:
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
- integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pidtree@^0.3.0:
version "0.3.1"
@@ -9232,12 +9110,10 @@ pify@^3.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-pirates@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
- integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
- dependencies:
- node-modules-regexp "^1.0.0"
+pirates@^4.0.1, pirates@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
+ integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
pixelmatch@^4.0.2:
version "4.0.2"
@@ -9316,21 +9192,19 @@ posix-character-classes@^0.1.0:
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
-postcss-js@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33"
- integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==
+postcss-js@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00"
+ integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==
dependencies:
camelcase-css "^2.0.1"
- postcss "^8.1.6"
postcss-load-config@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829"
- integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.1.tgz#2f53a17f2f543d9e63864460af42efdac0d41f87"
+ integrity sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==
dependencies:
- import-cwd "^3.0.0"
- lilconfig "^2.0.3"
+ lilconfig "^2.0.4"
yaml "^1.10.2"
postcss-nested@5.0.6:
@@ -9340,19 +9214,14 @@ postcss-nested@5.0.6:
dependencies:
postcss-selector-parser "^6.0.6"
-postcss-selector-parser@^6.0.6:
- version "6.0.6"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
- integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
+postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9:
+ version "6.0.9"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f"
+ integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
-postcss-value-parser@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
- integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
-
postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
@@ -9367,15 +9236,6 @@ postcss@8.4.5, postcss@^8.4.4:
picocolors "^1.0.0"
source-map-js "^1.0.1"
-postcss@^8.1.6:
- version "8.3.11"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858"
- integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==
- dependencies:
- nanoid "^3.1.30"
- picocolors "^1.0.0"
- source-map-js "^0.6.2"
-
postgres-array@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
@@ -9406,9 +9266,9 @@ preact-render-to-string@^5.1.19:
pretty-format "^3.8.0"
preact@^10.6.3:
- version "10.6.4"
- resolved "https://registry.yarnpkg.com/preact/-/preact-10.6.4.tgz#ad12c409ff1b4316158486e0a7b8d43636f7ced8"
- integrity sha512-WyosM7pxGcndU8hY0OQlLd54tOU+qmG45QXj2dAYrL11HoyU/EzOSTlpJsirbBr1QW7lICxSsVJJmcmUglovHQ==
+ version "10.6.5"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.6.5.tgz#726d8bd12903a0d51cdd17e2e1b90cc539403e0c"
+ integrity sha512-i+LXM6JiVjQXSt2jG2vZZFapGpCuk1fl8o6ii3G84MA3xgj686FKjs4JFDkmUVhtxyq21+4ay74zqPykz9hU6w==
prelude-ls@^1.2.1:
version "1.2.1"
@@ -9457,22 +9317,11 @@ pretty-format@^26.6.2:
ansi-styles "^4.0.0"
react-is "^17.0.1"
-pretty-format@^27.0.0, pretty-format@^27.3.1:
- version "27.3.1"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5"
- integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==
+pretty-format@^27.0.0, pretty-format@^27.2.5, pretty-format@^27.4.6:
+ version "27.4.6"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7"
+ integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==
dependencies:
- "@jest/types" "^27.2.5"
- ansi-regex "^5.0.1"
- ansi-styles "^5.0.0"
- react-is "^17.0.1"
-
-pretty-format@^27.2.5, pretty-format@^27.4.2:
- version "27.4.2"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.2.tgz#e4ce92ad66c3888423d332b40477c87d1dac1fb8"
- integrity sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==
- dependencies:
- "@jest/types" "^27.4.2"
ansi-regex "^5.0.1"
ansi-styles "^5.0.0"
react-is "^17.0.1"
@@ -9523,13 +9372,13 @@ prompts@^2.0.1:
sisteransi "^1.0.5"
prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
- version "15.7.2"
- resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
- integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
dependencies:
loose-envify "^1.4.0"
object-assign "^4.1.1"
- react-is "^16.8.1"
+ react-is "^16.13.1"
proper-lockfile@^4.1.1:
version "4.1.2"
@@ -9541,9 +9390,9 @@ proper-lockfile@^4.1.1:
signal-exit "^3.0.2"
property-expr@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910"
- integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4"
+ integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
proxy-addr@~2.0.7:
version "2.0.7"
@@ -9636,9 +9485,9 @@ qs@6.9.6:
integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==
qs@^6.6.0, qs@^6.7.0:
- version "6.10.1"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
- integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ version "6.10.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
+ integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
dependencies:
side-channel "^1.0.4"
@@ -9781,50 +9630,52 @@ react-easy-crop@^3.5.2:
tslib "2.0.1"
react-fit@^1.0.3:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/react-fit/-/react-fit-1.3.2.tgz#dea734d1dbe4d540037a766c316ae7a4141cf421"
- integrity sha512-Ih/ee8/I/N6EcGZjOqfo/yFq6Q/xuZ62uai21rMyud208ixx8V5xJxuRLIxedLcwNAEtyyEPEJ2Y47qeKljQHA==
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/react-fit/-/react-fit-1.4.0.tgz#6b6e3c75215561cc3cfb9854a6811b4347628666"
+ integrity sha512-cf9sFKbr1rlTB9fNIKE5Uy4NCMUOqrX2mdJ69V4RtmV4KubPdtnbIP1tEar16GXaToCRr7I7c9d2wkTNk9TV5g==
dependencies:
detect-element-overflow "^1.2.0"
prop-types "^15.6.0"
+ tiny-warning "^1.0.0"
react-hook-form@^7.20.4:
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.22.5.tgz#85a135f3c5ae02ccf73096a03fc14b45607e9baa"
- integrity sha512-Q2zaeQFXdVQ8l3hcywhltH+Nzj4vo50wMVujHDVN/1Xy9IOaSZJwYBXA2CYTpK6rq41fnXviw3jTLb04c7Gu9Q==
+ version "7.25.3"
+ resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.25.3.tgz#1475fd52398e905e1f6d88835f96aaa1144635c3"
+ integrity sha512-jL4SByMaC8U3Vhu9s7CwgJBP4M6I3Kpwxib9LrCwWSRPnXDrNQL4uihSTqLLoDICqSUhwwvian9uVYfv+ITtGg==
react-hot-toast@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.1.1.tgz#56409ab406b534e9e58274cf98d80355ba0fdda0"
- integrity sha512-Odrp4wue0fHh0pOfZt5H+9nWCMtqs3wdlFSzZPp7qsxfzmbE26QmGWIh6hG43CukiPeOjA8WQhBJU8JwtWvWbQ==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.2.0.tgz#ab6f4caed4214b9534f94bb8cfaaf21b051e62b9"
+ integrity sha512-248rXw13uhf/6TNDVzagX+y7R8J183rp7MwUMNkcrBRyHj/jWOggfXTGlM8zAOuh701WyVW+eUaWG2LeSufX9g==
dependencies:
- goober "^2.0.35"
+ goober "^2.1.1"
react-i18next@^11.8.13:
- version "11.13.0"
- resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.13.0.tgz#7b6f23f717154a44cf3f70d62a9368152bf8a73f"
- integrity sha512-AY8ydSqx8LVm1Tn5yXFA0JwCeSWpcFOSr96HrjUXXVAWWbptamZOY2iMxVaGNlGxSLnRY0U2sdCIPVYHcmhBxQ==
+ version "11.15.3"
+ resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.15.3.tgz#7608fb3cacc02ac75a62fc2d68b579f140b198dd"
+ integrity sha512-RSUEM4So3Tu2JHV0JsZ5Yje+4nz66YViMfPZoywxOy0xyn3L7tE2CHvJ7Y9LUsrTU7vGmZ5bwb8PpjnkatdIxg==
dependencies:
"@babel/runtime" "^7.14.5"
+ html-escaper "^2.0.2"
html-parse-stringify "^3.0.1"
react-intl@^5.22.0:
- version "5.22.0"
- resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.22.0.tgz#52c76bf551399257b95315a8bce307182ba786c8"
- integrity sha512-+nsRkeIYRI+S2aZKxeJZ9iZFJj8I6KOMPBegZX4LWo0eLyeLrIhbrD/aceg+n/eQZMEq8AMW0n3oXrh62Q/jNg==
+ version "5.24.4"
+ resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.24.4.tgz#1c9dbc5b4e33b068e8c73a2b919af6e681fee5b2"
+ integrity sha512-c3OaJNZUt8CqqjVge+YPof76xRp6HrxmfKtiEB3LOBu466ISliGLPiy3goOdNs9Vj/0+jGagcAk8jqh/pAscAw==
dependencies:
- "@formatjs/ecma402-abstract" "1.10.0"
- "@formatjs/icu-messageformat-parser" "2.0.14"
- "@formatjs/intl" "1.16.0"
- "@formatjs/intl-displaynames" "5.2.5"
- "@formatjs/intl-listformat" "6.3.5"
+ "@formatjs/ecma402-abstract" "1.11.2"
+ "@formatjs/icu-messageformat-parser" "2.0.17"
+ "@formatjs/intl" "1.18.4"
+ "@formatjs/intl-displaynames" "5.4.1"
+ "@formatjs/intl-listformat" "6.5.1"
"@types/hoist-non-react-statics" "^3.3.1"
"@types/react" "16 || 17"
hoist-non-react-statics "^3.3.2"
- intl-messageformat "9.9.6"
+ intl-messageformat "9.11.3"
tslib "^2.1.0"
-react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
+react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -9840,20 +9691,20 @@ react-multi-email@^0.5.3:
integrity sha512-1AneeJlAwjvzkPV740q2SXes/kW3HKOzR3gs+U7whrHN5nz+yH5Unosf/rvz8kRj/eFwBf6fTzMqlJiupu7S5Q==
react-phone-number-input@^3.1.41:
- version "3.1.41"
- resolved "https://registry.yarnpkg.com/react-phone-number-input/-/react-phone-number-input-3.1.41.tgz#350054100e1508d3ce054ce461ab892ad369323c"
- integrity sha512-8ENhruRa7G7rkPUYylsP6S9nZOSwIqGo6n1amoAEsL0jSOMIs64P4Qh1psK7Dbb/LvgVApoBn9i/Qjzs8tJJ4A==
+ version "3.1.45"
+ resolved "https://registry.yarnpkg.com/react-phone-number-input/-/react-phone-number-input-3.1.45.tgz#3ef3a409ddb0cddabe81419aeaa6c7ea3bde8f32"
+ integrity sha512-4rkoTqzp0RvhKR03CApO5obOKxKJrg2uMEWg1ayMoqLF4zg1XFAzfrfkaRZOfUD09Vrod1l7Mzgs8If8ilWCuw==
dependencies:
classnames "^2.2.5"
country-flag-icons "^1.0.2"
- input-format "^0.3.6"
- libphonenumber-js "^1.9.43"
+ input-format "^0.3.7"
+ libphonenumber-js "^1.9.46"
prop-types "^15.7.2"
react-query@^3.33.7:
- version "3.34.6"
- resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.6.tgz#e8158da6642cd3aa47ae12d6febec11bc699821f"
- integrity sha512-2UKldH8T2PjmLxaOzANok7yITQn9FF1pBbrZFF1hvukBjYefHtCjUur+GOVAWMhrsskcCoKRviei4hcpvj9wLQ==
+ version "3.34.12"
+ resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.12.tgz#dcaaf7b629f0868aae8afef9fb7692f6ea7643bf"
+ integrity sha512-flDdudQVH4CqE+kNYYYyo4g2Yjek3H/36G3b9bK5oe26jD5gFnx+PPwnq0gayq5z2dcSfr2z4+drvuyeZ3A5QQ==
dependencies:
"@babel/runtime" "^7.5.5"
broadcast-channel "^3.4.1"
@@ -9907,10 +9758,10 @@ react-router@5.2.1:
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
-react-select@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.2.0.tgz#7535ac8f4ce7216033c0f2cd5c240ca6e4becb3b"
- integrity sha512-JLH2/ei/m1an0Vu4ERMKvGgDB6yHLsgxltho2QennOLTq4Fx35GwGwh+2MFnz5EWgslX6G9rjclUTZWAA2DuBg==
+react-select@^5.2.1, react-select@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.2.2.tgz#3d5edf0a60f1276fd5f29f9f90a305f0a25a5189"
+ integrity sha512-miGS2rT1XbFNjduMZT+V73xbJEeMzVkJOz727F6MeAr2hKE0uUSA8Ff7vD44H32x2PD3SRB6OXTY/L+fTV3z9w==
dependencies:
"@babel/runtime" "^7.12.0"
"@emotion/cache" "^11.4.0"
@@ -9920,23 +9771,10 @@ react-select@^5.1.0:
prop-types "^15.6.0"
react-transition-group "^4.3.0"
-react-select@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.2.1.tgz#416c25c6b79b94687702374e019c4f2ed9d159d6"
- integrity sha512-OOyNzfKrhOcw/BlembyGWgdlJ2ObZRaqmQppPFut1RptJO423j+Y+JIsmxkvsZ4D/3CpOmwIlCvWbbAWEdh12A==
- dependencies:
- "@babel/runtime" "^7.12.0"
- "@emotion/cache" "^11.4.0"
- "@emotion/react" "^11.1.1"
- "@types/react-transition-group" "^4.4.0"
- memoize-one "^5.0.0"
- prop-types "^15.6.0"
- react-transition-group "^4.3.0"
-
-react-ssr-prepass@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/react-ssr-prepass/-/react-ssr-prepass-1.4.0.tgz#33a3db19414f0f8f9f3f781c88f760ae366b4f51"
- integrity sha512-0SzdmiQUtHvhxCabHg9BI/pkJfijGkQ0jQL6fC4YFy7idaDOuaiQLsajIkkNxffFXtJFHIWFITlve2WB88e0Jw==
+react-ssr-prepass@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz#bc4ca7fcb52365e6aea11cc254a3d1bdcbd030c5"
+ integrity sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==
react-style-singleton@^2.1.0:
version "2.1.1"
@@ -9948,11 +9786,11 @@ react-style-singleton@^2.1.0:
tslib "^1.0.0"
react-timezone-select@^1.1.15:
- version "1.1.15"
- resolved "https://registry.yarnpkg.com/react-timezone-select/-/react-timezone-select-1.1.15.tgz#928b51028dfb193cefc10215426aa8f493fe3137"
- integrity sha512-a+GD66LAkpS8zl3F4wfEwocJU8I3DmDKhZSzhNjXwcSal+jIKLw8RObesiOptfuktgGMDi12esv1FY2k5zZoBw==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/react-timezone-select/-/react-timezone-select-1.2.0.tgz#4968696d6b961963b97b633178c7b4aeea459a71"
+ integrity sha512-9v6RnRfzzsqA929aPUyjAk7N1JdPiWfHtu2PrnNrkf22Egf2fleJyDUI6QbjbCra0j8zdX3w1HVWqtAdyWu08A==
dependencies:
- react-select "^5.1.0"
+ react-select "^5.2.2"
spacetime "^6.16.3"
timezone-soft "^1.3.1"
@@ -10043,7 +9881,7 @@ readable-stream@^2.2.2, readable-stream@^2.3.3:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.0, readable-stream@^3.6.0:
+readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -10110,9 +9948,9 @@ regex-not@^1.0.0, regex-not@^1.0.2:
safe-regex "^1.1.0"
regexp.prototype.flags@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
- integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307"
+ integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
@@ -10270,6 +10108,11 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+rfdc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
+ integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
+
rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
@@ -10321,12 +10164,12 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-rxjs@^7.4.0:
- version "7.4.0"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68"
- integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==
+rxjs@^7.5.1:
+ version "7.5.2"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b"
+ integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==
dependencies:
- tslib "~2.1.0"
+ tslib "^2.1.0"
safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
@@ -10567,37 +10410,32 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
-signal-exit@^3.0.0:
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.6"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
-signal-exit@^3.0.2, signal-exit@^3.0.3:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f"
- integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==
-
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^2.7.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
- integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019"
+ integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==
dependencies:
decompress-response "^3.3.0"
once "^1.3.1"
simple-concat "^1.0.0"
sirv@^1.0.7:
- version "1.0.18"
- resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.18.tgz#105fab52fb656ce8a2bebbf36b11052005952899"
- integrity sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA==
+ version "1.0.19"
+ resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49"
+ integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==
dependencies:
"@polka/url" "^1.0.0-next.20"
- mime "^2.3.1"
+ mrmime "^1.0.0"
totalist "^1.0.0"
sisteransi@^1.0.5:
@@ -10672,9 +10510,9 @@ socket.io-parser@*:
debug "~4.3.1"
socks-proxy-agent@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3"
- integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
+ integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==
dependencies:
agent-base "^6.0.2"
debug "^4.3.1"
@@ -10688,15 +10526,10 @@ socks@^2.6.1:
ip "^1.1.5"
smart-buffer "^4.1.0"
-source-map-js@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
- integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
-
source-map-js@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf"
- integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map-resolve@^0.5.0:
version "0.5.3"
@@ -10716,10 +10549,10 @@ source-map-support@^0.4.18:
dependencies:
source-map "^0.5.6"
-source-map-support@^0.5.19, source-map-support@^0.5.6:
- version "0.5.20"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"
- integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==
+source-map-support@^0.5.21, source-map-support@^0.5.6:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -10783,9 +10616,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.10"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b"
- integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
+ integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
@@ -10794,12 +10627,10 @@ split-string@^3.0.1, split-string@^3.0.2:
dependencies:
extend-shallow "^3.0.0"
-split2@^3.1.1:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
- integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
- dependencies:
- readable-stream "^3.0.0"
+split2@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809"
+ integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==
sprintf-js@~1.0.2:
version "1.0.3"
@@ -10984,18 +10815,10 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-stripe@*:
- version "8.186.1"
- resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.186.1.tgz#fb717cfcb8c2e73c91e3873dc286f3e8442bfb65"
- integrity sha512-BBByVyqKEBY2GNQDLmfwL1RtfsPmjForD+up7tu+P7KYxxvwEzF1gM2Iv4npfOQevGaBmR70sxIWRwn7utS5pg==
- dependencies:
- "@types/node" ">=8.1.0"
- qs "^6.6.0"
-
-stripe@^8.191.0:
- version "8.191.0"
- resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.191.0.tgz#7bb56080dce2e2e9cc4f52dc05792626ea46bfd6"
- integrity sha512-3oyuIbuW3WDsbGnMUtIZPkr+sOUJ3NEtEwghd81ZuWc+Tq09MrgWXGekbVnbxA3TMFwfKOILw6QoiPA7za4JUg==
+stripe@*, stripe@^8.191.0:
+ version "8.201.0"
+ resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.201.0.tgz#b77336dfe55326e3445942b74adfa90585ea87ee"
+ integrity sha512-pF0F1DdE9zt0U6Cb0XN+REpdFkUmaqp6C7OEVOCeUpTAafjjJqrdV/WmZd7Y5MwT8XvDAxB5/v3CAXwxAp0XNg==
dependencies:
"@types/node" ">=8.1.0"
qs "^6.6.0"
@@ -11005,10 +10828,10 @@ styled-jsx@5.0.0:
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0.tgz#816b4b92e07b1786c6b7111821750e0ba4d26e77"
integrity sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==
-stylis@^4.0.10:
- version "4.0.10"
- resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240"
- integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==
+stylis@4.0.13:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91"
+ integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==
superjson@1.8.0:
version "1.8.0"
@@ -11075,9 +10898,9 @@ symbol-tree@^3.2.4:
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
table@^6.0.9:
- version "6.7.3"
- resolved "https://registry.yarnpkg.com/table/-/table-6.7.3.tgz#255388439715a738391bd2ee4cbca89a4d05a9b7"
- integrity sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==
+ version "6.8.0"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
+ integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
dependencies:
ajv "^8.0.1"
lodash.truncate "^4.4.2"
@@ -11086,31 +10909,30 @@ table@^6.0.9:
strip-ansi "^6.0.1"
tailwindcss@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.2.tgz#9eea4c6dbe8d6d2c11363d313f4a4eba2baeb652"
- integrity sha512-i1KpjYnGYftjzdAth6jA5iMPjhxpUkk5L6DafhfnQs+KiiWaThYxmk47Weh4oFH1mZqP6MuiQNHxtoRVPOraLg==
+ version "3.0.18"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.18.tgz#ea4825e6496d77dc21877b6b61c7cc56cda3add5"
+ integrity sha512-ihPTpEyA5ANgZbwKlgrbfnzOp9R5vDHFWmqxB1PT8NwOGCOFVVMl+Ps1cQQ369acaqqf1BEF77roCwK0lvNmTw==
dependencies:
arg "^5.0.1"
chalk "^4.1.2"
- chokidar "^3.5.2"
+ chokidar "^3.5.3"
color-name "^1.1.4"
cosmiconfig "^7.0.1"
detective "^5.2.0"
didyoumean "^1.2.2"
dlv "^1.1.3"
- fast-glob "^3.2.7"
+ fast-glob "^3.2.11"
glob-parent "^6.0.2"
is-glob "^4.0.3"
normalize-path "^3.0.0"
object-hash "^2.2.0"
- postcss-js "^3.0.3"
+ postcss-js "^4.0.0"
postcss-load-config "^3.1.0"
postcss-nested "5.0.6"
- postcss-selector-parser "^6.0.6"
+ postcss-selector-parser "^6.0.9"
postcss-value-parser "^4.2.0"
quick-lru "^5.1.1"
- resolve "^1.20.0"
- tmp "^0.2.1"
+ resolve "^1.21.0"
tapable@^2.2.0:
version "2.2.1"
@@ -11216,13 +11038,6 @@ tinycolor2@^1.4.1:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
-tmp@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
- integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
- dependencies:
- rimraf "^3.0.0"
-
tmpl@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@@ -11338,11 +11153,11 @@ ts-jest@^26.0.0:
yargs-parser "20.x"
ts-morph@^13.0.2:
- version "13.0.2"
- resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-13.0.2.tgz#55546023493ef82389d9e4f28848a556c784bac4"
- integrity sha512-SjeeHaRf/mFsNeR3KTJnx39JyEOzT4e+DX28gQx5zjzEOuFs2eGrqeN2PLKs/+AibSxPmzV7RD8nJVKmFJqtLA==
+ version "13.0.3"
+ resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-13.0.3.tgz#c0c51d1273ae2edb46d76f65161eb9d763444c1d"
+ integrity sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==
dependencies:
- "@ts-morph/common" "~0.12.2"
+ "@ts-morph/common" "~0.12.3"
code-block-writer "^11.0.0"
ts-node@^10.2.1:
@@ -11391,17 +11206,12 @@ tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
- integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
-
tslog@^3.2.1:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/tslog/-/tslog-3.2.2.tgz#5bbaa1fab685c4273e59b38064227321a69a0694"
- integrity sha512-8dwb1cYpj3/w/MZTrSkPrdlA44loUodGT8N6ULMojqV4YByVM7ynhvVs9JwcIYxhhHf4bz1C5O3NKIPehnGp/w==
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/tslog/-/tslog-3.3.1.tgz#cf5b236772c05c59e183dc1d088e4dbf5bcd8f85"
+ integrity sha512-An3uyXX95uU/X7v5H6G9OKW6ip/gVOpvsERGJ/nR4Or5TP5GwoI9nUjhNWEc8mJOWC7uhPMg2UzkrVDUtadELg==
dependencies:
- source-map-support "^0.5.19"
+ source-map-support "^0.5.21"
tsutils@^3.21.0:
version "3.21.0"
@@ -11482,9 +11292,9 @@ type@^1.0.1:
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
- integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
+ integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
typedarray-to-buffer@^3.1.5:
version "3.1.5"
@@ -11526,14 +11336,14 @@ typeorm@0.2.41:
zen-observable-ts "^1.0.0"
typescript@^4.5.2:
- version "4.5.2"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
- integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
+ version "4.5.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
+ integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
uglify-js@^3.1.4:
- version "3.14.3"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.3.tgz#c0f25dfea1e8e5323eccf59610be08b6043c15cf"
- integrity sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.0.tgz#2d6a689d94783cab43975721977a13c2afec28f1"
+ integrity sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==
ultron@~1.1.0:
version "1.1.1"
@@ -12222,9 +12032,9 @@ ws@^3.0.0:
ultron "~1.1.0"
ws@^7.3.1, ws@^7.4.6:
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
- integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
+ version "7.5.6"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
+ integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
xhr-request-promise@^0.1.2:
version "0.1.3"
@@ -12394,6 +12204,11 @@ yargs-parser@^18.1.2:
camelcase "^5.0.0"
decamelize "^1.2.0"
+yargs-parser@^21.0.0:
+ version "21.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55"
+ integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==
+
yargs@^15.3.1, yargs@^15.4.1:
version "15.4.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
@@ -12425,17 +12240,17 @@ yargs@^16.0.0:
yargs-parser "^20.2.2"
yargs@^17.0.1:
- version "17.2.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea"
- integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==
+ version "17.3.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9"
+ integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==
dependencies:
cliui "^7.0.2"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
- string-width "^4.2.0"
+ string-width "^4.2.3"
y18n "^5.0.5"
- yargs-parser "^20.2.2"
+ yargs-parser "^21.0.0"
yauzl@^2.10.0:
version "2.10.0"
diff --git a/apps/website b/apps/website
index e54a7cc0ec..d9c37b3220 160000
--- a/apps/website
+++ b/apps/website
@@ -1 +1 @@
-Subproject commit e54a7cc0ecbb36a5a6838f77d8c19ec008c8849a
+Subproject commit d9c37b322081604f5dee0ca471cb0f5d895af8bc
diff --git a/package.json b/package.json
index 9cb92f6047..3007492a29 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,8 @@
"private": true,
"workspaces": [
"apps/*",
- "packages/*"
+ "packages/*",
+ "packages/app-store/*"
],
"scripts": {
"build": "turbo run build --scope=\"@calcom/web\" --include-dependencies",
diff --git a/packages/app-store/_appRegistry.ts b/packages/app-store/_appRegistry.ts
new file mode 100644
index 0000000000..813ba466a3
--- /dev/null
+++ b/packages/app-store/_appRegistry.ts
@@ -0,0 +1,12 @@
+import { App } from "@calcom/types/App";
+
+import appStore from ".";
+
+/** Mainly to use in listings for the frontend, use in getStaticProps or getServerSideProps */
+export function getAppRegistry() {
+ return Object.values(appStore).map((app) => {
+ // Let's not leak api keys to the front end
+ const { key, ...metadata } = app.metadata;
+ return metadata;
+ }) as App[];
+}
diff --git a/packages/app-store/_example/api/example.ts b/packages/app-store/_example/api/example.ts
new file mode 100644
index 0000000000..f0988db139
--- /dev/null
+++ b/packages/app-store/_example/api/example.ts
@@ -0,0 +1,10 @@
+import type { NextApiRequest, NextApiResponse } from "next";
+
+/**
+ * This is an example endoint for an app, these will run under `/api/integrations/[...args]`
+ * @param req
+ * @param res
+ */
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ res.status(200);
+}
diff --git a/packages/app-store/_example/api/index.ts b/packages/app-store/_example/api/index.ts
new file mode 100644
index 0000000000..c10a1b92b3
--- /dev/null
+++ b/packages/app-store/_example/api/index.ts
@@ -0,0 +1 @@
+export { default as example } from "./example";
diff --git a/packages/app-store/_example/components/InstallAppButton.tsx b/packages/app-store/_example/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..4316d0b4af
--- /dev/null
+++ b/packages/app-store/_example/components/InstallAppButton.tsx
@@ -0,0 +1,13 @@
+import { InstallAppButtonProps } from "../../types";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ return (
+ <>
+ {props.render({
+ onClick() {
+ alert("You can put your install code in here!");
+ },
+ })}
+ >
+ );
+}
diff --git a/packages/app-store/_example/components/index.ts b/packages/app-store/_example/components/index.ts
new file mode 100644
index 0000000000..0d6008d4ca
--- /dev/null
+++ b/packages/app-store/_example/components/index.ts
@@ -0,0 +1 @@
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/_example/index.ts b/packages/app-store/_example/index.ts
new file mode 100644
index 0000000000..98a534ae84
--- /dev/null
+++ b/packages/app-store/_example/index.ts
@@ -0,0 +1,28 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: _package.name,
+ description: _package.description,
+ installed: true,
+ category: "video",
+ // If using static next public folder, can then be referenced from the base URL (/).
+ imageSrc: "/cal-com-icon.svg",
+ logo: "/cal-com-icon.svg",
+ label: "Example App",
+ publisher: "Cal.com",
+ rating: 5,
+ reviews: 69,
+ slug: "example_video",
+ title: "Example App",
+ trending: true,
+ type: "example_video",
+ url: "https://cal.com/",
+ variant: "conferencing",
+ verified: true,
+ email: "help@cal.com",
+} as App;
+
+export * as api from "./api";
+export * as lib from "./lib";
diff --git a/packages/app-store/_example/lib/VideoApiAdapter.ts b/packages/app-store/_example/lib/VideoApiAdapter.ts
new file mode 100644
index 0000000000..86609db478
--- /dev/null
+++ b/packages/app-store/_example/lib/VideoApiAdapter.ts
@@ -0,0 +1,36 @@
+import type { VideoApiAdapterFactory } from "@calcom/types/VideoApiAdapter";
+
+/** This is a barebones factory function for a video integration */
+const ExampleVideoApiAdapter: VideoApiAdapterFactory = (credential) => {
+ return {
+ getAvailability: async () => {
+ try {
+ return [];
+ } catch (err) {
+ console.error(err);
+ return [];
+ }
+ },
+ createMeeting: async (event) => {
+ return Promise.resolve({
+ type: "example_video",
+ id: "",
+ password: "",
+ url: "",
+ });
+ },
+ deleteMeeting: async (uid) => {
+ return Promise.resolve();
+ },
+ updateMeeting: async (bookingRef, event) => {
+ return Promise.resolve({
+ type: "example_video",
+ id: bookingRef.meetingId as string,
+ password: bookingRef.meetingPassword as string,
+ url: bookingRef.meetingUrl as string,
+ });
+ },
+ };
+};
+
+export default ExampleVideoApiAdapter;
diff --git a/packages/app-store/_example/lib/index.ts b/packages/app-store/_example/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/_example/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/_example/package.json b/packages/app-store/_example/package.json
new file mode 100644
index 0000000000..757b0296d3
--- /dev/null
+++ b/packages/app-store/_example/package.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/example-app",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "This is a brief description for the Example App.",
+ "dependencies": {
+ "@calcom/prisma": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/_example/static/icon.svg b/packages/app-store/_example/static/icon.svg
new file mode 100644
index 0000000000..d8f2d80f09
--- /dev/null
+++ b/packages/app-store/_example/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/packages/app-store/_utils/decodeOAuthState.ts b/packages/app-store/_utils/decodeOAuthState.ts
new file mode 100644
index 0000000000..9c593ad175
--- /dev/null
+++ b/packages/app-store/_utils/decodeOAuthState.ts
@@ -0,0 +1,12 @@
+import { NextApiRequest } from "next";
+
+import { IntegrationOAuthCallbackState } from "../types";
+
+export function decodeOAuthState(req: NextApiRequest) {
+ if (typeof req.query.state !== "string") {
+ return undefined;
+ }
+ const state: IntegrationOAuthCallbackState = JSON.parse(req.query.state);
+
+ return state;
+}
diff --git a/packages/app-store/_utils/encodeOAuthState.ts b/packages/app-store/_utils/encodeOAuthState.ts
new file mode 100644
index 0000000000..ba4f67c365
--- /dev/null
+++ b/packages/app-store/_utils/encodeOAuthState.ts
@@ -0,0 +1,12 @@
+import { NextApiRequest } from "next";
+
+import { IntegrationOAuthCallbackState } from "../types";
+
+export function encodeOAuthState(req: NextApiRequest) {
+ if (typeof req.query.state !== "string") {
+ return undefined;
+ }
+ const state: IntegrationOAuthCallbackState = JSON.parse(req.query.state);
+
+ return JSON.stringify(state);
+}
diff --git a/packages/app-store/_utils/getCalendar.ts b/packages/app-store/_utils/getCalendar.ts
new file mode 100644
index 0000000000..6c1c5d5c30
--- /dev/null
+++ b/packages/app-store/_utils/getCalendar.ts
@@ -0,0 +1,20 @@
+import { Credential } from "@prisma/client";
+
+import logger from "@calcom/lib/logger";
+import { Calendar } from "@calcom/types/Calendar";
+
+import appStore from "..";
+
+const log = logger.getChildLogger({ prefix: ["CalendarManager"] });
+
+export const getCalendar = (credential: Credential | null): Calendar | null => {
+ if (!credential) return null;
+ const { type: calendarType } = credential;
+ const calendarApp = appStore[calendarType.split("_").join("") as keyof typeof appStore];
+ if (!calendarApp || !("lib" in calendarApp && "CalendarService" in calendarApp.lib)) {
+ log.warn(`calendar of type ${calendarType} does not implemented`);
+ return null;
+ }
+ const CalendarService = calendarApp.lib.CalendarService;
+ return new CalendarService(credential);
+};
diff --git a/packages/app-store/_utils/useAddAppMutation.ts b/packages/app-store/_utils/useAddAppMutation.ts
new file mode 100644
index 0000000000..082a6d9bfd
--- /dev/null
+++ b/packages/app-store/_utils/useAddAppMutation.ts
@@ -0,0 +1,26 @@
+import { useMutation } from "react-query";
+
+import type { IntegrationOAuthCallbackState } from "@calcom/app-store/types";
+import { NEXT_PUBLIC_BASE_URL } from "@calcom/lib/constants";
+import { App } from "@calcom/types/App";
+
+function useAddAppMutation(type: App["type"], options?: Parameters[2]) {
+ const appName = type.replace("_", "");
+ const mutation = useMutation(async () => {
+ const state: IntegrationOAuthCallbackState = {
+ returnTo: NEXT_PUBLIC_BASE_URL + location.pathname + location.search,
+ };
+ const stateStr = encodeURIComponent(JSON.stringify(state));
+ const searchParams = `?state=${stateStr}`;
+ const res = await fetch(`/api/integrations/${appName}/add` + searchParams);
+ if (!res.ok) {
+ throw new Error("Something went wrong");
+ }
+ const json = await res.json();
+ window.location.href = json.url;
+ }, options);
+
+ return mutation;
+}
+
+export default useAddAppMutation;
diff --git a/apps/web/pages/api/integrations/apple/add.ts b/packages/app-store/applecalendar/api/add.ts
similarity index 65%
rename from apps/web/pages/api/integrations/apple/add.ts
rename to packages/app-store/applecalendar/api/add.ts
index df76768329..00f9d8804f 100644
--- a/apps/web/pages/api/integrations/apple/add.ts
+++ b/packages/app-store/applecalendar/api/add.ts
@@ -1,27 +1,19 @@
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import { symmetricEncrypt } from "@lib/crypto";
-import { getCalendar } from "@lib/integrations/calendar/CalendarManager";
-import logger from "@lib/logger";
-import prisma from "@lib/prisma";
+import { symmetricEncrypt } from "@calcom/lib/crypto";
+import logger from "@calcom/lib/logger";
+import prisma from "@calcom/prisma";
+
+import { CalendarService } from "../lib";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "POST") {
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
const { username, password } = req.body;
// Get user
const user = await prisma.user.findFirst({
rejectOnNotFound: true,
where: {
- id: session?.user?.id,
+ id: req.session?.user?.id,
},
select: {
id: true,
@@ -35,7 +27,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
};
try {
- const dav = getCalendar({
+ const dav = new CalendarService({
id: 0,
...data,
});
diff --git a/packages/app-store/applecalendar/api/index.ts b/packages/app-store/applecalendar/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/applecalendar/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/apps/web/lib/integrations/calendar/components/AddAppleIntegration.tsx b/packages/app-store/applecalendar/components/AddIntegration.tsx
similarity index 89%
rename from apps/web/lib/integrations/calendar/components/AddAppleIntegration.tsx
rename to packages/app-store/applecalendar/components/AddIntegration.tsx
index 264682d861..cf5a2d0987 100644
--- a/apps/web/lib/integrations/calendar/components/AddAppleIntegration.tsx
+++ b/packages/app-store/applecalendar/components/AddIntegration.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from "react";
+import { useState } from "react";
import { useForm } from "react-hook-form";
import { Alert } from "@calcom/ui/Alert";
@@ -13,9 +13,9 @@ import {
} from "@calcom/ui/Dialog";
import { Form, TextField } from "@calcom/ui/form/fields";
-export const ADD_APPLE_INTEGRATION_FORM_TITLE = "addAppleIntegration";
+export const ADD_INTEGRATION_FORM_TITLE = "addAppleIntegration";
-export function AddAppleIntegrationModal(props: DialogProps) {
+function AddIntegrationModal(props: DialogProps) {
const form = useForm({
defaultValues: {
username: "",
@@ -24,7 +24,7 @@ export function AddAppleIntegrationModal(props: DialogProps) {
});
const [errorMessage, setErrorMessage] = useState("");
return (
-
+
{
setErrorMessage("");
- const res = await fetch("/api/integrations/apple/add", {
+ const res = await fetch("/api/integrations/applecalendar/add", {
method: "POST",
body: JSON.stringify(values),
headers: {
@@ -100,3 +100,5 @@ export function AddAppleIntegrationModal(props: DialogProps) {
);
}
+
+export default AddIntegrationModal;
diff --git a/packages/app-store/applecalendar/components/InstallAppButton.tsx b/packages/app-store/applecalendar/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..3abb5da049
--- /dev/null
+++ b/packages/app-store/applecalendar/components/InstallAppButton.tsx
@@ -0,0 +1,20 @@
+import { useState } from "react";
+
+import { InstallAppButtonProps } from "../../types";
+import AddIntegration from "./AddIntegration";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const [isModalOpen, setIsModalOpen] = useState(false);
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ setIsModalOpen(true);
+ },
+ disabled: isModalOpen,
+ })}
+
+ >
+ );
+}
diff --git a/packages/app-store/applecalendar/components/index.ts b/packages/app-store/applecalendar/components/index.ts
new file mode 100644
index 0000000000..0cc9f478b3
--- /dev/null
+++ b/packages/app-store/applecalendar/components/index.ts
@@ -0,0 +1,2 @@
+export { default as AddIntegration } from "./AddIntegration";
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/applecalendar/index.ts b/packages/app-store/applecalendar/index.ts
new file mode 100644
index 0000000000..6ad61cd0f1
--- /dev/null
+++ b/packages/app-store/applecalendar/index.ts
@@ -0,0 +1,29 @@
+import { validJson } from "@calcom/lib/jsonUtils";
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Apple Calendar",
+ description: _package.description,
+ installed: true,
+ type: "apple_calendar",
+ title: "Apple Calendar",
+ imageSrc: "/apps/apple-calendar.svg",
+ variant: "calendar",
+ category: "calendar",
+ label: "Apple Calendar",
+ logo: "/apps/apple-calendar.svg",
+ publisher: "Cal.com",
+ rating: 5,
+ reviews: 69,
+ slug: "apple-calendar",
+ trending: false,
+ url: "https://cal.com/",
+ verified: true,
+ email: "help@cal.com",
+} as App;
+
+export * as api from "./api";
+export * as components from "./components";
+export * as lib from "./lib";
diff --git a/packages/app-store/applecalendar/lib/CalendarService.ts b/packages/app-store/applecalendar/lib/CalendarService.ts
new file mode 100644
index 0000000000..278a447528
--- /dev/null
+++ b/packages/app-store/applecalendar/lib/CalendarService.ts
@@ -0,0 +1,9 @@
+import { Credential } from "@prisma/client";
+
+import CalendarService from "@calcom/lib/CalendarService";
+
+export default class AppleCalendarService extends CalendarService {
+ constructor(credential: Credential) {
+ super(credential, "apple_calendar", "https://caldav.icloud.com");
+ }
+}
diff --git a/packages/app-store/applecalendar/lib/index.ts b/packages/app-store/applecalendar/lib/index.ts
new file mode 100644
index 0000000000..e168c149df
--- /dev/null
+++ b/packages/app-store/applecalendar/lib/index.ts
@@ -0,0 +1 @@
+export { default as CalendarService } from "./CalendarService";
diff --git a/packages/app-store/applecalendar/package.json b/packages/app-store/applecalendar/package.json
new file mode 100644
index 0000000000..1f2cc2e2da
--- /dev/null
+++ b/packages/app-store/applecalendar/package.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/applecalendar",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "For personal and business calendars",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "react-hook-form": "^7.20.4"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/apps/web/pages/api/integrations/caldav/add.ts b/packages/app-store/caldavcalendar/api/add.ts
similarity index 65%
rename from apps/web/pages/api/integrations/caldav/add.ts
rename to packages/app-store/caldavcalendar/api/add.ts
index 5cc8864536..bc1699e3a6 100644
--- a/apps/web/pages/api/integrations/caldav/add.ts
+++ b/packages/app-store/caldavcalendar/api/add.ts
@@ -1,27 +1,19 @@
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import { symmetricEncrypt } from "@lib/crypto";
-import { getCalendar } from "@lib/integrations/calendar/CalendarManager";
-import logger from "@lib/logger";
-import prisma from "@lib/prisma";
+import { symmetricEncrypt } from "@calcom/lib/crypto";
+import logger from "@calcom/lib/logger";
+import prisma from "@calcom/prisma";
+
+import { CalendarService } from "../lib";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "POST") {
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
const { username, password, url } = req.body;
// Get user
const user = await prisma.user.findFirst({
rejectOnNotFound: true,
where: {
- id: session?.user?.id,
+ id: req.session?.user?.id,
},
select: {
id: true,
@@ -38,7 +30,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
};
try {
- const dav = getCalendar({
+ const dav = new CalendarService({
id: 0,
...data,
});
diff --git a/packages/app-store/caldavcalendar/api/index.ts b/packages/app-store/caldavcalendar/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/caldavcalendar/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/apps/web/lib/integrations/calendar/components/AddCalDavIntegration.tsx b/packages/app-store/caldavcalendar/components/AddIntegration.tsx
similarity index 52%
rename from apps/web/lib/integrations/calendar/components/AddCalDavIntegration.tsx
rename to packages/app-store/caldavcalendar/components/AddIntegration.tsx
index 3b98be3636..d6a73b070a 100644
--- a/apps/web/lib/integrations/calendar/components/AddCalDavIntegration.tsx
+++ b/packages/app-store/caldavcalendar/components/AddIntegration.tsx
@@ -1,30 +1,27 @@
-import React, { useState } from "react";
+import { useState } from "react";
import { useForm } from "react-hook-form";
import { Alert } from "@calcom/ui/Alert";
import Button from "@calcom/ui/Button";
import {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogFooter,
DialogHeader,
DialogProps,
- Dialog,
- DialogContent,
- DialogClose,
- DialogFooter,
} from "@calcom/ui/Dialog";
import { Form, TextField } from "@calcom/ui/form/fields";
-type Props = {
- onSubmit: () => void;
-};
+export const ADD_INTEGRATION_FORM_TITLE = "addCalDav";
-export const ADD_CALDAV_INTEGRATION_FORM_TITLE = "addCalDav";
-export type AddCalDavIntegrationRequest = {
+export type AddIntegrationRequest = {
url: string;
username: string;
password: string;
};
-export function AddCalDavIntegrationModal(props: DialogProps) {
+export function AddIntegrationModal(props: DialogProps) {
const form = useForm({
defaultValues: {
url: "",
@@ -34,7 +31,7 @@ export function AddCalDavIntegrationModal(props: DialogProps) {
});
const [errorMessage, setErrorMessage] = useState("");
return (
-
+
{
setErrorMessage("");
- const res = await fetch("/api/integrations/caldav/add", {
+ const res = await fetch("/api/integrations/caldavcalendar/add", {
method: "POST",
body: JSON.stringify(values),
headers: {
@@ -106,63 +103,4 @@ export function AddCalDavIntegrationModal(props: DialogProps) {
);
}
-/**
- * @deprecated
- */
-const AddCalDavIntegration = React.forwardRef((props, ref) => {
- const onSubmit = (event: any) => {
- event.preventDefault();
- event.stopPropagation();
-
- props.onSubmit();
- };
-
- return (
-
- );
-});
-
-AddCalDavIntegration.displayName = "AddCalDavIntegrationForm";
-export default AddCalDavIntegration;
+export default AddIntegrationModal;
diff --git a/packages/app-store/caldavcalendar/components/InstallAppButton.tsx b/packages/app-store/caldavcalendar/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..3abb5da049
--- /dev/null
+++ b/packages/app-store/caldavcalendar/components/InstallAppButton.tsx
@@ -0,0 +1,20 @@
+import { useState } from "react";
+
+import { InstallAppButtonProps } from "../../types";
+import AddIntegration from "./AddIntegration";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const [isModalOpen, setIsModalOpen] = useState(false);
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ setIsModalOpen(true);
+ },
+ disabled: isModalOpen,
+ })}
+
+ >
+ );
+}
diff --git a/packages/app-store/caldavcalendar/components/index.ts b/packages/app-store/caldavcalendar/components/index.ts
new file mode 100644
index 0000000000..0cc9f478b3
--- /dev/null
+++ b/packages/app-store/caldavcalendar/components/index.ts
@@ -0,0 +1,2 @@
+export { default as AddIntegration } from "./AddIntegration";
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/caldavcalendar/index.ts b/packages/app-store/caldavcalendar/index.ts
new file mode 100644
index 0000000000..b98ca8231f
--- /dev/null
+++ b/packages/app-store/caldavcalendar/index.ts
@@ -0,0 +1,28 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "CalDav Server",
+ description: _package.description,
+ installed: true,
+ type: "caldav_calendar",
+ title: "CalDav Server",
+ imageSrc: "/apps/caldav.svg",
+ variant: "calendar",
+ category: "calendar",
+ label: "CalDav Calendar",
+ logo: "/apps/caldav.svg",
+ publisher: "Cal.com",
+ rating: 5,
+ reviews: 69,
+ slug: "caldav-calendar",
+ trending: false,
+ url: "https://cal.com/",
+ verified: true,
+ email: "help@cal.com",
+} as App;
+
+export * as api from "./api";
+export * as components from "./components";
+export * as lib from "./lib";
diff --git a/packages/app-store/caldavcalendar/lib/CalendarService.ts b/packages/app-store/caldavcalendar/lib/CalendarService.ts
new file mode 100644
index 0000000000..42e1c23d8b
--- /dev/null
+++ b/packages/app-store/caldavcalendar/lib/CalendarService.ts
@@ -0,0 +1,9 @@
+import { Credential } from "@prisma/client";
+
+import CalendarService from "@calcom/lib/CalendarService";
+
+export default class CalDavCalendarService extends CalendarService {
+ constructor(credential: Credential) {
+ super(credential, "caldav_calendar");
+ }
+}
diff --git a/packages/app-store/caldavcalendar/lib/index.ts b/packages/app-store/caldavcalendar/lib/index.ts
new file mode 100644
index 0000000000..e168c149df
--- /dev/null
+++ b/packages/app-store/caldavcalendar/lib/index.ts
@@ -0,0 +1 @@
+export { default as CalendarService } from "./CalendarService";
diff --git a/packages/app-store/caldavcalendar/package.json b/packages/app-store/caldavcalendar/package.json
new file mode 100644
index 0000000000..e9c93e9b2e
--- /dev/null
+++ b/packages/app-store/caldavcalendar/package.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/caldavcalendar",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "CalDAV is an open calendar standard which connects to virtually every calendar.",
+ "dependencies": {
+ "@calcom/core": "*",
+ "@calcom/lib": "*",
+ "@calcom/prisma": "*",
+ "@calcom/ui": "*",
+ "react-hook-form": "^7.20.4"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/components.tsx b/packages/app-store/components.tsx
new file mode 100644
index 0000000000..b93e51adde
--- /dev/null
+++ b/packages/app-store/components.tsx
@@ -0,0 +1,48 @@
+import { useSession } from "next-auth/react";
+import dynamic from "next/dynamic";
+
+import { NEXT_PUBLIC_BASE_URL } from "@calcom/lib/constants";
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import type { App } from "@calcom/types/App";
+import Button from "@calcom/ui/Button";
+
+import { InstallAppButtonProps } from "./types";
+
+export const InstallAppButtonMap = {
+ // examplevideo: dynamic(() => import("./_example/components/InstallAppButton")),
+ applecalendar: dynamic(() => import("./applecalendar/components/InstallAppButton")),
+ caldavcalendar: dynamic(() => import("./caldavcalendar/components/InstallAppButton")),
+ googlecalendar: dynamic(() => import("./googlecalendar/components/InstallAppButton")),
+ office365calendar: dynamic(() => import("./office365calendar/components/InstallAppButton")),
+ stripepayment: dynamic(() => import("./stripepayment/components/InstallAppButton")),
+ tandemvideo: dynamic(() => import("./tandemvideo/components/InstallAppButton")),
+ zoomvideo: dynamic(() => import("./zoomvideo/components/InstallAppButton")),
+};
+
+export const InstallAppButton = (
+ props: {
+ type: App["type"];
+ } & InstallAppButtonProps
+) => {
+ const { status } = useSession();
+ const { t } = useLocale();
+ const appName = props.type.replace("_", "") as keyof typeof InstallAppButtonMap;
+ const InstallAppButtonComponent = InstallAppButtonMap[appName];
+ if (!InstallAppButtonComponent) return null;
+ if (status === "unauthenticated")
+ return (
+ (
+
+ {t("install_app")}
+
+ )}
+ onChanged={props.onChanged}
+ />
+ );
+ return ;
+};
diff --git a/packages/app-store/dailyvideo/index.ts b/packages/app-store/dailyvideo/index.ts
new file mode 100644
index 0000000000..acddcdb6c6
--- /dev/null
+++ b/packages/app-store/dailyvideo/index.ts
@@ -0,0 +1,29 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Cal Video",
+ description: _package.description,
+ installed: !!process.env.DAILY_API_KEY,
+ type: "daily_video",
+ imageSrc: "/apps/daily.svg",
+ variant: "conferencing",
+ url: "https://daily.co/",
+ trending: true,
+ logo: "/apps/daily.svg",
+ publisher: "Cal.com",
+ verified: true,
+ rating: 4.3, // TODO: placeholder for now, pull this from TrustPilot or G2
+ reviews: 69, // TODO: placeholder for now, pull this from TrustPilot or G2
+ category: "video",
+ label: "Daily.co Video",
+ slug: "dailyvideo",
+ title: "Daily.co Video",
+ isGlobal: true,
+ email: "help@cal.com",
+ locationType: "integrations:daily",
+ key: { apikey: process.env.DAILY_API_KEY },
+} as App;
+
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/Daily/DailyVideoApiAdapter.ts b/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts
similarity index 88%
rename from apps/web/lib/integrations/Daily/DailyVideoApiAdapter.ts
rename to packages/app-store/dailyvideo/lib/VideoApiAdapter.ts
index f3f574111a..24eea62c37 100644
--- a/apps/web/lib/integrations/Daily/DailyVideoApiAdapter.ts
+++ b/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts
@@ -1,14 +1,13 @@
import { Credential } from "@prisma/client";
+import { BASE_URL } from "@calcom/lib/constants";
import { handleErrorsJson } from "@calcom/lib/errors";
+import prisma from "@calcom/prisma";
+import type { CalendarEvent } from "@calcom/types/Calendar";
+import type { PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
-import { BASE_URL } from "@lib/config/constants";
-import { PartialReference } from "@lib/events/EventManager";
-import prisma from "@lib/prisma";
-import { VideoApiAdapter, VideoCallData } from "@lib/videoClient";
-
-import { CalendarEvent } from "../calendar/interfaces/Calendar";
-
+/** @link https://docs.daily.co/reference/rest-api/rooms/create-room */
export interface DailyReturnType {
/** Long UID string ie: 987b5eb5-d116-4a4e-8e2c-14fcb5710966 */
id: string;
@@ -20,7 +19,9 @@ export interface DailyReturnType {
url: string;
created_at: string;
config: {
+ /** Timestamps expressed in seconds, not in milliseconds */
nbf: number;
+ /** Timestamps expressed in seconds, not in milliseconds */
exp: number;
enable_chat: boolean;
enable_knocking: boolean;
@@ -50,6 +51,7 @@ type DailyKey = {
apikey: string;
};
+/** @deprecated use metadata on index file */
export const FAKE_DAILY_CREDENTIAL: Credential = {
id: +new Date().getTime(),
type: "daily_video",
diff --git a/packages/app-store/dailyvideo/lib/index.ts b/packages/app-store/dailyvideo/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/dailyvideo/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/dailyvideo/package.json b/packages/app-store/dailyvideo/package.json
new file mode 100644
index 0000000000..3a56ad57bc
--- /dev/null
+++ b/packages/app-store/dailyvideo/package.json
@@ -0,0 +1,14 @@
+{
+ "private": true,
+ "name": "@calcom/dailyvideo",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Cal Video is the in-house web-based video conferencing platform powered by Daily.co, which is minimalistic and lightweight, but has most of the features you need.",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/dailyvideo/static/icon.svg b/packages/app-store/dailyvideo/static/icon.svg
new file mode 100644
index 0000000000..d8f2d80f09
--- /dev/null
+++ b/packages/app-store/dailyvideo/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/apps/web/pages/api/integrations/googlecalendar/add.ts b/packages/app-store/googlecalendar/api/add.ts
similarity index 77%
rename from apps/web/pages/api/integrations/googlecalendar/add.ts
rename to packages/app-store/googlecalendar/api/add.ts
index 15fdf7827b..87c604bb4b 100644
--- a/apps/web/pages/api/integrations/googlecalendar/add.ts
+++ b/packages/app-store/googlecalendar/api/add.ts
@@ -1,10 +1,9 @@
import { google } from "googleapis";
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
+import { BASE_URL } from "@calcom/lib/constants";
-import { encodeOAuthState } from "../utils";
+import { encodeOAuthState } from "../../_utils/encodeOAuthState";
const credentials = process.env.GOOGLE_API_CREDENTIALS!;
const scopes = [
@@ -14,14 +13,6 @@ const scopes = [
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "GET") {
- // Check that user is authenticated
- const session = await getSession({ req: req });
-
- if (!session) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
// Get token from Google Calendar API
const { client_secret, client_id } = JSON.parse(credentials).web;
const redirect_uri = BASE_URL + "/api/integrations/googlecalendar/callback";
diff --git a/apps/web/pages/api/integrations/googlecalendar/callback.ts b/packages/app-store/googlecalendar/api/callback.ts
similarity index 68%
rename from apps/web/pages/api/integrations/googlecalendar/callback.ts
rename to packages/app-store/googlecalendar/api/callback.ts
index 5499db83e4..d9bbaeb864 100644
--- a/apps/web/pages/api/integrations/googlecalendar/callback.ts
+++ b/packages/app-store/googlecalendar/api/callback.ts
@@ -1,24 +1,16 @@
import { google } from "googleapis";
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
-import prisma from "@lib/prisma";
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
-import { decodeOAuthState } from "../utils";
+import { decodeOAuthState } from "../../_utils/decodeOAuthState";
const credentials = process.env.GOOGLE_API_CREDENTIALS;
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { code } = req.query;
- // Check that user is authenticated
- const session = await getSession({ req: req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
if (code && typeof code !== "string") {
res.status(400).json({ message: "`code` must be a string" });
return;
@@ -45,9 +37,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
data: {
type: "google_calendar",
key,
- userId: session.user.id,
+ userId: req.session?.user.id,
},
});
const state = decodeOAuthState(req);
- res.redirect(state?.returnTo ?? "/integrations");
+ res.redirect(state?.returnTo ?? "/apps/installed");
}
diff --git a/packages/app-store/googlecalendar/api/index.ts b/packages/app-store/googlecalendar/api/index.ts
new file mode 100644
index 0000000000..eb12c1b4ed
--- /dev/null
+++ b/packages/app-store/googlecalendar/api/index.ts
@@ -0,0 +1,2 @@
+export { default as add } from "./add";
+export { default as callback } from "./callback";
diff --git a/packages/app-store/googlecalendar/components/InstallAppButton.tsx b/packages/app-store/googlecalendar/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..f059a138eb
--- /dev/null
+++ b/packages/app-store/googlecalendar/components/InstallAppButton.tsx
@@ -0,0 +1,18 @@
+import type { InstallAppButtonProps } from "@calcom/app-store/types";
+
+import useAddAppMutation from "../../_utils/useAddAppMutation";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const mutation = useAddAppMutation("google_calendar");
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ mutation.mutate("");
+ },
+ loading: mutation.isLoading,
+ })}
+ >
+ );
+}
diff --git a/packages/app-store/googlecalendar/components/index.ts b/packages/app-store/googlecalendar/components/index.ts
new file mode 100644
index 0000000000..0d6008d4ca
--- /dev/null
+++ b/packages/app-store/googlecalendar/components/index.ts
@@ -0,0 +1 @@
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/googlecalendar/index.ts b/packages/app-store/googlecalendar/index.ts
new file mode 100644
index 0000000000..e469b6198f
--- /dev/null
+++ b/packages/app-store/googlecalendar/index.ts
@@ -0,0 +1,28 @@
+import { validJson } from "@calcom/lib/jsonUtils";
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Google Calendar",
+ description: _package.description,
+ installed: !!(process.env.GOOGLE_API_CREDENTIALS && validJson(process.env.GOOGLE_API_CREDENTIALS)),
+ type: "google_calendar",
+ title: "Google Calendar",
+ imageSrc: "/apps/google-calendar.svg",
+ variant: "calendar",
+ category: "calendar",
+ label: "Google Calendar",
+ logo: "/apps/google-calendar.svg",
+ publisher: "Cal.com",
+ rating: 5,
+ reviews: 69,
+ slug: "google-calendar",
+ trending: false,
+ url: "https://cal.com/",
+ verified: true,
+ email: "help@cal.com",
+} as App;
+
+export * as api from "./api";
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/calendar/services/GoogleCalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts
similarity index 95%
rename from apps/web/lib/integrations/calendar/services/GoogleCalendarService.ts
rename to packages/app-store/googlecalendar/lib/CalendarService.ts
index 552fce03fe..1e742aa35c 100644
--- a/apps/web/lib/integrations/calendar/services/GoogleCalendarService.ts
+++ b/packages/app-store/googlecalendar/lib/CalendarService.ts
@@ -2,14 +2,17 @@ import { Credential, Prisma } from "@prisma/client";
import { GetTokenResponse } from "google-auth-library/build/src/auth/oauth2client";
import { Auth, calendar_v3, google } from "googleapis";
-import { getLocation, getRichDescription } from "@lib/CalEventParser";
-import { CALENDAR_INTEGRATIONS_TYPES } from "@lib/integrations/calendar/constants/generals";
-import logger from "@lib/logger";
-import prisma from "@lib/prisma";
-
-import { EventBusyDate, NewCalendarEventType } from "../constants/types";
-import { Calendar, CalendarEvent, IntegrationCalendar } from "../interfaces/Calendar";
-import CalendarService from "./BaseCalendarService";
+import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser";
+import CalendarService from "@calcom/lib/CalendarService";
+import logger from "@calcom/lib/logger";
+import prisma from "@calcom/prisma";
+import type {
+ Calendar,
+ CalendarEvent,
+ EventBusyDate,
+ IntegrationCalendar,
+ NewCalendarEventType,
+} from "@calcom/types/Calendar";
const GOOGLE_API_CREDENTIALS = process.env.GOOGLE_API_CREDENTIALS || "";
@@ -20,7 +23,7 @@ export default class GoogleCalendarService implements Calendar {
private log: typeof logger;
constructor(credential: Credential) {
- this.integrationName = CALENDAR_INTEGRATIONS_TYPES.google;
+ this.integrationName = "google_calendar";
this.auth = this.googleAuth(credential);
diff --git a/packages/app-store/googlecalendar/lib/index.ts b/packages/app-store/googlecalendar/lib/index.ts
new file mode 100644
index 0000000000..e168c149df
--- /dev/null
+++ b/packages/app-store/googlecalendar/lib/index.ts
@@ -0,0 +1 @@
+export { default as CalendarService } from "./CalendarService";
diff --git a/packages/app-store/googlecalendar/package.json b/packages/app-store/googlecalendar/package.json
new file mode 100644
index 0000000000..2ed4096135
--- /dev/null
+++ b/packages/app-store/googlecalendar/package.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/googlecalendar",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "For personal and business calendars",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "googleapis": "^84.0.0"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/googlecalendar/static/icon.svg b/packages/app-store/googlecalendar/static/icon.svg
new file mode 100644
index 0000000000..d8f2d80f09
--- /dev/null
+++ b/packages/app-store/googlecalendar/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/packages/app-store/googlevideo/index.ts b/packages/app-store/googlevideo/index.ts
new file mode 100644
index 0000000000..85f6f925a4
--- /dev/null
+++ b/packages/app-store/googlevideo/index.ts
@@ -0,0 +1,29 @@
+import { validJson } from "@calcom/lib/jsonUtils";
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Google Meet",
+ description: _package.description,
+ installed: !!(process.env.GOOGLE_API_CREDENTIALS && validJson(process.env.GOOGLE_API_CREDENTIALS)),
+ slug: "google-meet",
+ category: "video",
+ type: "google_video",
+ title: "Google Meet",
+ imageSrc: "https://cdn.iconscout.com/icon/free/png-256/google-meet-2923654-2416657.png",
+ variant: "conferencing",
+ label: "Google Meet",
+ logo: "https://cdn.iconscout.com/icon/free/png-256/google-meet-2923654-2416657.png",
+ publisher: "Cal.com",
+ rating: 5,
+ reviews: 69,
+ trending: false,
+ url: "https://cal.com/",
+ verified: true,
+ email: "help@cal.com",
+ locationType: "integrations:google:meet",
+} as App;
+
+// export * as api from "./api";
+// export * as lib from "./lib";
diff --git a/packages/app-store/googlevideo/package.json b/packages/app-store/googlevideo/package.json
new file mode 100644
index 0000000000..184a1ee8bc
--- /dev/null
+++ b/packages/app-store/googlevideo/package.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/googlevideo",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Google Meet is Google's web-based video conferencing platform, designed to compete with major conferencing platforms.",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "googleapis": "^84.0.0"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/googlevideo/static/icon.svg b/packages/app-store/googlevideo/static/icon.svg
new file mode 100644
index 0000000000..d8f2d80f09
--- /dev/null
+++ b/packages/app-store/googlevideo/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/packages/app-store/huddle01video/index.ts b/packages/app-store/huddle01video/index.ts
new file mode 100644
index 0000000000..49cad25e83
--- /dev/null
+++ b/packages/app-store/huddle01video/index.ts
@@ -0,0 +1,30 @@
+import { randomString } from "@calcom/lib/random";
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Huddle01",
+ description: _package.description,
+ installed: true,
+ type: "huddle01_video",
+ imageSrc: "/apps/huddle.svg",
+ variant: "conferencing",
+ logo: "/apps/huddle.svg",
+ publisher: "Cal.com",
+ url: "https://huddle01.com/",
+ verified: true,
+ rating: 0, // TODO: placeholder for now, pull this from TrustPilot or G2
+ reviews: 0, // TODO: placeholder for now, pull this from TrustPilot or G2
+ category: "video",
+ label: "Huddle01 Video",
+ slug: "huddle01_video",
+ title: "Huddle01",
+ trending: true,
+ isGlobal: true,
+ email: "help@cal.com",
+ locationType: "integrations:huddle01",
+ key: { apikey: randomString(12) },
+} as App;
+
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/Huddle01/Huddle01VideoApiAdapter.ts b/packages/app-store/huddle01video/lib/VideoApiAdapter.ts
similarity index 72%
rename from apps/web/lib/integrations/Huddle01/Huddle01VideoApiAdapter.ts
rename to packages/app-store/huddle01video/lib/VideoApiAdapter.ts
index f8eb84d39d..1850a34ca4 100644
--- a/apps/web/lib/integrations/Huddle01/Huddle01VideoApiAdapter.ts
+++ b/packages/app-store/huddle01video/lib/VideoApiAdapter.ts
@@ -1,17 +1,7 @@
-import { Credential } from "@prisma/client";
-
import { handleErrorsJson } from "@calcom/lib/errors";
-
-import { PartialReference } from "@lib/events/EventManager";
-import { randomString } from "@lib/random";
-import { VideoApiAdapter, VideoCallData } from "@lib/videoClient";
-
-export const FAKE_HUDDLE_CREDENTIAL: Credential = {
- id: +new Date().getTime(),
- type: "huddle01_video",
- key: { apikey: randomString(12) },
- userId: +new Date().getTime(),
-};
+import { randomString } from "@calcom/lib/random";
+import type { PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
const Huddle01VideoApiAdapter = (): VideoApiAdapter => {
return {
diff --git a/packages/app-store/huddle01video/lib/index.ts b/packages/app-store/huddle01video/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/huddle01video/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/huddle01video/package.json b/packages/app-store/huddle01video/package.json
new file mode 100644
index 0000000000..5a3a7a14ca
--- /dev/null
+++ b/packages/app-store/huddle01video/package.json
@@ -0,0 +1,13 @@
+{
+ "private": true,
+ "name": "@calcom/huddle01video",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Video conferencing",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/index.ts b/packages/app-store/index.ts
new file mode 100644
index 0000000000..2952f22bf9
--- /dev/null
+++ b/packages/app-store/index.ts
@@ -0,0 +1,31 @@
+// import * as example from "./_example";
+import * as applecalendar from "./applecalendar";
+import * as caldavcalendar from "./caldavcalendar";
+import * as dailyvideo from "./dailyvideo";
+import * as googlecalendar from "./googlecalendar";
+import * as googlevideo from "./googlevideo";
+import * as huddle01video from "./huddle01video";
+import * as jitsivideo from "./jitsivideo";
+import * as office365calendar from "./office365calendar";
+import * as office365video from "./office365video";
+import * as stripepayment from "./stripepayment";
+import * as tandemvideo from "./tandemvideo";
+import * as zoomvideo from "./zoomvideo";
+
+const appStore = {
+ // example,
+ applecalendar,
+ caldavcalendar,
+ dailyvideo,
+ googlecalendar,
+ googlevideo,
+ huddle01video,
+ jitsivideo,
+ office365calendar,
+ office365video,
+ stripepayment,
+ tandemvideo,
+ zoomvideo,
+};
+
+export default appStore;
diff --git a/packages/app-store/jitsivideo/index.ts b/packages/app-store/jitsivideo/index.ts
new file mode 100644
index 0000000000..7092277dad
--- /dev/null
+++ b/packages/app-store/jitsivideo/index.ts
@@ -0,0 +1,28 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Jitsi Video",
+ description: _package.description,
+ installed: true,
+ type: "jitsi_video",
+ imageSrc: "/apps/jitsi.svg",
+ variant: "conferencing",
+ logo: "/apps/jitsi.svg",
+ locationType: "integrations:jitsi",
+ publisher: "Cal.com",
+ url: "https://jitsi.org/",
+ verified: true,
+ rating: 0, // TODO: placeholder for now, pull this from TrustPilot or G2
+ reviews: 0, // TODO: placeholder for now, pull this from TrustPilot or G2
+ category: "video",
+ label: "Jitsi Video",
+ slug: "jitsi_video",
+ title: "Jitsi Meet",
+ trending: true,
+ isGlobal: true,
+ email: "help@cal.com",
+} as App;
+
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/Jitsi/JitsiVideoApiAdapter.ts b/packages/app-store/jitsivideo/lib/VideoApiAdapter.ts
similarity index 68%
rename from apps/web/lib/integrations/Jitsi/JitsiVideoApiAdapter.ts
rename to packages/app-store/jitsivideo/lib/VideoApiAdapter.ts
index f27b4af492..cc11262572 100644
--- a/apps/web/lib/integrations/Jitsi/JitsiVideoApiAdapter.ts
+++ b/packages/app-store/jitsivideo/lib/VideoApiAdapter.ts
@@ -1,16 +1,7 @@
-import { Credential } from "@prisma/client";
import { v4 as uuidv4 } from "uuid";
-import { PartialReference } from "@lib/events/EventManager";
-import { randomString } from "@lib/random";
-import { VideoApiAdapter, VideoCallData } from "@lib/videoClient";
-
-export const FAKE_JITSI_CREDENTIAL: Credential = {
- id: +new Date().getTime(),
- type: "jitsi_video",
- key: { apikey: randomString(12) },
- userId: +new Date().getTime(),
-};
+import type { PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
const JitsiVideoApiAdapter = (): VideoApiAdapter => {
return {
diff --git a/packages/app-store/jitsivideo/lib/index.ts b/packages/app-store/jitsivideo/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/jitsivideo/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/jitsivideo/package.json b/packages/app-store/jitsivideo/package.json
new file mode 100644
index 0000000000..3f74eb6ebc
--- /dev/null
+++ b/packages/app-store/jitsivideo/package.json
@@ -0,0 +1,13 @@
+{
+ "private": true,
+ "name": "@calcom/jitsivideo",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Video Conferencing",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/jitsivideo/static/icon.svg b/packages/app-store/jitsivideo/static/icon.svg
new file mode 100644
index 0000000000..25e08b18e7
--- /dev/null
+++ b/packages/app-store/jitsivideo/static/icon.svg
@@ -0,0 +1,38 @@
+€
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/types/next-auth.d.ts b/packages/app-store/next-auth.d.ts
similarity index 100%
rename from apps/web/types/next-auth.d.ts
rename to packages/app-store/next-auth.d.ts
diff --git a/packages/app-store/next.d.ts b/packages/app-store/next.d.ts
new file mode 100644
index 0000000000..aa0e02c1c2
--- /dev/null
+++ b/packages/app-store/next.d.ts
@@ -0,0 +1,10 @@
+import type { IncomingMessage } from "http";
+import type { Session } from "next-auth";
+
+import "./next-auth";
+
+export declare module "next" {
+ interface NextApiRequest extends IncomingMessage {
+ session?: Session | null;
+ }
+}
diff --git a/apps/web/pages/api/integrations/office365calendar/add.ts b/packages/app-store/office365calendar/api/add.ts
similarity index 68%
rename from apps/web/pages/api/integrations/office365calendar/add.ts
rename to packages/app-store/office365calendar/api/add.ts
index 7ab61569e4..f174407a5e 100644
--- a/apps/web/pages/api/integrations/office365calendar/add.ts
+++ b/packages/app-store/office365calendar/api/add.ts
@@ -1,23 +1,14 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { stringify } from "querystring";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
+import { BASE_URL } from "@calcom/lib/constants";
-import { encodeOAuthState } from "../utils";
+import { encodeOAuthState } from "../../_utils/encodeOAuthState";
const scopes = ["User.Read", "Calendars.Read", "Calendars.ReadWrite", "offline_access"];
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "GET") {
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
const state = encodeOAuthState(req);
const params = {
response_type: "code",
diff --git a/apps/web/pages/api/integrations/office365calendar/callback.ts b/packages/app-store/office365calendar/api/callback.ts
similarity index 76%
rename from apps/web/pages/api/integrations/office365calendar/callback.ts
rename to packages/app-store/office365calendar/api/callback.ts
index 35814fbac0..940f74f062 100644
--- a/apps/web/pages/api/integrations/office365calendar/callback.ts
+++ b/packages/app-store/office365calendar/api/callback.ts
@@ -1,22 +1,15 @@
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
-import prisma from "../../../../lib/prisma";
-import { decodeOAuthState } from "../utils";
+import { decodeOAuthState } from "../../_utils/decodeOAuthState";
const scopes = ["offline_access", "Calendars.Read", "Calendars.ReadWrite"];
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { code } = req.query;
- // Check that user is authenticated
- const session = await getSession({ req: req });
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
if (typeof code !== "string") {
res.status(400).json({ message: "No code returned" });
return;
@@ -47,7 +40,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const responseBody = await response.json();
if (!response.ok) {
- return res.redirect("/integrations?error=" + JSON.stringify(responseBody));
+ return res.redirect("/apps/installed?error=" + JSON.stringify(responseBody));
}
const whoami = await fetch("https://graph.microsoft.com/v1.0/me", {
@@ -64,10 +57,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
data: {
type: "office365_calendar",
key: responseBody,
- userId: session.user.id,
+ userId: req.session?.user.id,
},
});
const state = decodeOAuthState(req);
- return res.redirect(state?.returnTo ?? "/integrations");
+ return res.redirect(state?.returnTo ?? "/apps/installed");
}
diff --git a/packages/app-store/office365calendar/api/index.ts b/packages/app-store/office365calendar/api/index.ts
new file mode 100644
index 0000000000..eb12c1b4ed
--- /dev/null
+++ b/packages/app-store/office365calendar/api/index.ts
@@ -0,0 +1,2 @@
+export { default as add } from "./add";
+export { default as callback } from "./callback";
diff --git a/packages/app-store/office365calendar/components/InstallAppButton.tsx b/packages/app-store/office365calendar/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..76b2bc355a
--- /dev/null
+++ b/packages/app-store/office365calendar/components/InstallAppButton.tsx
@@ -0,0 +1,18 @@
+import type { InstallAppButtonProps } from "@calcom/app-store/types";
+
+import useAddAppMutation from "../../_utils/useAddAppMutation";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const mutation = useAddAppMutation("office365_calendar");
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ mutation.mutate("");
+ },
+ loading: mutation.isLoading,
+ })}
+ >
+ );
+}
diff --git a/packages/app-store/office365calendar/components/index.ts b/packages/app-store/office365calendar/components/index.ts
new file mode 100644
index 0000000000..0d6008d4ca
--- /dev/null
+++ b/packages/app-store/office365calendar/components/index.ts
@@ -0,0 +1 @@
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/office365calendar/index.ts b/packages/app-store/office365calendar/index.ts
new file mode 100644
index 0000000000..b319c677eb
--- /dev/null
+++ b/packages/app-store/office365calendar/index.ts
@@ -0,0 +1,27 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Office 365 / Outlook.com Calendar",
+ description: _package.description,
+ installed: !!(process.env.MS_GRAPH_CLIENT_ID && process.env.MS_GRAPH_CLIENT_SECRET),
+ type: "office365_calendar",
+ title: "Office 365 / Outlook.com Calendar",
+ imageSrc: "/apps/outlook.svg",
+ variant: "calendar",
+ category: "calendar",
+ label: "Example App",
+ logo: "/apps/outlook.svg",
+ publisher: "Cal.com",
+ rating: 5,
+ reviews: 69,
+ slug: "office365-calendar",
+ trending: false,
+ url: "https://cal.com/",
+ verified: true,
+ email: "help@cal.com",
+} as App;
+
+export * as api from "./api";
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/calendar/services/Office365CalendarService.ts b/packages/app-store/office365calendar/lib/CalendarService.ts
similarity index 93%
rename from apps/web/lib/integrations/calendar/services/Office365CalendarService.ts
rename to packages/app-store/office365calendar/lib/CalendarService.ts
index c7eeb0b333..633869282a 100644
--- a/apps/web/lib/integrations/calendar/services/Office365CalendarService.ts
+++ b/packages/app-store/office365calendar/lib/CalendarService.ts
@@ -1,16 +1,21 @@
import { Calendar as OfficeCalendar } from "@microsoft/microsoft-graph-types-beta";
import { Credential } from "@prisma/client";
+import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser";
import { handleErrorsJson, handleErrorsRaw } from "@calcom/lib/errors";
+import logger from "@calcom/lib/logger";
+import prisma from "@calcom/prisma";
+import type { BufferedBusyTime } from "@calcom/types/BufferedBusyTime";
+import type {
+ Calendar,
+ CalendarEvent,
+ IntegrationCalendar,
+ BatchResponse,
+ EventBusyDate,
+ NewCalendarEventType,
+} from "@calcom/types/Calendar";
-import { getLocation, getRichDescription } from "@lib/CalEventParser";
-import { CALENDAR_INTEGRATIONS_TYPES } from "@lib/integrations/calendar/constants/generals";
-import logger from "@lib/logger";
-import prisma from "@lib/prisma";
-
-import { BatchResponse, EventBusyDate, NewCalendarEventType } from "../constants/types";
-import { Calendar, CalendarEvent, IntegrationCalendar } from "../interfaces/Calendar";
-import { BufferedBusyTime, O365AuthCredentials } from "../interfaces/Office365Calendar";
+import { O365AuthCredentials } from "../types/Office365Calendar";
const MS_GRAPH_CLIENT_ID = process.env.MS_GRAPH_CLIENT_ID || "";
const MS_GRAPH_CLIENT_SECRET = process.env.MS_GRAPH_CLIENT_SECRET || "";
@@ -22,7 +27,7 @@ export default class Office365CalendarService implements Calendar {
auth: { getToken: () => Promise };
constructor(credential: Credential) {
- this.integrationName = CALENDAR_INTEGRATIONS_TYPES.office365;
+ this.integrationName = "office365_calendar";
this.auth = this.o365Auth(credential);
this.log = logger.getChildLogger({ prefix: [`[[lib] ${this.integrationName}`] });
diff --git a/packages/app-store/office365calendar/lib/index.ts b/packages/app-store/office365calendar/lib/index.ts
new file mode 100644
index 0000000000..e168c149df
--- /dev/null
+++ b/packages/app-store/office365calendar/lib/index.ts
@@ -0,0 +1 @@
+export { default as CalendarService } from "./CalendarService";
diff --git a/packages/app-store/office365calendar/package.json b/packages/app-store/office365calendar/package.json
new file mode 100644
index 0000000000..64658754e7
--- /dev/null
+++ b/packages/app-store/office365calendar/package.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/office365calendar",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Microsoft 365 calendars for business users, and Outlook is a popular calendar platform for personal users.",
+ "dependencies": {
+ "@calcom/lib": "*",
+ "@calcom/prisma": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/office365calendar/static/icon.svg b/packages/app-store/office365calendar/static/icon.svg
new file mode 100644
index 0000000000..d8f2d80f09
--- /dev/null
+++ b/packages/app-store/office365calendar/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/apps/web/lib/integrations/calendar/interfaces/Office365Calendar.ts b/packages/app-store/office365calendar/types/Office365Calendar.ts
similarity index 61%
rename from apps/web/lib/integrations/calendar/interfaces/Office365Calendar.ts
rename to packages/app-store/office365calendar/types/Office365Calendar.ts
index 599d2b9a67..d78f6a1ca0 100644
--- a/apps/web/lib/integrations/calendar/interfaces/Office365Calendar.ts
+++ b/packages/app-store/office365calendar/types/Office365Calendar.ts
@@ -1,8 +1,3 @@
-export type BufferedBusyTime = {
- start: string;
- end: string;
-};
-
export type O365AuthCredentials = {
expiry_date: number;
access_token: string;
diff --git a/packages/app-store/office365video/.env.example b/packages/app-store/office365video/.env.example
new file mode 100644
index 0000000000..27daf48fe4
--- /dev/null
+++ b/packages/app-store/office365video/.env.example
@@ -0,0 +1,4 @@
+# Place these on `apps/web/.env`
+# @see https://github.com/calcom/cal.com/#Obtaining-Microsoft-Graph-Client-ID-and-Secret
+MS_GRAPH_CLIENT_CLIENT_ID=
+MS_GRAPH_CLIENT_CLIENT_SECRET=
diff --git a/packages/app-store/office365video/api/add.ts b/packages/app-store/office365video/api/add.ts
new file mode 100644
index 0000000000..142e3bb2cf
--- /dev/null
+++ b/packages/app-store/office365video/api/add.ts
@@ -0,0 +1,25 @@
+import type { NextApiRequest, NextApiResponse } from "next";
+import { stringify } from "querystring";
+
+import { BASE_URL } from "@calcom/lib/constants";
+
+import { encodeOAuthState } from "../../_utils/encodeOAuthState";
+
+const scopes = ["OnlineMeetings.ReadWrite"];
+
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ if (req.method === "GET") {
+ const state = encodeOAuthState(req);
+
+ const params = {
+ response_type: "code",
+ scope: scopes.join(" "),
+ client_id: process.env.MS_GRAPH_CLIENT_ID,
+ redirect_uri: BASE_URL + "/api/integrations/office365video/callback",
+ state,
+ };
+ const query = stringify(params);
+ const url = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?${query}`;
+ res.status(200).json({ url });
+ }
+}
diff --git a/packages/app-store/office365video/api/callback.ts b/packages/app-store/office365video/api/callback.ts
new file mode 100644
index 0000000000..2ef3f1a127
--- /dev/null
+++ b/packages/app-store/office365video/api/callback.ts
@@ -0,0 +1,67 @@
+import type { NextApiRequest, NextApiResponse } from "next";
+
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
+
+import { decodeOAuthState } from "../../_utils/decodeOAuthState";
+
+const scopes = ["OnlineMeetings.ReadWrite"];
+
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ const { code } = req.query;
+ console.log("🚀 ~ file: callback.ts ~ line 14 ~ handler ~ code", req.query);
+
+ if (typeof code !== "string") {
+ res.status(400).json({ message: "No code returned" });
+ return;
+ }
+
+ const toUrlEncoded = (payload: Record) =>
+ Object.keys(payload)
+ .map((key) => key + "=" + encodeURIComponent(payload[key]))
+ .join("&");
+
+ const body = toUrlEncoded({
+ client_id: process.env.MS_GRAPH_CLIENT_ID!,
+ grant_type: "authorization_code",
+ code,
+ scope: scopes.join(" "),
+ redirect_uri: BASE_URL + "/api/integrations/office365video/callback",
+ client_secret: process.env.MS_GRAPH_CLIENT_SECRET!,
+ });
+
+ const response = await fetch("https://login.microsoftonline.com/common/oauth2/v2.0/token", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
+ },
+ body,
+ });
+
+ const responseBody = await response.json();
+
+ if (!response.ok) {
+ return res.redirect("/apps/installed?error=" + JSON.stringify(responseBody));
+ }
+
+ const whoami = await fetch("https://graph.microsoft.com/v1.0/me", {
+ headers: { Authorization: "Bearer " + responseBody.access_token },
+ });
+ const graphUser = await whoami.json();
+
+ // In some cases, graphUser.mail is null. Then graphUser.userPrincipalName most likely contains the email address.
+ responseBody.email = graphUser.mail ?? graphUser.userPrincipalName;
+ responseBody.expiry_date = Math.round(+new Date() / 1000 + responseBody.expires_in); // set expiry date in seconds
+ delete responseBody.expires_in;
+
+ await prisma.credential.create({
+ data: {
+ type: "office365_video",
+ key: responseBody,
+ userId: req.session?.user.id,
+ },
+ });
+
+ const state = decodeOAuthState(req);
+ return res.redirect(state?.returnTo ?? "/apps/installed");
+}
diff --git a/packages/app-store/office365video/api/index.ts b/packages/app-store/office365video/api/index.ts
new file mode 100644
index 0000000000..eb12c1b4ed
--- /dev/null
+++ b/packages/app-store/office365video/api/index.ts
@@ -0,0 +1,2 @@
+export { default as add } from "./add";
+export { default as callback } from "./callback";
diff --git a/packages/app-store/office365video/index.ts b/packages/app-store/office365video/index.ts
new file mode 100644
index 0000000000..a17f96a80e
--- /dev/null
+++ b/packages/app-store/office365video/index.ts
@@ -0,0 +1,28 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Microsoft 365/Teams",
+ description: _package.description,
+ installed: !!(process.env.MS_GRAPH_CLIENT_ID && process.env.MS_GRAPH_CLIENT_SECRET),
+ type: "office365_video",
+ imageSrc: "/apps/msteams.svg",
+ variant: "conferencing",
+ logo: "/apps/msteams.svg",
+ publisher: "Cal.com",
+ url: "https://www.microsoft.com/en-ca/microsoft-teams/group-chat-software",
+ verified: true,
+ rating: 4.3, // TODO: placeholder for now, pull this from TrustPilot or G2
+ reviews: 69, // TODO: placeholder for now, pull this from TrustPilot or G2
+ category: "video",
+ label: "MS Teams",
+ slug: "msteams",
+ title: "MS Teams",
+ trending: true,
+ email: "help@cal.com",
+ locationType: "integrations:office365_video",
+} as App;
+
+export * as api from "./api";
+export * as lib from "./lib";
diff --git a/packages/app-store/office365video/lib/VideoApiAdapter.ts b/packages/app-store/office365video/lib/VideoApiAdapter.ts
new file mode 100644
index 0000000000..37d2b6f92c
--- /dev/null
+++ b/packages/app-store/office365video/lib/VideoApiAdapter.ts
@@ -0,0 +1,142 @@
+import { Credential } from "@prisma/client";
+
+import { handleErrorsJson, handleErrorsRaw } from "@calcom/lib/errors";
+import prisma from "@calcom/prisma";
+import type { CalendarEvent } from "@calcom/types/Calendar";
+import type { PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
+
+const MS_GRAPH_CLIENT_ID = process.env.MS_GRAPH_CLIENT_ID || "";
+const MS_GRAPH_CLIENT_SECRET = process.env.MS_GRAPH_CLIENT_SECRET || "";
+
+/** @link https://docs.microsoft.com/en-us/graph/api/application-post-onlinemeetings?view=graph-rest-1.0&tabs=http#response */
+export interface TeamsEventResult {
+ creationDateTime: string;
+ startDateTime: string;
+ endDateTime: string;
+ id: string;
+ joinWebUrl: string;
+ subject: string;
+}
+
+interface O365AuthCredentials {
+ email: string;
+ scope: string;
+ token_type: string;
+ expiry_date: number;
+ access_token: string;
+ refresh_token: string;
+ ext_expires_in: number;
+}
+
+// Checks to see if our O365 user token is valid or if we need to refresh
+const o365Auth = (credential: Credential) => {
+ const isExpired = (expiryDate: number) => expiryDate < Math.round(+new Date() / 1000);
+
+ const o365AuthCredentials = credential.key as unknown as O365AuthCredentials;
+
+ const refreshAccessToken = (refreshToken: string) => {
+ return fetch("https://login.microsoftonline.com/common/oauth2/v2.0/token", {
+ method: "POST",
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
+ body: new URLSearchParams({
+ scope: "User.Read Calendars.Read Calendars.ReadWrite",
+ client_id: MS_GRAPH_CLIENT_ID,
+ refresh_token: refreshToken,
+ grant_type: "refresh_token",
+ client_secret: MS_GRAPH_CLIENT_SECRET,
+ }),
+ })
+ .then(handleErrorsJson)
+ .then(async (responseBody) => {
+ // set expiry date as offset from current time.
+ responseBody.expiry_date = Math.round(Date.now() + responseBody.expires_in * 1000);
+ delete responseBody.expires_in;
+ // Store new tokens in database.
+ await prisma.credential.update({
+ where: {
+ id: credential.id,
+ },
+ data: {
+ key: responseBody,
+ },
+ });
+ o365AuthCredentials.expiry_date = responseBody.expiry_date;
+ o365AuthCredentials.access_token = responseBody.access_token;
+ return o365AuthCredentials.access_token;
+ });
+ };
+
+ return {
+ getToken: () =>
+ !isExpired(o365AuthCredentials.expiry_date)
+ ? Promise.resolve(o365AuthCredentials.access_token)
+ : refreshAccessToken(o365AuthCredentials.refresh_token),
+ };
+};
+
+const TeamsVideoApiAdapter = (credential: Credential): VideoApiAdapter => {
+ const auth = o365Auth(credential);
+
+ const translateEvent = (event: CalendarEvent) => {
+ return {
+ startDateTime: event.startTime,
+ endDateTime: event.endTime,
+ subject: event.title,
+ };
+ };
+
+ // Since the meeting link is not tied to an event we only need the create and update functions
+ return {
+ getAvailability: () => {
+ return Promise.resolve([]);
+ },
+ updateMeeting: async (bookingRef: PartialReference, event: CalendarEvent) => {
+ const accessToken = await auth.getToken();
+
+ const resultString = await fetch("https://graph.microsoft.com/v1.0/me/onlineMeetings", {
+ method: "POST",
+ headers: {
+ Authorization: "Bearer " + accessToken,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(translateEvent(event)),
+ }).then(handleErrorsRaw);
+
+ const resultObject = JSON.parse(resultString);
+
+ return Promise.resolve({
+ type: "office365_video",
+ id: resultObject.id,
+ password: "",
+ url: resultObject.joinUrl,
+ });
+ },
+ deleteMeeting: () => {
+ return Promise.resolve([]);
+ },
+ createMeeting: async (event: CalendarEvent): Promise => {
+ const accessToken = await auth.getToken();
+
+ const resultString = await fetch("https://graph.microsoft.com/v1.0/me/onlineMeetings", {
+ method: "POST",
+ headers: {
+ Authorization: "Bearer " + accessToken,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(translateEvent(event)),
+ }).then(handleErrorsRaw);
+
+ const resultObject = JSON.parse(resultString);
+
+ return Promise.resolve({
+ type: "office365_video",
+ id: resultObject.id,
+ password: "",
+ url: resultObject.joinUrl,
+ });
+ },
+ };
+};
+
+export default TeamsVideoApiAdapter;
diff --git a/packages/app-store/office365video/lib/index.ts b/packages/app-store/office365video/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/office365video/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/office365video/package.json b/packages/app-store/office365video/package.json
new file mode 100644
index 0000000000..73a1952ccb
--- /dev/null
+++ b/packages/app-store/office365video/package.json
@@ -0,0 +1,14 @@
+{
+ "private": true,
+ "name": "@calcom/office365video",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Use your Office 365 account to book video calls through MS Teams NOTE: MUST HAVE A WORK / SCHOOL ACCOUNT",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/package.json b/packages/app-store/package.json
new file mode 100644
index 0000000000..54efb0b3db
--- /dev/null
+++ b/packages/app-store/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "@calcom/app-store",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "files": [
+ "components.ts"
+ ],
+ "dependencies": {
+ "@calcom/lib": "*",
+ "@calcom/zoomvideo": "*",
+ "@calcom/dailyvideo": "*",
+ "@calcom/office365video": "*",
+ "lodash": "^4.17.21"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/stripepayment/LICENSE b/packages/app-store/stripepayment/LICENSE
new file mode 100644
index 0000000000..60f0a2a1d0
--- /dev/null
+++ b/packages/app-store/stripepayment/LICENSE
@@ -0,0 +1,42 @@
+The Cal.com Enterprise Edition (EE) license (the “EE License”)
+Copyright (c) 2020-present Cal.com, Inc
+
+With regard to the Cal.com Software:
+
+This software and associated documentation files (the "Software") may only be
+used in production, if you (and any entity that you represent) have agreed to,
+and are in compliance with, the Cal.com Subscription Terms available
+at https://cal.com/terms (the “EE Terms”), or other agreements governing
+the use of the Software, as mutually agreed by you and Cal.com, Inc ("Cal.com"),
+and otherwise have a valid Cal.com Enterprise Edition subscription ("EE Subscription")
+for the correct number of hosts as defined in the EE Terms ("Hosts"). Subject to the foregoing sentence,
+you are free to modify this Software and publish patches to the Software. You agree
+that Cal.com and/or its licensors (as applicable) retain all right, title and interest in
+and to all such modifications and/or patches, and all such modifications and/or
+patches may only be used, copied, modified, displayed, distributed, or otherwise
+exploited with a valid EE Subscription for the correct number of hosts.
+Notwithstanding the foregoing, you may copy and modify the Software for development
+and testing purposes, without requiring a subscription. You agree that Cal.com and/or
+its licensors (as applicable) retain all right, title and interest in and to all such
+modifications. You are not granted any other rights beyond what is expressly stated herein.
+Subject to the foregoing, it is forbidden to copy, merge, publish, distribute, sublicense,
+and/or sell the Software.
+
+This EE License applies only to the part of this Software that is not distributed under
+the AGPLv3 license. Any part of this Software distributed under the MIT license or which
+is served client-side as an image, font, cascading stylesheet (CSS), file which produces
+or is compiled, arranged, augmented, or combined into client-side JavaScript, in whole or
+in part, is copyrighted under the AGPLv3 license. The full text of this EE License shall
+be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+For all third party components incorporated into the Cal.com Software, those
+components are licensed under the original license provided by the owner of the
+applicable component.
diff --git a/packages/app-store/stripepayment/README.md b/packages/app-store/stripepayment/README.md
new file mode 100644
index 0000000000..708ddddc70
--- /dev/null
+++ b/packages/app-store/stripepayment/README.md
@@ -0,0 +1,27 @@
+
+
+
+# Enterprise Edition
+
+Welcome to the Enterprise Edition ("/ee") of Cal.com.
+
+The [/ee](https://github.com/calcom/cal.com/tree/main/apps/web/ee) subfolder is the place for all the **Pro** features from our [hosted](https://cal.com/pricing) plan and [enterprise-grade](https://cal.com/enterprise) features such as SSO, SAML, ADFS, OIDC, SCIM, SIEM, HRIS and much more.
+
+> _❗ WARNING: This package is copyrighted (unlike our [main repo](https://github.com/calcom/cal.com)). You are not allowed to use this code to host your own version of app.cal.com without obtaining a proper [license](https://cal.com/enterprise) first❗_
+
+## Setting up Stripe
+
+1. Create a stripe account or use an existing one. For testing, you should use all stripe dashboard functions with the Test-Mode toggle in the top right activated.
+2. Open [Stripe ApiKeys](https://dashboard.stripe.com/apikeys) save the token starting with `pk_...` to `NEXT_PUBLIC_STRIPE_PUBLIC_KEY` and `sk_...` to `STRIPE_PRIVATE_KEY` in the .env file.
+3. Open [Stripe Connect Settings](https://dashboard.stripe.com/settings/connect) and activate OAuth for Standard Accounts
+4. Add `/api/integrations/stripepayment/callback` as redirect URL.
+5. Copy your client*id (`ca*...`) to `STRIPE_CLIENT_ID` in the .env file.
+6. Open [Stripe Webhooks](https://dashboard.stripe.com/webhooks) and add `/api/integrations/stripepayment/webhook` as webhook for connected applications.
+7. Select all `payment_intent` events for the webhook.
+8. Copy the webhook secret (`whsec_...`) to `STRIPE_WEBHOOK_SECRET` in the .env file.
diff --git a/apps/web/ee/pages/api/integrations/stripepayment/add.ts b/packages/app-store/stripepayment/api/add.ts
similarity index 75%
rename from apps/web/ee/pages/api/integrations/stripepayment/add.ts
rename to packages/app-store/stripepayment/api/add.ts
index 690c5856b4..afe4ad5469 100644
--- a/apps/web/ee/pages/api/integrations/stripepayment/add.ts
+++ b/packages/app-store/stripepayment/api/add.ts
@@ -1,26 +1,17 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { stringify } from "querystring";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
-import prisma from "@lib/prisma";
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
const client_id = process.env.STRIPE_CLIENT_ID;
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "GET") {
- // Check that user is authenticated
- const session = await getSession({ req: req });
-
- if (!session) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
// Get user
const user = await prisma.user.findUnique({
where: {
- id: session.user?.id,
+ id: req.session?.user?.id,
},
select: {
email: true,
diff --git a/apps/web/ee/pages/api/integrations/stripepayment/callback.ts b/packages/app-store/stripepayment/api/callback.ts
similarity index 70%
rename from apps/web/ee/pages/api/integrations/stripepayment/callback.ts
rename to packages/app-store/stripepayment/api/callback.ts
index a1cbffff54..8a85a7a14b 100644
--- a/apps/web/ee/pages/api/integrations/stripepayment/callback.ts
+++ b/packages/app-store/stripepayment/api/callback.ts
@@ -2,24 +2,15 @@ import { Prisma } from "@prisma/client";
import type { NextApiRequest, NextApiResponse } from "next";
import { stringify } from "querystring";
+import prisma from "@calcom/prisma";
import stripe, { StripeData } from "@calcom/stripe/server";
-import { getSession } from "@lib/auth";
-import prisma from "@lib/prisma";
-
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { code, error, error_description } = req.query;
- // Check that user is authenticated
- const session = await getSession({ req: req });
-
- if (!session?.user) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
if (error) {
const query = stringify({ error, error_description });
- res.redirect("/integrations?" + query);
+ res.redirect("/apps/installed?" + query);
return;
}
@@ -38,9 +29,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
data: {
type: "stripe_payment",
key: data as unknown as Prisma.InputJsonObject,
- userId: session.user.id,
+ userId: req.session?.user.id,
},
});
- res.redirect("/integrations");
+ res.redirect("/apps/installed");
}
diff --git a/packages/app-store/stripepayment/api/index.ts b/packages/app-store/stripepayment/api/index.ts
new file mode 100644
index 0000000000..11890c921c
--- /dev/null
+++ b/packages/app-store/stripepayment/api/index.ts
@@ -0,0 +1,5 @@
+export { default as add } from "./add";
+export { default as callback } from "./callback";
+export { default as portal } from "./portal";
+// TODO: Figure out how to handle webhook endpoints from App Store
+// export { default as webhook } from "./webhook";
diff --git a/apps/web/ee/pages/api/integrations/stripepayment/portal.ts b/packages/app-store/stripepayment/api/portal.ts
similarity index 66%
rename from apps/web/ee/pages/api/integrations/stripepayment/portal.ts
rename to packages/app-store/stripepayment/api/portal.ts
index acb4a828e2..4e6e49d3f8 100644
--- a/apps/web/ee/pages/api/integrations/stripepayment/portal.ts
+++ b/packages/app-store/stripepayment/api/portal.ts
@@ -3,19 +3,9 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { getStripeCustomerIdFromUserId } from "@calcom/stripe/customer";
import stripe from "@calcom/stripe/server";
-import { getSession } from "@lib/auth";
-
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "POST") {
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
- const customerId = await getStripeCustomerIdFromUserId(session.user.id);
+ const customerId = await getStripeCustomerIdFromUserId(req.session!.user.id);
if (!customerId) {
res.status(500).json({ message: "Missing customer id" });
diff --git a/packages/app-store/stripepayment/components/InstallAppButton.tsx b/packages/app-store/stripepayment/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..4e665f8ee6
--- /dev/null
+++ b/packages/app-store/stripepayment/components/InstallAppButton.tsx
@@ -0,0 +1,18 @@
+import type { InstallAppButtonProps } from "@calcom/app-store/types";
+
+import useAddAppMutation from "../../_utils/useAddAppMutation";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const mutation = useAddAppMutation("stripe_payment");
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ mutation.mutate("");
+ },
+ loading: mutation.isLoading,
+ })}
+ >
+ );
+}
diff --git a/packages/app-store/stripepayment/components/index.ts b/packages/app-store/stripepayment/components/index.ts
new file mode 100644
index 0000000000..0d6008d4ca
--- /dev/null
+++ b/packages/app-store/stripepayment/components/index.ts
@@ -0,0 +1 @@
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/stripepayment/index.ts b/packages/app-store/stripepayment/index.ts
new file mode 100644
index 0000000000..dc117cb16b
--- /dev/null
+++ b/packages/app-store/stripepayment/index.ts
@@ -0,0 +1,31 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Stripe",
+ description: _package.description,
+ installed: !!(
+ process.env.STRIPE_CLIENT_ID &&
+ process.env.NEXT_PUBLIC_STRIPE_PUBLIC_KEY &&
+ process.env.STRIPE_PRIVATE_KEY
+ ),
+ slug: "stripe",
+ category: "payment",
+ logo: "/apps/stripe.svg",
+ rating: 4.6,
+ trending: true,
+ reviews: 69,
+ imageSrc: "/apps/stripe.svg",
+ label: "Stripe",
+ publisher: "Cal.com",
+ title: "Stripe",
+ type: "stripe_payment",
+ url: "https://cal.com/",
+ docsUrl: "https://stripe.com/docs",
+ variant: "payment",
+ verified: true,
+ email: "help@cal.com",
+} as App;
+
+export * as api from "./api";
diff --git a/packages/app-store/stripepayment/package.json b/packages/app-store/stripepayment/package.json
new file mode 100644
index 0000000000..7702dea46d
--- /dev/null
+++ b/packages/app-store/stripepayment/package.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "license": "AGPLv3 (see LICENSE file)",
+ "name": "@calcom/stripepayment",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Stripe is the world's leading payment provider. Start charging for your bookings today.",
+ "dependencies": {
+ "@calcom/prisma": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/stripepayment/static/icon.svg b/packages/app-store/stripepayment/static/icon.svg
new file mode 100644
index 0000000000..d8f2d80f09
--- /dev/null
+++ b/packages/app-store/stripepayment/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/apps/web/pages/api/integrations/tandemvideo/add.ts b/packages/app-store/tandemvideo/api/add.ts
similarity index 67%
rename from apps/web/pages/api/integrations/tandemvideo/add.ts
rename to packages/app-store/tandemvideo/api/add.ts
index 0519f563f3..9db609515b 100644
--- a/apps/web/pages/api/integrations/tandemvideo/add.ts
+++ b/packages/app-store/tandemvideo/api/add.ts
@@ -1,28 +1,19 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { stringify } from "querystring";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
-import prisma from "@lib/prisma";
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
const client_id = process.env.TANDEM_CLIENT_ID;
const TANDEM_BASE_URL = process.env.TANDEM_BASE_URL;
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "GET") {
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
// Get user
await prisma.user.findFirst({
rejectOnNotFound: true,
where: {
- id: session?.user?.id,
+ id: req.session?.user?.id,
},
select: {
id: true,
diff --git a/apps/web/pages/api/integrations/tandemvideo/callback.ts b/packages/app-store/tandemvideo/api/callback.ts
similarity index 77%
rename from apps/web/pages/api/integrations/tandemvideo/callback.ts
rename to packages/app-store/tandemvideo/api/callback.ts
index 0a130a5218..9df4dabe54 100644
--- a/apps/web/pages/api/integrations/tandemvideo/callback.ts
+++ b/packages/app-store/tandemvideo/api/callback.ts
@@ -1,7 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import prisma from "@lib/prisma";
+import prisma from "@calcom/prisma";
const client_id = process.env.TANDEM_CLIENT_ID as string;
const client_secret = process.env.TANDEM_CLIENT_SECRET as string;
@@ -15,14 +14,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const code = req.query.code as string;
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
const result = await fetch(`${TANDEM_BASE_URL}/api/v1/oauth/v2/token`, {
method: "POST",
headers: {
@@ -39,7 +30,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
await prisma.user.update({
where: {
- id: session.user.id,
+ id: req.session?.user.id,
},
data: {
credentials: {
@@ -52,5 +43,5 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
});
}
- res.redirect("/integrations");
+ res.redirect("/apps/installed");
}
diff --git a/packages/app-store/tandemvideo/api/index.ts b/packages/app-store/tandemvideo/api/index.ts
new file mode 100644
index 0000000000..eb12c1b4ed
--- /dev/null
+++ b/packages/app-store/tandemvideo/api/index.ts
@@ -0,0 +1,2 @@
+export { default as add } from "./add";
+export { default as callback } from "./callback";
diff --git a/packages/app-store/tandemvideo/components/InstallAppButton.tsx b/packages/app-store/tandemvideo/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..3a1492866c
--- /dev/null
+++ b/packages/app-store/tandemvideo/components/InstallAppButton.tsx
@@ -0,0 +1,18 @@
+import type { InstallAppButtonProps } from "@calcom/app-store/types";
+
+import useAddAppMutation from "../../_utils/useAddAppMutation";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const mutation = useAddAppMutation("tandem_video");
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ mutation.mutate("");
+ },
+ loading: mutation.isLoading,
+ })}
+ >
+ );
+}
diff --git a/packages/app-store/tandemvideo/components/index.ts b/packages/app-store/tandemvideo/components/index.ts
new file mode 100644
index 0000000000..0d6008d4ca
--- /dev/null
+++ b/packages/app-store/tandemvideo/components/index.ts
@@ -0,0 +1 @@
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/tandemvideo/index.ts b/packages/app-store/tandemvideo/index.ts
new file mode 100644
index 0000000000..c79cbd89b3
--- /dev/null
+++ b/packages/app-store/tandemvideo/index.ts
@@ -0,0 +1,29 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Tandem Video",
+ description: _package.description,
+ installed: !!(process.env.TANDEM_CLIENT_ID && process.env.TANDEM_CLIENT_SECRET),
+ type: "tandem_video",
+ title: "Tandem Video",
+ imageSrc: "/apps/tandem.svg",
+ variant: "conferencing",
+ label: "",
+ slug: "tandem",
+ category: "video",
+ logo: "/apps/tandem.svg",
+ publisher: "",
+ url: "",
+ verified: true,
+ trending: true,
+ rating: 0,
+ reviews: 0,
+ isGlobal: false,
+ email: "help@cal.com",
+ locationType: "integrations:tandem",
+} as App;
+
+export * as api from "./api";
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/Tandem/TandemVideoApiAdapter.ts b/packages/app-store/tandemvideo/lib/VideoApiAdapter.ts
similarity index 94%
rename from apps/web/lib/integrations/Tandem/TandemVideoApiAdapter.ts
rename to packages/app-store/tandemvideo/lib/VideoApiAdapter.ts
index cfd38a42b4..47e6f7d821 100644
--- a/apps/web/lib/integrations/Tandem/TandemVideoApiAdapter.ts
+++ b/packages/app-store/tandemvideo/lib/VideoApiAdapter.ts
@@ -1,12 +1,10 @@
import { Credential } from "@prisma/client";
import { handleErrorsJson, handleErrorsRaw } from "@calcom/lib/errors";
-
-import { PartialReference } from "@lib/events/EventManager";
-import prisma from "@lib/prisma";
-import { VideoApiAdapter, VideoCallData } from "@lib/videoClient";
-
-import { CalendarEvent } from "../calendar/interfaces/Calendar";
+import prisma from "@calcom/prisma";
+import type { CalendarEvent } from "@calcom/types/Calendar";
+import type { PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
interface TandemToken {
expires_in?: number;
diff --git a/packages/app-store/tandemvideo/lib/index.ts b/packages/app-store/tandemvideo/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/tandemvideo/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/tandemvideo/package.json b/packages/app-store/tandemvideo/package.json
new file mode 100644
index 0000000000..76105f457d
--- /dev/null
+++ b/packages/app-store/tandemvideo/package.json
@@ -0,0 +1,14 @@
+{
+ "private": true,
+ "name": "@calcom/tandemvideo",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Virtual Office | Video Conferencing",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/tandemvideo/static/icon.svg b/packages/app-store/tandemvideo/static/icon.svg
new file mode 100644
index 0000000000..4a05f8a0ae
--- /dev/null
+++ b/packages/app-store/tandemvideo/static/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/packages/app-store/tsconfig.json b/packages/app-store/tsconfig.json
new file mode 100644
index 0000000000..9597b6d8a5
--- /dev/null
+++ b/packages/app-store/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@calcom/tsconfig/react-library.json",
+ "include": [".", "@calcom/types"],
+ "exclude": ["dist", "build", "node_modules"],
+ "compilerOptions": {
+ "resolveJsonModule": true
+ }
+}
diff --git a/packages/app-store/types.d.ts b/packages/app-store/types.d.ts
new file mode 100644
index 0000000000..8abc2d705a
--- /dev/null
+++ b/packages/app-store/types.d.ts
@@ -0,0 +1,8 @@
+export type IntegrationOAuthCallbackState = {
+ returnTo: string;
+};
+
+export interface InstallAppButtonProps {
+ render: (renderProps: ButtonBaseProps) => JSX.Element;
+ onChanged?: () => unknown;
+}
diff --git a/packages/app-store/utils.ts b/packages/app-store/utils.ts
new file mode 100644
index 0000000000..460676b76f
--- /dev/null
+++ b/packages/app-store/utils.ts
@@ -0,0 +1,122 @@
+import { Prisma } from "@prisma/client";
+
+import { LocationType } from "@calcom/lib/location";
+import type { App } from "@calcom/types/App";
+
+import appStore from ".";
+
+const ALL_APPS_MAP = Object.keys(appStore).reduce((store, key) => {
+ store[key] = appStore[key as keyof typeof appStore].metadata;
+ return store;
+}, {} as Record);
+
+const credentialData = Prisma.validator()({
+ select: { id: true, type: true, key: true, userId: true },
+});
+
+type CredentialData = Prisma.CredentialGetPayload;
+
+export const ALL_APPS = Object.values(ALL_APPS_MAP);
+
+type OptionTypeBase = {
+ label: string;
+ value: LocationType;
+ disabled?: boolean;
+};
+
+export function getLocationOptions(integrations: AppMeta) {
+ const defaultLocations: OptionTypeBase[] = [
+ { value: LocationType.InPerson, label: "in_person_meeting" },
+ { value: LocationType.Phone, label: "phone_call" },
+ ];
+
+ integrations.forEach((app) => {
+ if (app.locationOption) {
+ defaultLocations.push(app.locationOption);
+ }
+ });
+
+ return defaultLocations;
+}
+
+/**
+ * This should get all avaialable apps to the user based on his saved
+ * credentials, this should also get globally available apps.
+ */
+function getApps(userCredentials: CredentialData[]) {
+ const apps = ALL_APPS.map((appMeta) => {
+ const credentials = userCredentials.filter((credential) => credential.type === appMeta.type);
+ let locationOption: OptionTypeBase | null = null;
+
+ /** If the app is a globally installed one, let's inject it's key */
+ if (appMeta.isGlobal) {
+ credentials.push({
+ id: +new Date().getTime(),
+ type: appMeta.type,
+ key: appMeta.key!,
+ userId: +new Date().getTime(),
+ });
+ }
+
+ /** Check if app has location option AND add it if user has credentials for it */
+ if (credentials.length > 0 && appMeta?.locationType) {
+ locationOption = {
+ value: appMeta.locationType as LocationType,
+ label: appMeta.label,
+ disabled: false,
+ };
+ }
+
+ const credential: typeof credentials[number] | null = credentials[0] || null;
+ return {
+ ...appMeta,
+ /**
+ * @deprecated use `credentials`
+ */
+ credential,
+ credentials,
+ /** Option to display in `location` field while editing event types */
+ locationOption,
+ };
+ });
+
+ return apps;
+}
+
+export type AppMeta = ReturnType;
+
+/** @deprecated use `getApps` */
+export function hasIntegration(apps: AppMeta, type: string): boolean {
+ return !!apps.find((app) => app.type === type && !!app.installed && app.credentials.length > 0);
+}
+
+export function hasIntegrationInstalled(type: App["type"]): boolean {
+ return ALL_APPS.some((app) => app.type === type && !!app.installed);
+}
+
+export function getLocationTypes(): string[] {
+ return ALL_APPS.reduce((locations, app) => {
+ if (typeof app.locationType === "string") {
+ locations.push(app.locationType);
+ }
+ return locations;
+ }, [] as string[]);
+}
+
+export function getAppName(name: string) {
+ return ALL_APPS_MAP[name as keyof typeof ALL_APPS_MAP].name;
+}
+
+export function getAppType(name: string): string {
+ const type = ALL_APPS_MAP[name as keyof typeof ALL_APPS_MAP].type;
+
+ if (type.endsWith("_calendar")) {
+ return "Calendar";
+ }
+ if (type.endsWith("_payment")) {
+ return "Payment";
+ }
+ return "Unknown";
+}
+
+export default getApps;
diff --git a/packages/app-store/zoomvideo/.env.example b/packages/app-store/zoomvideo/.env.example
new file mode 100644
index 0000000000..758107eb8f
--- /dev/null
+++ b/packages/app-store/zoomvideo/.env.example
@@ -0,0 +1,4 @@
+# Place these on `apps/web/.env`
+# @see https://github.com/calcom/cal.com/#obtaining-zoom-client-id-and-secret
+ZOOM_CLIENT_ID=
+ZOOM_CLIENT_SECRET=
diff --git a/apps/web/pages/api/integrations/zoomvideo/add.ts b/packages/app-store/zoomvideo/api/add.ts
similarity index 65%
rename from apps/web/pages/api/integrations/zoomvideo/add.ts
rename to packages/app-store/zoomvideo/api/add.ts
index 013069c25b..e04fd73e09 100644
--- a/apps/web/pages/api/integrations/zoomvideo/add.ts
+++ b/packages/app-store/zoomvideo/api/add.ts
@@ -1,27 +1,18 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { stringify } from "querystring";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
-import prisma from "@lib/prisma";
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
const client_id = process.env.ZOOM_CLIENT_ID;
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "GET") {
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
// Get user
await prisma.user.findFirst({
rejectOnNotFound: true,
where: {
- id: session?.user?.id,
+ id: req.session?.user?.id,
},
select: {
id: true,
diff --git a/apps/web/pages/api/integrations/zoomvideo/callback.ts b/packages/app-store/zoomvideo/api/callback.ts
similarity index 72%
rename from apps/web/pages/api/integrations/zoomvideo/callback.ts
rename to packages/app-store/zoomvideo/api/callback.ts
index 2d6e74790d..4bcce8fcbe 100644
--- a/apps/web/pages/api/integrations/zoomvideo/callback.ts
+++ b/packages/app-store/zoomvideo/api/callback.ts
@@ -1,9 +1,7 @@
import type { NextApiRequest, NextApiResponse } from "next";
-import { getSession } from "@lib/auth";
-import { BASE_URL } from "@lib/config/constants";
-
-import prisma from "../../../../lib/prisma";
+import { BASE_URL } from "@calcom/lib/constants";
+import prisma from "@calcom/prisma";
const client_id = process.env.ZOOM_CLIENT_ID;
const client_secret = process.env.ZOOM_CLIENT_SECRET;
@@ -11,14 +9,6 @@ const client_secret = process.env.ZOOM_CLIENT_SECRET;
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { code } = req.query;
- // Check that user is authenticated
- const session = await getSession({ req });
-
- if (!session?.user?.id) {
- res.status(401).json({ message: "You must be logged in to do this" });
- return;
- }
-
const redirectUri = encodeURI(BASE_URL + "/api/integrations/zoomvideo/callback");
const authHeader = "Basic " + Buffer.from(client_id + ":" + client_secret).toString("base64");
const result = await fetch(
@@ -38,7 +28,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
await prisma.user.update({
where: {
- id: session.user.id,
+ id: req.session?.user.id,
},
data: {
credentials: {
@@ -50,5 +40,5 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
},
});
- res.redirect("/integrations");
+ res.redirect("/apps/installed");
}
diff --git a/packages/app-store/zoomvideo/api/index.ts b/packages/app-store/zoomvideo/api/index.ts
new file mode 100644
index 0000000000..eb12c1b4ed
--- /dev/null
+++ b/packages/app-store/zoomvideo/api/index.ts
@@ -0,0 +1,2 @@
+export { default as add } from "./add";
+export { default as callback } from "./callback";
diff --git a/packages/app-store/zoomvideo/components/InstallAppButton.tsx b/packages/app-store/zoomvideo/components/InstallAppButton.tsx
new file mode 100644
index 0000000000..12d090fbe0
--- /dev/null
+++ b/packages/app-store/zoomvideo/components/InstallAppButton.tsx
@@ -0,0 +1,18 @@
+import type { InstallAppButtonProps } from "@calcom/app-store/types";
+
+import useAddAppMutation from "../../_utils/useAddAppMutation";
+
+export default function InstallAppButton(props: InstallAppButtonProps) {
+ const mutation = useAddAppMutation("zoom_video");
+
+ return (
+ <>
+ {props.render({
+ onClick() {
+ mutation.mutate("");
+ },
+ loading: mutation.isLoading,
+ })}
+ >
+ );
+}
diff --git a/packages/app-store/zoomvideo/components/index.ts b/packages/app-store/zoomvideo/components/index.ts
new file mode 100644
index 0000000000..0d6008d4ca
--- /dev/null
+++ b/packages/app-store/zoomvideo/components/index.ts
@@ -0,0 +1 @@
+export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/zoomvideo/index.ts b/packages/app-store/zoomvideo/index.ts
new file mode 100644
index 0000000000..0c2f57ffad
--- /dev/null
+++ b/packages/app-store/zoomvideo/index.ts
@@ -0,0 +1,28 @@
+import type { App } from "@calcom/types/App";
+
+import _package from "./package.json";
+
+export const metadata = {
+ name: "Zoom Video",
+ description: _package.description,
+ installed: !!(process.env.ZOOM_CLIENT_ID && process.env.ZOOM_CLIENT_SECRET),
+ type: "zoom_video",
+ imageSrc: "/apps/zoom.svg",
+ variant: "conferencing",
+ logo: "/apps/zoom.svg",
+ publisher: "Cal.com",
+ url: "https://zoom.us/",
+ verified: true,
+ rating: 4.3, // TODO: placeholder for now, pull this from TrustPilot or G2
+ reviews: 69, // TODO: placeholder for now, pull this from TrustPilot or G2
+ category: "video",
+ label: "Zoom Video",
+ slug: "zoom",
+ title: "Zoom Video",
+ trending: true,
+ email: "help@cal.com",
+ locationType: "integrations:zoom",
+} as App;
+
+export * as api from "./api";
+export * as lib from "./lib";
diff --git a/apps/web/lib/integrations/Zoom/ZoomVideoApiAdapter.ts b/packages/app-store/zoomvideo/lib/VideoApiAdapter.ts
similarity index 96%
rename from apps/web/lib/integrations/Zoom/ZoomVideoApiAdapter.ts
rename to packages/app-store/zoomvideo/lib/VideoApiAdapter.ts
index 33f9961d95..66caf0f0e2 100644
--- a/apps/web/lib/integrations/Zoom/ZoomVideoApiAdapter.ts
+++ b/packages/app-store/zoomvideo/lib/VideoApiAdapter.ts
@@ -1,12 +1,10 @@
import { Credential } from "@prisma/client";
import { handleErrorsJson, handleErrorsRaw } from "@calcom/lib/errors";
-
-import { PartialReference } from "@lib/events/EventManager";
-import prisma from "@lib/prisma";
-import { VideoApiAdapter, VideoCallData } from "@lib/videoClient";
-
-import { CalendarEvent } from "../calendar/interfaces/Calendar";
+import prisma from "@calcom/prisma";
+import type { CalendarEvent } from "@calcom/types/Calendar";
+import type { PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoCallData } from "@calcom/types/VideoApiAdapter";
/** @link https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meetingcreate */
export interface ZoomEventResult {
diff --git a/packages/app-store/zoomvideo/lib/index.ts b/packages/app-store/zoomvideo/lib/index.ts
new file mode 100644
index 0000000000..dc61768d60
--- /dev/null
+++ b/packages/app-store/zoomvideo/lib/index.ts
@@ -0,0 +1 @@
+export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/zoomvideo/package.json b/packages/app-store/zoomvideo/package.json
new file mode 100644
index 0000000000..b8c1fd95ec
--- /dev/null
+++ b/packages/app-store/zoomvideo/package.json
@@ -0,0 +1,14 @@
+{
+ "private": true,
+ "name": "@calcom/zoomvideo",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "description": "Zoom is the most popular video conferencing platform, joinable on the web or via desktop/mobile apps.",
+ "dependencies": {
+ "@calcom/prisma": "*",
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/zoomvideo/static/icon.svg b/packages/app-store/zoomvideo/static/icon.svg
new file mode 100644
index 0000000000..25e08b18e7
--- /dev/null
+++ b/packages/app-store/zoomvideo/static/icon.svg
@@ -0,0 +1,38 @@
+€
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/config/eslint-preset.js b/packages/config/eslint-preset.js
index 9aff745514..9c362a62f2 100644
--- a/packages/config/eslint-preset.js
+++ b/packages/config/eslint-preset.js
@@ -1,3 +1,4 @@
+/** @type {import("eslint").Linter.Config} */
module.exports = {
extends: ["plugin:playwright/playwright-test", "next", "plugin:prettier/recommended"],
settings: {
diff --git a/apps/web/lib/integrations/calendar/CalendarManager.ts b/packages/core/CalendarManager.ts
similarity index 65%
rename from apps/web/lib/integrations/calendar/CalendarManager.ts
rename to packages/core/CalendarManager.ts
index 1c1a0fb8a3..961a4dfdb4 100644
--- a/apps/web/lib/integrations/calendar/CalendarManager.ts
+++ b/packages/core/CalendarManager.ts
@@ -1,56 +1,31 @@
import { Credential, SelectedCalendar } from "@prisma/client";
import _ from "lodash";
+import { getCalendar } from "@calcom/app-store/_utils/getCalendar";
+import getApps from "@calcom/app-store/utils";
+import { getUid } from "@calcom/lib/CalEventParser";
import { getErrorFromUnknown } from "@calcom/lib/errors";
-
-import { getUid } from "@lib/CalEventParser";
-import { EventResult } from "@lib/events/EventManager";
-import logger from "@lib/logger";
-import notEmpty from "@lib/notEmpty";
-
-import { ALL_INTEGRATIONS } from "../getIntegrations";
-import { CALENDAR_INTEGRATIONS_TYPES } from "./constants/generals";
-import { CalendarServiceType, EventBusyDate } from "./constants/types";
-import { Calendar, CalendarEvent } from "./interfaces/Calendar";
-import AppleCalendarService from "./services/AppleCalendarService";
-import CalDavCalendarService from "./services/CalDavCalendarService";
-import GoogleCalendarService from "./services/GoogleCalendarService";
-import Office365CalendarService from "./services/Office365CalendarService";
-
-const CALENDARS: Record = {
- [CALENDAR_INTEGRATIONS_TYPES.apple]: AppleCalendarService,
- [CALENDAR_INTEGRATIONS_TYPES.caldav]: CalDavCalendarService,
- [CALENDAR_INTEGRATIONS_TYPES.google]: GoogleCalendarService,
- [CALENDAR_INTEGRATIONS_TYPES.office365]: Office365CalendarService,
-};
+import logger from "@calcom/lib/logger";
+import notEmpty from "@calcom/lib/notEmpty";
+import type { CalendarEvent, EventBusyDate } from "@calcom/types/Calendar";
+import type { EventResult } from "@calcom/types/EventManager";
const log = logger.getChildLogger({ prefix: ["CalendarManager"] });
-export const getCalendar = (credential: Credential): Calendar | null => {
- const { type: calendarType } = credential;
+/** TODO: Remove once all references are updated to app-store */
+export { getCalendar };
- const calendar = CALENDARS[calendarType];
- if (!calendar) {
- log.warn(`calendar of type ${calendarType} does not implemented`);
- return null;
- }
-
- return new calendar(credential);
-};
-
-export const getCalendarCredentials = (credentials: Array>, userId: number) => {
- const calendarCredentials = credentials
- .filter((credential) => credential.type.endsWith("_calendar"))
- .flatMap((credential) => {
- const integration = ALL_INTEGRATIONS.find((integration) => integration.type === credential.type);
-
- const calendar = getCalendar({
- ...credential,
- userId,
+export const getCalendarCredentials = (credentials: Array, userId: number) => {
+ const calendarCredentials = getApps(credentials)
+ .filter((app) => app.type.endsWith("_calendar"))
+ .flatMap((app) => {
+ const credentials = app.credentials.flatMap((credential) => {
+ const calendar = getCalendar(credential);
+ return app && calendar && app.variant === "calendar"
+ ? [{ integration: app, credential, calendar }]
+ : [];
});
- return integration && calendar && integration.variant === "calendar"
- ? [{ integration, credential, calendar }]
- : [];
+ return credentials.length ? credentials : [];
});
return calendarCredentials;
diff --git a/apps/web/lib/events/EventManager.ts b/packages/core/EventManager.ts
similarity index 83%
rename from apps/web/lib/events/EventManager.ts
rename to packages/core/EventManager.ts
index 0f27e35d9f..7c5b003ff6 100644
--- a/apps/web/lib/events/EventManager.ts
+++ b/packages/core/EventManager.ts
@@ -3,45 +3,23 @@ import async from "async";
import merge from "lodash/merge";
import { v5 as uuidv5 } from "uuid";
-import { FAKE_DAILY_CREDENTIAL } from "@lib/integrations/Daily/DailyVideoApiAdapter";
-import { FAKE_HUDDLE_CREDENTIAL } from "@lib/integrations/Huddle01/Huddle01VideoApiAdapter";
-import { FAKE_JITSI_CREDENTIAL } from "@lib/integrations/Jitsi/JitsiVideoApiAdapter";
-import { createEvent, updateEvent } from "@lib/integrations/calendar/CalendarManager";
-import { AdditionInformation, CalendarEvent } from "@lib/integrations/calendar/interfaces/Calendar";
-import { LocationType } from "@lib/location";
-import prisma from "@lib/prisma";
-import { createMeeting, updateMeeting, VideoCallData } from "@lib/videoClient";
+import getApps from "@calcom/app-store/utils";
+import { LocationType } from "@calcom/lib/location";
+import prisma from "@calcom/prisma";
+import type { AdditionInformation, CalendarEvent } from "@calcom/types/Calendar";
+import type {
+ CreateUpdateResult,
+ EventResult,
+ PartialBooking,
+ PartialReference,
+} from "@calcom/types/EventManager";
+import type { VideoCallData } from "@calcom/types/VideoApiAdapter";
+
+import { createEvent, updateEvent } from "./CalendarManager";
+import { createMeeting, updateMeeting } from "./videoClient";
export type Event = AdditionInformation & VideoCallData;
-export interface EventResult {
- type: string;
- success: boolean;
- uid: string;
- createdEvent?: Event;
- updatedEvent?: Event | Event[];
- originalEvent: CalendarEvent;
-}
-
-export interface CreateUpdateResult {
- results: Array;
- referencesToCreate: Array;
-}
-
-export interface PartialBooking {
- id: number;
- references: Array;
-}
-
-export interface PartialReference {
- id?: number;
- type: string;
- uid: string;
- meetingId?: string | null;
- meetingPassword?: string | null;
- meetingUrl?: string | null;
-}
-
export const isZoom = (location: string): boolean => {
return location === "integrations:zoom";
};
@@ -58,24 +36,35 @@ export const isTandem = (location: string): boolean => {
return location === "integrations:tandem";
};
+export const isTeams = (location: string): boolean => {
+ return location === "integrations:office365_video";
+};
+
export const isJitsi = (location: string): boolean => {
return location === "integrations:jitsi";
};
export const isDedicatedIntegration = (location: string): boolean => {
return (
- isZoom(location) || isDaily(location) || isHuddle01(location) || isTandem(location) || isJitsi(location)
+ isZoom(location) ||
+ isDaily(location) ||
+ isHuddle01(location) ||
+ isTandem(location) ||
+ isJitsi(location) ||
+ isTeams(location)
);
};
export const getLocationRequestFromIntegration = (location: string) => {
if (
+ /** TODO: Handle this dynamically */
location === LocationType.GoogleMeet.valueOf() ||
location === LocationType.Zoom.valueOf() ||
location === LocationType.Daily.valueOf() ||
location === LocationType.Jitsi.valueOf() ||
location === LocationType.Huddle01.valueOf() ||
- location === LocationType.Tandem.valueOf()
+ location === LocationType.Tandem.valueOf() ||
+ location === LocationType.Teams.valueOf()
) {
const requestId = uuidv5(location, uuidv5.URL);
@@ -109,6 +98,7 @@ type EventManagerUser = {
credentials: Credential[];
destinationCalendar: DestinationCalendar | null;
};
+
export default class EventManager {
calendarCredentials: Credential[];
videoCredentials: Credential[];
@@ -116,19 +106,12 @@ export default class EventManager {
/**
* Takes an array of credentials and initializes a new instance of the EventManager.
*
- * @param credentials
+ * @param user
*/
constructor(user: EventManagerUser) {
- this.calendarCredentials = user.credentials.filter((cred) => cred.type.endsWith("_calendar"));
- this.videoCredentials = user.credentials.filter((cred) => cred.type.endsWith("_video"));
-
- //for Daily.co video, temporarily pushes a credential for the daily-video-client
- const hasDailyIntegration = process.env.DAILY_API_KEY;
- if (hasDailyIntegration) {
- this.videoCredentials.push(FAKE_DAILY_CREDENTIAL);
- }
- this.videoCredentials.push(FAKE_HUDDLE_CREDENTIAL);
- this.videoCredentials.push(FAKE_JITSI_CREDENTIAL);
+ const appCredentials = getApps(user.credentials).flatMap((app) => app.credentials);
+ this.calendarCredentials = appCredentials.filter((cred) => cred.type.endsWith("_calendar"));
+ this.videoCredentials = appCredentials.filter((cred) => cred.type.endsWith("_video"));
}
/**
diff --git a/packages/core/index.ts b/packages/core/index.ts
new file mode 100644
index 0000000000..b2e810437b
--- /dev/null
+++ b/packages/core/index.ts
@@ -0,0 +1,3 @@
+export * from "./CalendarManager";
+export * from "./EventManager";
+export * from "./videoClient";
diff --git a/packages/core/package.json b/packages/core/package.json
new file mode 100644
index 0000000000..e081b8d59d
--- /dev/null
+++ b/packages/core/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@calcom/core",
+ "description": "Cal.com core functionality",
+ "version": "0.0.0",
+ "private": true,
+ "license": "MIT",
+ "main": "./index.ts",
+ "scripts": {
+ "clean": "rm -rf .turbo && rm -rf node_modules"
+ },
+ "dependencies": {
+ "@calcom/app-store": "*",
+ "@calcom/lib": "*",
+ "dayjs": "^1.10.4",
+ "ical.js": "^1.4.0",
+ "ics": "^2.31.0",
+ "uuid": "^8.3.2"
+ },
+ "devDependencies": {
+ "@calcom/tsconfig": "*",
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json
new file mode 100644
index 0000000000..184d5dec70
--- /dev/null
+++ b/packages/core/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@calcom/tsconfig/base.json",
+ "compilerOptions": {
+ "baseUrl": "."
+ },
+ "include": ["."],
+ "exclude": ["dist", "build", "node_modules"]
+}
diff --git a/apps/web/lib/videoClient.ts b/packages/core/videoClient.ts
similarity index 61%
rename from apps/web/lib/videoClient.ts
rename to packages/core/videoClient.ts
index 577eca4ad9..dcc4de29fa 100644
--- a/apps/web/lib/videoClient.ts
+++ b/packages/core/videoClient.ts
@@ -2,62 +2,27 @@ import { Credential } from "@prisma/client";
import short from "short-uuid";
import { v5 as uuidv5 } from "uuid";
-import { getUid } from "@lib/CalEventParser";
-import { EventResult } from "@lib/events/EventManager";
-import { PartialReference } from "@lib/events/EventManager";
-import Huddle01VideoApiAdapter from "@lib/integrations/Huddle01/Huddle01VideoApiAdapter";
-import JitsiVideoApiAdapter from "@lib/integrations/Jitsi/JitsiVideoApiAdapter";
-import logger from "@lib/logger";
-
-import DailyVideoApiAdapter from "./integrations/Daily/DailyVideoApiAdapter";
-import TandemVideoApiAdapter from "./integrations/Tandem/TandemVideoApiAdapter";
-import ZoomVideoApiAdapter from "./integrations/Zoom/ZoomVideoApiAdapter";
-import { CalendarEvent } from "./integrations/calendar/interfaces/Calendar";
+import appStore from "@calcom/app-store";
+import { getUid } from "@calcom/lib/CalEventParser";
+import logger from "@calcom/lib/logger";
+import type { CalendarEvent } from "@calcom/types/Calendar";
+import type { EventResult, PartialReference } from "@calcom/types/EventManager";
+import type { VideoApiAdapter, VideoApiAdapterFactory } from "@calcom/types/VideoApiAdapter";
const log = logger.getChildLogger({ prefix: ["[lib] videoClient"] });
const translator = short();
-export interface VideoCallData {
- type: string;
- id: string;
- password: string;
- url: string;
-}
-
-type EventBusyDate = Record<"start" | "end", Date>;
-
-export interface VideoApiAdapter {
- createMeeting(event: CalendarEvent): Promise;
-
- updateMeeting(bookingRef: PartialReference, event: CalendarEvent): Promise;
-
- deleteMeeting(uid: string): Promise;
-
- getAvailability(dateFrom?: string, dateTo?: string): Promise;
-}
-
// factory
const getVideoAdapters = (withCredentials: Credential[]): VideoApiAdapter[] =>
withCredentials.reduce((acc, cred) => {
- switch (cred.type) {
- case "zoom_video":
- acc.push(ZoomVideoApiAdapter(cred));
- break;
- case "daily_video":
- acc.push(DailyVideoApiAdapter(cred));
- break;
- case "jitsi_video":
- acc.push(JitsiVideoApiAdapter());
- break;
- case "huddle01_video":
- acc.push(Huddle01VideoApiAdapter());
- break;
- case "tandem_video":
- acc.push(TandemVideoApiAdapter(cred));
- break;
- default:
- break;
+ const appName = cred.type.split("_").join(""); // Transform `zoom_video` to `zoomvideo`;
+ const app = appStore[appName as keyof typeof appStore];
+ if ("lib" in app && "VideoApiAdapter" in app.lib) {
+ const makeVideoApiAdapter = app.lib.VideoApiAdapter as VideoApiAdapterFactory;
+ const videoAdapter = makeVideoApiAdapter(cred);
+ acc.push(videoAdapter);
+ return acc;
}
return acc;
}, []);
diff --git a/apps/web/lib/CalEventParser.ts b/packages/lib/CalEventParser.ts
similarity index 91%
rename from apps/web/lib/CalEventParser.ts
rename to packages/lib/CalEventParser.ts
index b8bbb6812a..2cb39deb1e 100644
--- a/apps/web/lib/CalEventParser.ts
+++ b/packages/lib/CalEventParser.ts
@@ -2,10 +2,9 @@ import { Person } from "ics";
import short from "short-uuid";
import { v5 as uuidv5 } from "uuid";
-import { getIntegrationName } from "@lib/integrations";
+import type { CalendarEvent } from "@calcom/types/Calendar";
-import { BASE_URL } from "./config/constants";
-import { CalendarEvent } from "./integrations/calendar/interfaces/Calendar";
+import { BASE_URL } from "./constants";
const translator = short();
@@ -54,7 +53,7 @@ ${calEvent.description}
};
export const getLocation = (calEvent: CalendarEvent) => {
- let providerName = calEvent.location ? getIntegrationName(calEvent.location) : "";
+ let providerName = "";
if (calEvent.location && calEvent.location.includes("integrations:")) {
const location = calEvent.location.split(":")[1];
diff --git a/apps/web/lib/integrations/calendar/services/BaseCalendarService.ts b/packages/lib/CalendarService.ts
similarity index 90%
rename from apps/web/lib/integrations/calendar/services/BaseCalendarService.ts
rename to packages/lib/CalendarService.ts
index 862015b615..ff2675ae0c 100644
--- a/apps/web/lib/integrations/calendar/services/BaseCalendarService.ts
+++ b/packages/lib/CalendarService.ts
@@ -1,9 +1,10 @@
+///
import { Credential, Prisma } from "@prisma/client";
import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";
import ICAL from "ical.js";
-import { createEvent } from "ics";
+import { Attendee, createEvent, DateArray, DurationObject, Person } from "ics";
import {
createAccount,
createCalendarObject,
@@ -16,22 +17,42 @@ import {
} from "tsdav";
import { v4 as uuidv4 } from "uuid";
-import { getLocation, getRichDescription } from "@lib/CalEventParser";
-import { symmetricDecrypt } from "@lib/crypto";
-import type { Event } from "@lib/events/EventManager";
-import logger from "@lib/logger";
+import type {
+ Calendar,
+ CalendarEvent,
+ CalendarEventType,
+ EventBusyDate,
+ IntegrationCalendar,
+ NewCalendarEventType,
+} from "@calcom/types/Calendar";
+import type { Event } from "@calcom/types/Event";
-import { TIMEZONE_FORMAT } from "../constants/formats";
-import { CALDAV_CALENDAR_TYPE } from "../constants/generals";
-import { CalendarEventType, EventBusyDate, NewCalendarEventType } from "../constants/types";
-import { Calendar, CalendarEvent, IntegrationCalendar } from "../interfaces/Calendar";
-import { convertDate, getAttendees, getDuration } from "../utils/CalendarUtils";
+import { getLocation, getRichDescription } from "./CalEventParser";
+import { symmetricDecrypt } from "./crypto";
+import logger from "./logger";
+
+const TIMEZONE_FORMAT = "YYYY-MM-DDTHH:mm:ss[Z]";
+const DEFAULT_CALENDAR_TYPE = "caldav";
dayjs.extend(utc);
dayjs.extend(timezone);
const CALENDSO_ENCRYPTION_KEY = process.env.CALENDSO_ENCRYPTION_KEY || "";
+const convertDate = (date: string): DateArray =>
+ dayjs(date)
+ .utc()
+ .toArray()
+ .slice(0, 6)
+ .map((v, i) => (i === 1 ? v + 1 : v)) as DateArray;
+
+const getDuration = (start: string, end: string): DurationObject => ({
+ minutes: dayjs(end).diff(dayjs(start), "minute"),
+});
+
+const getAttendees = (attendees: Person[]): Attendee[] =>
+ attendees.map(({ email, name }) => ({ name, email, partstat: "NEEDS-ACTION" }));
+
export default abstract class BaseCalendarService implements Calendar {
private url = "";
private credentials: Record = {};
@@ -299,7 +320,7 @@ export default abstract class BaseCalendarService implements Calendar {
const event = new ICAL.Event(vevent);
const calendarTimezone =
- vcalendar.getFirstSubcomponent("vtimezone")?.getFirstPropertyValue("tzid") || "";
+ vcalendar.getFirstSubcomponent("vtimezone")?.getFirstPropertyValue("tzid") || "";
const startDate = calendarTimezone
? dayjs.tz(event.startDate.toString(), calendarTimezone)
@@ -360,7 +381,7 @@ export default abstract class BaseCalendarService implements Calendar {
return createAccount({
account: {
serverUrl: this.url,
- accountType: CALDAV_CALENDAR_TYPE,
+ accountType: DEFAULT_CALENDAR_TYPE,
credentials: this.credentials,
},
headers: this.headers,
diff --git a/apps/web/lib/crypto.ts b/packages/lib/crypto.ts
similarity index 100%
rename from apps/web/lib/crypto.ts
rename to packages/lib/crypto.ts
diff --git a/apps/web/lib/jsonUtils.ts b/packages/lib/jsonUtils.ts
similarity index 100%
rename from apps/web/lib/jsonUtils.ts
rename to packages/lib/jsonUtils.ts
diff --git a/packages/lib/location.ts b/packages/lib/location.ts
index 0c296031c1..39905ea75d 100644
--- a/packages/lib/location.ts
+++ b/packages/lib/location.ts
@@ -1,3 +1,4 @@
+/** TODO: These should all come from each individual App Store package, and merge them here. */
export enum LocationType {
InPerson = "inPerson",
Phone = "phone",
@@ -8,4 +9,5 @@ export enum LocationType {
Jitsi = "integrations:jitsi",
Huddle01 = "integrations:huddle01",
Tandem = "integrations:tandem",
+ Teams = "integrations:office365_video",
}
diff --git a/apps/web/lib/logger.ts b/packages/lib/logger.ts
similarity index 90%
rename from apps/web/lib/logger.ts
rename to packages/lib/logger.ts
index ff1114ec62..9cbcc05088 100644
--- a/apps/web/lib/logger.ts
+++ b/packages/lib/logger.ts
@@ -1,6 +1,6 @@
import { Logger } from "tslog";
-import { IS_PRODUCTION } from "@lib/config/constants";
+import { IS_PRODUCTION } from "./constants";
const logger = new Logger({
dateTimePattern: "hour:minute:second.millisecond timeZoneName",
diff --git a/apps/web/lib/notEmpty.ts b/packages/lib/notEmpty.ts
similarity index 100%
rename from apps/web/lib/notEmpty.ts
rename to packages/lib/notEmpty.ts
diff --git a/packages/lib/package.json b/packages/lib/package.json
index 4df17b6af8..b791038f82 100644
--- a/packages/lib/package.json
+++ b/packages/lib/package.json
@@ -6,8 +6,13 @@
"license": "MIT",
"dependencies": {
"bcryptjs": "^2.4.3",
- "dayjs": "^1.10.4",
"dayjs-business-time": "^1.0.4",
+ "dayjs": "^1.10.4",
+ "ical.js": "^1.4.0",
+ "ics": "^2.31.0",
+ "tsdav": "2.0.0",
+ "tslog": "^3.2.1",
+ "uuid": "^8.3.2",
"next-i18next": "^8.9.0",
"react-hot-toast": "^2.1.0"
},
diff --git a/packages/lib/random.ts b/packages/lib/random.ts
new file mode 100644
index 0000000000..b817524fa3
--- /dev/null
+++ b/packages/lib/random.ts
@@ -0,0 +1,9 @@
+export const randomString = function (length = 12) {
+ let result = "";
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ const charactersLength = characters.length;
+ for (let i = 0; i < length; i++) {
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
+ }
+ return result;
+};
diff --git a/packages/lib/server/i18n.ts b/packages/lib/server/i18n.ts
new file mode 100644
index 0000000000..19528ab7d0
--- /dev/null
+++ b/packages/lib/server/i18n.ts
@@ -0,0 +1,18 @@
+import i18next from "i18next";
+import { i18n as nexti18next } from "next-i18next";
+import { serverSideTranslations } from "next-i18next/serverSideTranslations";
+
+export const getTranslation = async (locale: string, ns: string) => {
+ const create = async () => {
+ const { _nextI18Next } = await serverSideTranslations(locale, [ns]);
+ const _i18n = i18next.createInstance();
+ _i18n.init({
+ lng: locale,
+ resources: _nextI18Next.initialI18nStore,
+ fallbackLng: _nextI18Next.userConfig?.i18n.defaultLocale,
+ });
+ return _i18n;
+ };
+ const _i18n = nexti18next != null ? nexti18next : await create();
+ return _i18n.getFixedT(locale, ns);
+};
diff --git a/packages/types/App.d.ts b/packages/types/App.d.ts
new file mode 100644
index 0000000000..0a8243af15
--- /dev/null
+++ b/packages/types/App.d.ts
@@ -0,0 +1,65 @@
+import { Prisma } from "@prisma/client";
+
+/**
+ * This is the definition for an app store's app metadata.
+ * This is used to display App info, categorize or hide certain apps in the app store.
+ */
+export interface App {
+ /**
+ * Wheter if the app is installed or not. Usually we check for api keys in env
+ * variables to determine if this is true or not.
+ * */
+ installed: boolean;
+ /** The app type */
+ type: `${string}_calendar` | `${string}_payment` | `${string}_video` | `${string}_web3` | `${string}_other`;
+ /** The display name for the app, TODO settle between this or name */
+ title: string;
+ /** The display name for the app */
+ name: string;
+ /** A brief description, usually found in the app's package.json */
+ description: string;
+ /** The icon to display in /apps/installed */
+ imageSrc: string;
+ /** TODO determine if we should use this instead of category */
+ variant: "calendar" | "payment" | "conferencing";
+ label: string;
+ /** The slug for the app store public page inside `/apps/[slug] */
+ slug: string;
+ /** The category to which this app belongs, currently we have `calendar`, `payment` or `video` */
+ category: string;
+ /** An abosolute url to the app logo */
+ logo: string;
+ /** Company or individual publishing this app */
+ publisher: string;
+ /** App's website */
+ url: string;
+ /** Optional documentation website URL */
+ docsUrl?: string;
+ /** Wether if the app is verified by Cal.com or not */
+ verified: boolean;
+ /** Wether the app should appear in the trending section of the app store */
+ trending: boolean;
+ /** Rating from 0 to 5, harcoded for now. Should be fetched later on. */
+ rating: number;
+ /** Number of reviews, harcoded for now. Should be fetched later on. */
+ reviews: number;
+ /**
+ * Wheter if the app is installed globally or needs user intervention.
+ * Used to show Connect/Disconnect buttons in App Store
+ * */
+ isGlobal?: boolean;
+ /** A contact email, mainly to ask for support */
+ email: string;
+ /** Add this value as a posible location option in event types */
+ locationType?: string;
+ /** Needed API Keys (usually for global apps) */
+ key?: Prisma.JsonValue;
+ /** Needed API Keys (usually for global apps) */
+ key?: Prisma.JsonValue;
+ /** If not free, what kind of fees does the app have */
+ feeType?: "monthly" | "usage-based" | "one-time" | "free";
+ /** 0 = free. if type="usage-based" it's the price per booking */
+ price?: number;
+ /** only required for "usage-based" billing. % of commission for paid bookings */
+ commission?: number;
+}
diff --git a/packages/types/BufferedBusyTime.d.ts b/packages/types/BufferedBusyTime.d.ts
new file mode 100644
index 0000000000..4d1e38def7
--- /dev/null
+++ b/packages/types/BufferedBusyTime.d.ts
@@ -0,0 +1,4 @@
+export interface BufferedBusyTime {
+ start: string;
+ end: string;
+}
diff --git a/apps/web/lib/integrations/calendar/interfaces/Calendar.ts b/packages/types/Calendar.d.ts
similarity index 51%
rename from apps/web/lib/integrations/calendar/interfaces/Calendar.ts
rename to packages/types/Calendar.d.ts
index d794fa1f1a..57cd9ea2ef 100644
--- a/apps/web/lib/integrations/calendar/interfaces/Calendar.ts
+++ b/packages/types/Calendar.d.ts
@@ -1,14 +1,11 @@
-import { DestinationCalendar, SelectedCalendar } from "@prisma/client";
-import { TFunction } from "next-i18next";
+import type { DestinationCalendar, SelectedCalendar } from "@prisma/client";
+import type { Dayjs } from "dayjs";
+import type { calendar_v3 } from "googleapis";
+import type { Time } from "ical.js";
+import type { TFunction } from "next-i18next";
-import { PaymentInfo } from "@ee/lib/stripe/server";
-
-import type { Event } from "@lib/events/EventManager";
-import { Ensure } from "@lib/types/utils";
-import { VideoCallData } from "@lib/videoClient";
-
-import { NewCalendarEventType } from "../constants/types";
-import { ConferenceData } from "./GoogleCalendar";
+import type { Event } from "./Event";
+import type { Ensure } from "./utils";
export type Person = {
name: string;
@@ -17,15 +14,54 @@ export type Person = {
language: { translate: TFunction; locale: string };
};
-export interface EntryPoint {
- entryPointType?: string;
- uri?: string;
- label?: string;
- pin?: string;
- accessCode?: string;
- meetingCode?: string;
- passcode?: string;
- password?: string;
+export type EventBusyDate = Record<"start" | "end", Date | string>;
+
+export type CalendarServiceType = typeof Calendar;
+
+export type NewCalendarEventType = {
+ uid: string;
+ id: string;
+ type: string;
+ password: string;
+ url: string;
+ additionalInfo: Record;
+};
+
+export type CalendarEventType = {
+ uid: string;
+ etag: string;
+ /** This is the actual caldav event url, not the location url. */
+ url: string;
+ summary: string;
+ description: string;
+ location: string;
+ sequence: number;
+ startDate: Date | Dayjs;
+ endDate: Date | Dayjs;
+ duration: {
+ weeks: number;
+ days: number;
+ hours: number;
+ minutes: number;
+ seconds: number;
+ isNegative: boolean;
+ };
+ organizer: string;
+ attendees: any[][];
+ recurrenceId: Time;
+ timezone: any;
+};
+
+export type BatchResponse = {
+ responses: SubResponse[];
+};
+
+export type SubResponse = {
+ body: { value: { start: { dateTime: string }; end: { dateTime: string } }[] };
+};
+
+export interface ConferenceData {
+ createRequest?: calendar_v3.Schema$CreateConferenceRequest;
}
export interface AdditionInformation {
@@ -57,13 +93,28 @@ export interface CalendarEvent {
rejectionReason?: string | null;
}
+export interface EntryPoint {
+ entryPointType?: string;
+ uri?: string;
+ label?: string;
+ pin?: string;
+ accessCode?: string;
+ meetingCode?: string;
+ passcode?: string;
+ password?: string;
+}
+
+export interface AdditionInformation {
+ conferenceData?: ConferenceData;
+ entryPoints?: EntryPoint[];
+ hangoutLink?: string;
+}
+
export interface IntegrationCalendar extends Ensure, "externalId"> {
primary?: boolean;
name?: string;
}
-type EventBusyDate = Record<"start" | "end", Date | string>;
-
export interface Calendar {
createEvent(event: CalendarEvent): Promise;
diff --git a/packages/types/Event.d.ts b/packages/types/Event.d.ts
new file mode 100644
index 0000000000..37db902913
--- /dev/null
+++ b/packages/types/Event.d.ts
@@ -0,0 +1,4 @@
+import type { PartialReference } from "./EventManager";
+import type { VideoCallData } from "./VideoApiAdapter";
+
+export type Event = AdditionInformation & VideoCallData;
diff --git a/packages/types/EventManager.d.ts b/packages/types/EventManager.d.ts
new file mode 100644
index 0000000000..27298b822d
--- /dev/null
+++ b/packages/types/EventManager.d.ts
@@ -0,0 +1,30 @@
+import type { CalendarEvent } from "./Calendar";
+import type { Event } from "./Event";
+
+export interface PartialReference {
+ id?: number;
+ type: string;
+ uid: string;
+ meetingId?: string | null;
+ meetingPassword?: string | null;
+ meetingUrl?: string | null;
+}
+
+export interface EventResult {
+ type: string;
+ success: boolean;
+ uid: string;
+ createdEvent?: Event;
+ updatedEvent?: Event | Event[];
+ originalEvent: CalendarEvent;
+}
+
+export interface CreateUpdateResult {
+ results: Array;
+ referencesToCreate: Array;
+}
+
+export interface PartialBooking {
+ id: number;
+ references: Array;
+}
diff --git a/packages/types/VideoApiAdapter.d.ts b/packages/types/VideoApiAdapter.d.ts
new file mode 100644
index 0000000000..df76145d3a
--- /dev/null
+++ b/packages/types/VideoApiAdapter.d.ts
@@ -0,0 +1,22 @@
+import type { Credential } from "@prisma/client";
+
+import type { EventBusyDate } from "./Calendar";
+
+export interface VideoCallData {
+ type: string;
+ id: string;
+ password: string;
+ url: string;
+}
+
+export interface VideoApiAdapter {
+ createMeeting(event: CalendarEvent): Promise;
+
+ updateMeeting(bookingRef: PartialReference, event: CalendarEvent): Promise;
+
+ deleteMeeting(uid: string): Promise;
+
+ getAvailability(dateFrom?: string, dateTo?: string): Promise;
+}
+
+export type VideoApiAdapterFactory = (credential: Credential) => VideoApiAdapter;
diff --git a/apps/web/@types/ical.d.ts b/packages/types/ical.d.ts
similarity index 93%
rename from apps/web/@types/ical.d.ts
rename to packages/types/ical.d.ts
index b699d05405..4a5cafd17a 100644
--- a/apps/web/@types/ical.d.ts
+++ b/packages/types/ical.d.ts
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: GPL-3.0-only
// https://github.com/mozilla-comm/ical.js/issues/367#issuecomment-568493517
declare module "ical.js" {
- function parse(input: string): any[];
+ function parse(input: string): unknown[];
export class helpers {
public updateTimezones(vcal: Component): Component;
@@ -13,14 +13,14 @@ declare module "ical.js" {
public name: string;
- constructor(jCal: any[] | string, parent?: Component);
+ constructor(jCal: unknown[] | string, parent?: Component);
- public toJSON(): any[];
+ public toJSON(): unknown[];
public getFirstSubcomponent(name?: string): Component | null;
public getAllSubcomponents(name?: string): Component[];
- public getFirstPropertyValue(name?: string): T;
+ public getFirstPropertyValue(name?: string): T;
public getFirstProperty(name?: string): Property;
public getAllProperties(name?: string): Property[];
@@ -55,7 +55,7 @@ declare module "ical.js" {
/**
* The duration. This can be the result directly from the property, or the
* duration calculated from start date and end date. Setting the property
- * will remove any `dtend` properties.
+ * will remove unknown `dtend` properties.
*
* @type {Duration}
* @memberof Event
@@ -86,15 +86,15 @@ declare module "ical.js" {
public name: string;
public type: string;
- constructor(jCal: any[] | string, parent?: Component);
+ constructor(jCal: unknown[] | string, parent?: Component);
- public getFirstValue(): T;
- public getValues(): T[];
+ public getFirstValue(): T;
+ public getValues(): T[];
public setParameter(name: string, value: string | string[]): void;
public setValue(value: string | Record): void;
public setValues(values: (string | Record)[]): void;
- public toJSON(): any;
+ public toJSON(): unknown;
}
interface TimeJsonData {
diff --git a/packages/types/next-auth.d.ts b/packages/types/next-auth.d.ts
new file mode 100644
index 0000000000..066f312922
--- /dev/null
+++ b/packages/types/next-auth.d.ts
@@ -0,0 +1,15 @@
+import NextAuth, { DefaultSession } from "next-auth";
+
+declare module "next-auth" {
+ type DefaultSessionUser = NonNullable;
+ type CalendsoSessionUser = DefaultSessionUser & {
+ id: number;
+ username: string;
+ };
+ /**
+ * Returned by `useSession`, `getSession` and received as a prop on the `Provider` React Context
+ */
+ interface Session {
+ user: CalendsoSessionUser;
+ }
+}
diff --git a/packages/types/next.d.ts b/packages/types/next.d.ts
new file mode 100644
index 0000000000..aa0e02c1c2
--- /dev/null
+++ b/packages/types/next.d.ts
@@ -0,0 +1,10 @@
+import type { IncomingMessage } from "http";
+import type { Session } from "next-auth";
+
+import "./next-auth";
+
+export declare module "next" {
+ interface NextApiRequest extends IncomingMessage {
+ session?: Session | null;
+ }
+}
diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json
new file mode 100644
index 0000000000..f9701e8ae8
--- /dev/null
+++ b/packages/types/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "@calcom/tsconfig/base.json",
+ "include": ["."],
+ "exclude": ["dist", "build", "node_modules"]
+}
diff --git a/apps/web/lib/types/utils.ts b/packages/types/utils.d.ts
similarity index 100%
rename from apps/web/lib/types/utils.ts
rename to packages/types/utils.d.ts
diff --git a/yarn.lock b/yarn.lock
index 0462e24935..51596306ee 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1041,6 +1041,11 @@
intl-messageformat "9.11.4"
tslib "^2.1.0"
+"@glidejs/glide@^3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@glidejs/glide/-/glide-3.5.2.tgz#7012c5920ecf202bbda44d8526fc979984b6dd54"
+ integrity sha512-7jGciNJ2bQ4eZLSNlSZ+VAyW63kALf420CvkEpK4lEsUfWJq9odqimci0YCiyNyMUFB+pWHwLYyNc57dijYsCg==
+
"@headlessui/react@^1.4.1":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.5.0.tgz#483b44ba2c8b8d4391e1d2c863898d7dd0cc0296"
@@ -2871,6 +2876,11 @@
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee"
integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==
+"@types/glidejs__glide@^3.4.1":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@types/glidejs__glide/-/glidejs__glide-3.4.1.tgz#220bbce087500eda3700e476c728e17d096eb6f0"
+ integrity sha512-ib2VRchnLSXGOdiZFfCt6QEIYviw5g+Yey8Q2+kMzUxGXsnR9ZwZi1qPXI1ttrvR/AtUYZmSSHDVVSoIyt6LPw==
+
"@types/graceful-fs@^4.1.2":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
@@ -3185,9 +3195,9 @@
"@types/node" "*"
"@types/supertest@^2.0.11":
- version "2.0.11"
- resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.11.tgz#2e70f69f220bc77b4f660d72c2e1a4231f44a77d"
- integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc"
+ integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==
dependencies:
"@types/superagent" "*"