diff --git a/apps/web/components/App.tsx b/apps/web/components/App.tsx
new file mode 100644
index 00000000..fbf678d0
--- /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 00000000..16817268
--- /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 f2462dd9..7d829bdb 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 130ebbd8..4b67070f 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 00000000..083d63c5
--- /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 00000000..f4359835
--- /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 00000000..f89b72c9
--- /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 00000000..355a4d3d
--- /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 e6b6ab7b..ae160556 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 80f8eee9..dbb1f036 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 0ce01fe5..00000000
--- 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 a7609550..a66225dc 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 4f4e37e9..454a0e43 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 1f7e8f76..f45d97bd 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 206c8fff..2ac53e4c 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 5dac84e7..ec8e8212 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 f81a112e..6e0eb814 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 64f2808b..1302fdea 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 cc5c6064..fbd2fc78 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 b2f1800e..1dd7c7a6 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 195398f1..910b2bc3 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 cd50e058..46bf6364 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 447bc84e..67b8a144 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 da267249..5c9a7e5c 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 a6ac4ba9..fe53820f 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 00000000..9d06c750
--- /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 9556dc98..00000000
--- 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 0d5ca6fe..00000000
--- 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 079c86b2..00000000
--- 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 1a3cb2aa..00000000
--- 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 a76d26a5..00000000
--- 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 1ba55ca2..00000000
--- 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 f6bc2f72..00000000
--- 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 a5927e54..00000000
--- 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 62d2a520..00000000
--- 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 3833c05d..19a8eeab 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 b817524f..99820539 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 6ce6408b..f4ce15e8 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 e9dbc3c6..f201e76d 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 71f7cf9e..56430fc6 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 6a654176..2e64d0dd 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 b7edbec8..9b52f31c 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 e2ca2f08..33dd7787 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 c04a2953..91aca823 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 e5b6a01e..f785113d 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 4ae595ee..aa001df9 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 a8f4c64d..259dbd03 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 77c05317..3e39bde5 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 8f1363e9..b9b933d3 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 dbeb4f4e..c0977be3 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 e68c2f2a..f553ffa9 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 00000000..8edfec12
--- /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 1ad56d5e..00000000
--- 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 49122d76..00000000
--- 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 eca9d1d0..00000000
--- 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 bcdc5dde..00000000
--- 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 8353ac43..00000000
--- 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 00000000..70fb094e
--- /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 00000000..637cb3dd
--- /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 00000000..74cc08bb
--- /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 aeddc900..54ef5aa0 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 00000000..0260b43d
--- /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 90f10813..c8ae1972 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 56be27dd..0ef6f8c1 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 1d431eed..00000000
--- 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 cbed0460..b727607e 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 14a7e514..f2a2f52c 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 1d2089c5..cf3d2d6d 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 00000000..3409e6cf
--- /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 00000000..56a91662
--- /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 f18c92d4..00000000
--- 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 2ecc5fa3..41c24296 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 5acb5903..4c4ef8b4 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 5708fadb..cf420afe 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 53588175..a79b70b0 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 69346ee7..79ff7b9d 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 e54a7cc0..d9c37b32 160000
--- a/apps/website
+++ b/apps/website
@@ -1 +1 @@
-Subproject commit e54a7cc0ecbb36a5a6838f77d8c19ec008c8849a
+Subproject commit d9c37b322081604f5dee0ca471cb0f5d895af8bc
diff --git a/package.json b/package.json
index 9cb92f60..3007492a 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 00000000..813ba466
--- /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 00000000..f0988db1
--- /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 00000000..c10a1b92
--- /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 00000000..4316d0b4
--- /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 00000000..0d6008d4
--- /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 00000000..98a534ae
--- /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 00000000..86609db4
--- /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 00000000..dc61768d
--- /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 00000000..757b0296
--- /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 00000000..d8f2d80f
--- /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 00000000..9c593ad1
--- /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 00000000..ba4f67c3
--- /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 00000000..6c1c5d5c
--- /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 00000000..082a6d9b
--- /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 df767683..00f9d880 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 00000000..4c0d2ead
--- /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 264682d8..cf5a2d09 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 00000000..3abb5da0
--- /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 00000000..0cc9f478
--- /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 00000000..6ad61cd0
--- /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 00000000..278a4475
--- /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 00000000..e168c149
--- /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 00000000..1f2cc2e2
--- /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 5cc88645..bc1699e3 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 00000000..4c0d2ead
--- /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 3b98be36..d6a73b07 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 00000000..3abb5da0
--- /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 00000000..0cc9f478
--- /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 00000000..b98ca823
--- /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 00000000..42e1c23d
--- /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 00000000..e168c149
--- /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 00000000..e9c93e9b
--- /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 00000000..b93e51ad
--- /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 00000000..acddcdb6
--- /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 f3f57411..24eea62c 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 00000000..dc61768d
--- /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 00000000..3a56ad57
--- /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 00000000..d8f2d80f
--- /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 15fdf782..87c604bb 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 5499db83..d9bbaeb8 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 00000000..eb12c1b4
--- /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 00000000..f059a138
--- /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 00000000..0d6008d4
--- /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 00000000..e469b619
--- /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 552fce03..1e742aa3 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 00000000..e168c149
--- /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 00000000..2ed40961
--- /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 00000000..d8f2d80f
--- /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 00000000..85f6f925
--- /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 00000000..184a1ee8
--- /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 00000000..d8f2d80f
--- /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 00000000..49cad25e
--- /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 f8eb84d3..1850a34c 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 00000000..dc61768d
--- /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 00000000..5a3a7a14
--- /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 00000000..2952f22b
--- /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 00000000..7092277d
--- /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 f27b4af4..cc112625 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 00000000..dc61768d
--- /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 00000000..3f74eb6e
--- /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 00000000..25e08b18
--- /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 00000000..aa0e02c1
--- /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 7ab61569..f174407a 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 35814fba..940f74f0 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 00000000..eb12c1b4
--- /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 00000000..76b2bc35
--- /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 00000000..0d6008d4
--- /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 00000000..b319c677
--- /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 c7eeb0b3..63386928 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 00000000..e168c149
--- /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 00000000..64658754
--- /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 00000000..d8f2d80f
--- /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 599d2b9a..d78f6a1c 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 00000000..27daf48f
--- /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 00000000..142e3bb2
--- /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 00000000..2ef3f1a1
--- /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 00000000..eb12c1b4
--- /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 00000000..a17f96a8
--- /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 00000000..37d2b6f9
--- /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 00000000..dc61768d
--- /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 00000000..73a1952c
--- /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 00000000..54efb0b3
--- /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 00000000..60f0a2a1
--- /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 00000000..708ddddc
--- /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 690c5856..afe4ad54 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 a1cbffff..8a85a7a1 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 00000000..11890c92
--- /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 acb4a828..4e6e49d3 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 00000000..4e665f8e
--- /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 00000000..0d6008d4
--- /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 00000000..dc117cb1
--- /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 00000000..7702dea4
--- /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 00000000..d8f2d80f
--- /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 0519f563..9db60951 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 0a130a52..9df4dabe 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 00000000..eb12c1b4
--- /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 00000000..3a149286
--- /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 00000000..0d6008d4
--- /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 00000000..c79cbd89
--- /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 cfd38a42..47e6f7d8 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 00000000..dc61768d
--- /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 00000000..76105f45
--- /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 00000000..4a05f8a0
--- /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 00000000..9597b6d8
--- /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 00000000..8abc2d70
--- /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 00000000..460676b7
--- /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 00000000..758107eb
--- /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 013069c2..e04fd73e 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 2d6e7479..4bcce8fc 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 00000000..eb12c1b4
--- /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 00000000..12d090fb
--- /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 00000000..0d6008d4
--- /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 00000000..0c2f57ff
--- /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 33f9961d..66caf0f0 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 00000000..dc61768d
--- /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 00000000..b8c1fd95
--- /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 00000000..25e08b18
--- /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 9aff7455..9c362a62 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 1c1a0fb8..961a4dfd 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 0f27e35d..7c5b003f 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 00000000..b2e81043
--- /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 00000000..e081b8d5
--- /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 00000000..184d5dec
--- /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 577eca4a..dcc4de29 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 b8bbb681..2cb39deb 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 862015b6..ff2675ae 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 0c296031..39905ea7 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 ff1114ec..9cbcc050 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 4df17b6a..b791038f 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 00000000..b817524f
--- /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 00000000..19528ab7
--- /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 00000000..0a8243af
--- /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 00000000..4d1e38de
--- /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 d794fa1f..57cd9ea2 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 00000000..37db9029
--- /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 00000000..27298b82
--- /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 00000000..df76145d
--- /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 b699d054..4a5cafd1 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 00000000..066f3129
--- /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 00000000..aa0e02c1
--- /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 00000000..f9701e8a
--- /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 0462e249..51596306 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" "*"