diff --git a/apps/web/components/booking/SkeletonLoader.tsx b/apps/web/components/booking/SkeletonLoader.tsx
index 8bcbe26b85..3ed1e22537 100644
--- a/apps/web/components/booking/SkeletonLoader.tsx
+++ b/apps/web/components/booking/SkeletonLoader.tsx
@@ -4,7 +4,7 @@ import { SkeletonText } from "@calcom/ui";
function SkeletonLoader() {
return (
-
+
diff --git a/apps/web/components/booking/pages/BookingPage.tsx b/apps/web/components/booking/pages/BookingPage.tsx
index 888bffe512..8b5b5aa40f 100644
--- a/apps/web/components/booking/pages/BookingPage.tsx
+++ b/apps/web/components/booking/pages/BookingPage.tsx
@@ -492,7 +492,7 @@ const BookingPage = ({
@@ -954,7 +954,7 @@ const BookingPage = ({
setGuestToggle(!guestToggle)}
diff --git a/apps/web/components/dialog/EditLocationDialog.tsx b/apps/web/components/dialog/EditLocationDialog.tsx
index df7906127d..87e946c801 100644
--- a/apps/web/components/dialog/EditLocationDialog.tsx
+++ b/apps/web/components/dialog/EditLocationDialog.tsx
@@ -212,7 +212,7 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
return (
-
+
diff --git a/apps/web/components/eventtype/CustomInputTypeForm.tsx b/apps/web/components/eventtype/CustomInputTypeForm.tsx
index ec0c1f466b..44d7b699af 100644
--- a/apps/web/components/eventtype/CustomInputTypeForm.tsx
+++ b/apps/web/components/eventtype/CustomInputTypeForm.tsx
@@ -183,7 +183,7 @@ function RadioInputHandler({
{...register(`options.${index}.label` as const, { required: true })}
addOnSuffix={
{
diff --git a/apps/web/components/eventtype/EventAdvancedTab.tsx b/apps/web/components/eventtype/EventAdvancedTab.tsx
index b1c72d6153..15f27a6d61 100644
--- a/apps/web/components/eventtype/EventAdvancedTab.tsx
+++ b/apps/web/components/eventtype/EventAdvancedTab.tsx
@@ -129,7 +129,7 @@ export const EventAdvancedTab = ({ eventType, team }: Pick setShowEventNameTip((old) => !old)}
diff --git a/apps/web/components/eventtype/EventAppsTab.tsx b/apps/web/components/eventtype/EventAppsTab.tsx
index de5dc16b84..715a5f59da 100644
--- a/apps/web/components/eventtype/EventAppsTab.tsx
+++ b/apps/web/components/eventtype/EventAppsTab.tsx
@@ -1,43 +1,17 @@
import { EventTypeSetupProps, FormValues } from "pages/event-types/[type]";
import { useFormContext } from "react-hook-form";
-import EventTypeAppContext, { GetAppData, SetAppData } from "@calcom/app-store/EventTypeAppContext";
-import { EventTypeAddonMap } from "@calcom/app-store/apps.browser.generated";
+import { GetAppData, SetAppData } from "@calcom/app-store/EventTypeAppContext";
+import { EventTypeAppCard } from "@calcom/app-store/_components/EventTypeAppCardInterface";
import { EventTypeAppCardComponentProps } from "@calcom/app-store/types";
import { EventTypeAppsList } from "@calcom/app-store/utils";
import { useLocale } from "@calcom/lib/hooks/useLocale";
-import { RouterOutputs, trpc } from "@calcom/trpc/react";
-import { Button, EmptyScreen, ErrorBoundary, Icon } from "@calcom/ui";
+import { trpc } from "@calcom/trpc/react";
+import { Button, EmptyScreen, Icon } from "@calcom/ui";
-type EventType = Pick["eventType"] &
+export type EventType = Pick["eventType"] &
EventTypeAppCardComponentProps["eventType"];
-function AppCardWrapper({
- app,
- eventType,
- getAppData,
- setAppData,
-}: {
- app: RouterOutputs["viewer"]["apps"][number];
- eventType: EventType;
- getAppData: GetAppData;
- setAppData: SetAppData;
-}) {
- const dirName = app.slug === "stripe" ? "stripepayment" : app.slug;
- const Component = EventTypeAddonMap[dirName as keyof typeof EventTypeAddonMap];
-
- if (!Component) {
- throw new Error('No component found for "' + dirName + '"');
- }
- return (
-
-
-
-
-
- );
-}
-
export const EventAppsTab = ({ eventType }: { eventType: EventType }) => {
const { t } = useLocale();
const { data: eventTypeApps, isLoading } = trpc.viewer.apps.useQuery({
@@ -97,7 +71,7 @@ export const EventAppsTab = ({ eventType }: { eventType: EventType }) => {
/>
) : null}
{installedApps?.map((app) => (
- {
) : null}
{notInstalledApps?.map((app) => (
-
{
}}
/>
{
diff --git a/apps/web/components/eventtype/EventSetupTab.tsx b/apps/web/components/eventtype/EventSetupTab.tsx
index 2d5f588fa4..82a605fb15 100644
--- a/apps/web/components/eventtype/EventSetupTab.tsx
+++ b/apps/web/components/eventtype/EventSetupTab.tsx
@@ -162,7 +162,7 @@ export const EventSetupTab = (
return null;
}
return (
-
+
{
@@ -229,12 +229,12 @@ function EventTypeSingleLayout({
embedUrl={encodeURIComponent(embedLink)}
StartIcon={Icon.FiCode}
color="secondary"
- size="icon"
+ variant="icon"
tooltip={t("embed")}
/>
{children}
diff --git a/apps/web/components/eventtype/SkeletonLoader.tsx b/apps/web/components/eventtype/SkeletonLoader.tsx
index 8bebbd5405..a645f88827 100644
--- a/apps/web/components/eventtype/SkeletonLoader.tsx
+++ b/apps/web/components/eventtype/SkeletonLoader.tsx
@@ -10,7 +10,7 @@ function SkeletonLoader() {
-
+
diff --git a/apps/web/components/getting-started/steps-views/UserProfile.tsx b/apps/web/components/getting-started/steps-views/UserProfile.tsx
index 917678bbf6..455d04a245 100644
--- a/apps/web/components/getting-started/steps-views/UserProfile.tsx
+++ b/apps/web/components/getting-started/steps-views/UserProfile.tsx
@@ -113,7 +113,7 @@ const UserProfile = (props: IUserProfileProps) => {
name="avatar"
id="avatar"
placeholder="URL"
- className="mt-1 block w-full rounded-sm border border-gray-300 px-3 py-2 text-sm focus:border-neutral-800 focus:outline-none focus:ring-neutral-800"
+ className="mt-1 block w-full rounded-sm border border-gray-300 px-3 py-2 text-sm focus:border-gray-800 focus:outline-none focus:ring-gray-800"
defaultValue={imageSrc}
/>
@@ -146,7 +146,7 @@ const UserProfile = (props: IUserProfileProps) => {
ref={bioRef}
name="bio"
id="bio"
- className="mt-1 block h-[60px] w-full rounded-sm border border-gray-300 px-3 py-2 focus:border-neutral-500 focus:outline-none focus:ring-neutral-500 sm:text-sm"
+ className="mt-1 block h-[60px] w-full rounded-sm border border-gray-300 px-3 py-2 focus:border-gray-500 focus:outline-none focus:ring-gray-500 sm:text-sm"
defaultValue={user?.bio || undefined}
onChange={(event) => {
setValue("bio", event.target.value);
diff --git a/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx b/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx
index d177496146..fc038b416f 100644
--- a/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx
+++ b/apps/web/components/ui/UsernameAvailability/PremiumTextfield.tsx
@@ -190,7 +190,7 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
{process.env.NEXT_PUBLIC_WEBSITE_URL.replace("https://", "").replace("http://", "")}/
@@ -207,8 +207,8 @@ const PremiumTextfield = (props: ICustomUsernameProps) => {
className={classNames(
"border-l-1 mb-0 mt-0 rounded-md rounded-l-none font-sans text-sm leading-4 focus:!ring-0",
isInputUsernamePremium
- ? "border-1 focus:border-1 border-orange-400 focus:border-orange-400"
- : "border-1 focus:border-2",
+ ? "border border-orange-400 focus:border focus:border-orange-400"
+ : "border focus:border",
markAsError
? "focus:shadow-0 focus:ring-shadow-0 border-red-500 focus:border-red-500 focus:outline-none"
: "border-l-gray-300",
diff --git a/apps/web/components/ui/form/CheckedSelect.tsx b/apps/web/components/ui/form/CheckedSelect.tsx
index 3489bc50b1..640425e691 100644
--- a/apps/web/components/ui/form/CheckedSelect.tsx
+++ b/apps/web/components/ui/form/CheckedSelect.tsx
@@ -41,7 +41,7 @@ export const CheckedSelect = ({
{...props}
/>
{value.map((option) => (
-
+
& E
{eventTypes.map((type, index) => (
+ className="dark:bg-darkgray-100 group relative border-b border-gray-200 bg-white first:rounded-t-md last:rounded-b-md last:border-b-0 hover:bg-gray-50 dark:border-gray-700 dark:hover:border-gray-600">
& E
{user.away ? (
@@ -164,7 +163,7 @@ export default function User(props: inferSSRProps
& E
+ className="dark:bg-darkgray-100 group relative border-b border-gray-200 bg-white first:rounded-t-md last:rounded-b-md last:border-b-0 hover:bg-gray-50 dark:border-gray-700 dark:hover:border-gray-600">
{/* Don't prefetch till the time we drop the amount of javascript in [user][type] page which is impacting score for [user] page */}
+
diff --git a/apps/web/pages/[user]/book.tsx b/apps/web/pages/[user]/book.tsx
index 24c8f562ef..a7fba03f73 100644
--- a/apps/web/pages/[user]/book.tsx
+++ b/apps/web/pages/[user]/book.tsx
@@ -26,7 +26,7 @@ export type BookPageProps = inferSSRProps
;
export default function Book(props: BookPageProps) {
const { t } = useLocale();
return props.away ? (
-
+
@@ -41,7 +41,7 @@ export default function Book(props: BookPageProps) {
) : props.isDynamicGroupBooking && !props.profile.allowDynamicBooking ? (
-
+
diff --git a/apps/web/pages/apps/[slug]/index.tsx b/apps/web/pages/apps/[slug]/index.tsx
index a9506b6212..ab5d8b7bcd 100644
--- a/apps/web/pages/apps/[slug]/index.tsx
+++ b/apps/web/pages/apps/[slug]/index.tsx
@@ -35,6 +35,7 @@ function SingleAppPage({ data, source }: inferSSRProps
) {
licenseRequired={data.licenseRequired}
isProOnly={data.isProOnly}
images={source.data?.items as string[] | undefined}
+ isTemplate={data.isTemplate}
// tos="https://zoom.us/terms"
// privacy="https://zoom.us/privacy"
body={
@@ -70,21 +71,31 @@ export const getStaticProps = async (ctx: GetStaticPropsContext) => {
if (!singleApp) return { notFound: true };
- const appDirname = app.dirName;
+ const isTemplate = singleApp.isTemplate;
+ const appDirname = path.join(isTemplate ? "templates" : "", app.dirName);
const README_PATH = path.join(process.cwd(), "..", "..", `packages/app-store/${appDirname}/DESCRIPTION.md`);
const postFilePath = path.join(README_PATH);
let source = "";
try {
- /* If the app doesn't have a README we fallback to the package description */
source = fs.readFileSync(postFilePath).toString();
+ source = source.replace(/{DESCRIPTION}/g, singleApp.description);
} catch (error) {
+ /* If the app doesn't have a README we fallback to the package description */
console.log(`No DESCRIPTION.md provided for: ${appDirname}`);
source = singleApp.description;
}
const { content, data } = matter(source);
-
+ if (data.items) {
+ data.items = data.items.map((item: string) => {
+ if (!item.includes("/api/app-store")) {
+ // Make relative paths absolute
+ return `/api/app-store/${appDirname}/${item}`;
+ }
+ return item;
+ });
+ }
return {
props: {
source: { content, data },
diff --git a/apps/web/pages/apps/index.tsx b/apps/web/pages/apps/index.tsx
index 6dbb4003ab..ee41a02ded 100644
--- a/apps/web/pages/apps/index.tsx
+++ b/apps/web/pages/apps/index.tsx
@@ -15,7 +15,7 @@ import {
HorizontalTabs,
Icon,
TextField,
- TrendingAppsSlider,
+ PopularAppsSlider,
} from "@calcom/ui";
import AppsLayout from "@components/apps/layouts/AppsLayout";
@@ -76,7 +76,7 @@ export default function Apps({ categories, appStore }: inferSSRProps
-
+
>
)}
{
logo={item.logo}
description={item.description}
separate={true}
+ isTemplate={item.isTemplate}
invalidCredential={item.invalidCredentialIds.length > 0}
actions={
diff --git a/apps/web/pages/availability/[schedule].tsx b/apps/web/pages/availability/[schedule].tsx
index 3ffe557cac..d1b0a3fa03 100644
--- a/apps/web/pages/availability/[schedule].tsx
+++ b/apps/web/pages/availability/[schedule].tsx
@@ -185,11 +185,8 @@ export default function Availability({ schedule }: { schedule: number }) {
});
}}
className="flex flex-col pb-16 sm:mx-0 xl:flex-row xl:space-x-6">
-
+
-
- {t("change_start_end")}
-
{typeof me.data?.weekStart === "string" && (
) : (
-
+
{schedules.map((schedule) => (
{
.map((slot: IBusySlot) => (
{t("calendar_shows_busy_between")}{" "}
@@ -97,7 +97,7 @@ const AvailabilityView = ({ user }: { user: User }) => {
));
return (
-
+
{t("calendar_no_busy_slots")}
);
diff --git a/apps/web/pages/booking/[uid].tsx b/apps/web/pages/booking/[uid].tsx
index f7925299c8..196ce8ddc8 100644
--- a/apps/web/pages/booking/[uid].tsx
+++ b/apps/web/pages/booking/[uid].tsx
@@ -370,391 +370,383 @@ export default function Success(props: SuccessProps) {
-
-
-
- {giphyImage && !needsConfirmation && (
- // eslint-disable-next-line @next/next/no-img-element
-
- )}
- {!giphyImage && !needsConfirmation && !isCancelled && (
-
- )}
- {needsConfirmation && !isCancelled && (
-
- )}
- {isCancelled &&
}
+
+ {giphyImage && !needsConfirmation && (
+ // eslint-disable-next-line @next/next/no-img-element
+
+ )}
+ {!giphyImage && !needsConfirmation && !isCancelled && (
+
+ )}
+ {needsConfirmation && !isCancelled &&
}
+ {isCancelled &&
}
+
+
+
+ {needsConfirmation && !isCancelled
+ ? props.recurringBookings
+ ? t("submitted_recurring")
+ : t("submitted")
+ : isCancelled
+ ? t("event_cancelled")
+ : props.recurringBookings
+ ? t("meeting_is_scheduled_recurring")
+ : t("meeting_is_scheduled")}
+
+
-
-
- {needsConfirmation && !isCancelled
- ? props.recurringBookings
- ? t("submitted_recurring")
- : t("submitted")
- : isCancelled
- ? t("event_cancelled")
- : props.recurringBookings
- ? t("meeting_is_scheduled_recurring")
- : t("meeting_is_scheduled")}
-
-
-
- {(isCancelled || reschedule) && cancellationReason && (
- <>
-
- {isCancelled ? t("reason") : t("reschedule_reason_success_page")}
-
-
{cancellationReason}
- >
- )}
-
{t("what")}
-
{eventName}
-
{t("when")}
-
- {reschedule && !!formerTime && (
-
-
-
- )}
-
-
- {(bookingInfo?.user || bookingInfo?.attendees) && (
- <>
-
{t("who")}
-
- <>
- {bookingInfo?.user && (
-
-
{bookingInfo.user.name}
-
{bookingInfo.user.email}
-
- )}
- {bookingInfo?.attendees.map((attendee) => (
-
- {attendee.name &&
{attendee.name}
}
-
{attendee.email}
-
- ))}
- >
-
- >
- )}
- {locationToDisplay && (
- <>
-
{t("where")}
-
- >
- )}
- {bookingInfo?.description && (
- <>
-
{t("additional_notes")}
-
-
{bookingInfo.description}
-
- >
- )}
- {customInputs &&
- Object.keys(customInputs).map((key) => {
- // This breaks if you have two label that are the same.
- // TODO: Fix this in another PR
- const customInput = customInputs[key as keyof typeof customInputs];
- const eventTypeCustomFound = eventType.customInputs?.find((ci) => ci.label === key);
- return (
- <>
- {eventTypeCustomFound?.type === "RADIO" && (
- <>
-
- {eventTypeCustomFound.label}
-
-
- {eventTypeCustomFound.options &&
- eventTypeCustomFound.options.map((option) => {
- const selected = option.label == customInput;
- return (
-
-
{option.label}
-
{option.label === customInput && "✅"}
-
- );
- })}
-
- >
- )}
- {eventTypeCustomFound?.type !== "RADIO" && customInput !== "" && (
- <>
-
{key}
-
- {typeof customInput === "boolean" ? (
-
{customInput ? "true" : "false"}
- ) : (
-
{customInput}
- )}
-
- >
- )}
- >
- );
- })}
- {bookingInfo?.smsReminderNumber && hasSMSAttendeeAction && (
- <>
-
{t("number_sms_notifications")}
-
-
{bookingInfo.smsReminderNumber}
-
- >
- )}
-
-
- {(!needsConfirmation || !userIsOwner) &&
- !isCancelled &&
- (!isCancellationMode ? (
+
+ {(isCancelled || reschedule) && cancellationReason && (
<>
-
-
-
- {t("need_to_make_a_change")}
-
-
- {!props.recurringBookings && (
-
-
-
- {t("reschedule")}
-
-
- {t("or_lowercase")}
-
+
+ {isCancelled ? t("reason") : t("reschedule_reason_success_page")}
+
+
{cancellationReason}
+ >
+ )}
+
{t("what")}
+
{eventName}
+
{t("when")}
+
+ {reschedule && !!formerTime && (
+
+
+
+ )}
+
+
+ {(bookingInfo?.user || bookingInfo?.attendees) && (
+ <>
+
{t("who")}
+
+ <>
+ {bookingInfo?.user && (
+
+
{bookingInfo.user.name}
+
{bookingInfo.user.email}
+
+ )}
+ {bookingInfo?.attendees.map((attendee) => (
+
+ {attendee.name &&
{attendee.name}
}
+
{attendee.email}
+
+ ))}
+ >
+
+ >
+ )}
+ {locationToDisplay && (
+ <>
+
{t("where")}
+
+ {locationToDisplay.startsWith("http") ? (
+
+ {locationToDisplay}
+
+ ) : (
+ locationToDisplay
)}
-
-
setIsCancellationMode(true)}>
- {t("cancel")}
-
-
- >
- ) : (
- <>
-
-
- >
- ))}
- {userIsOwner &&
- !needsConfirmation &&
- !isCancellationMode &&
- !isCancelled &&
- calculatedDuration && (
- <>
-
-
-
- {t("add_to_calendar")}
-
-
-
-
- Google
-
-
-
-
-
- Microsoft Outlook
-
-
-
-
-
- Microsoft Office
-
-
-
-
-
- {t("other")}
-
-
-
-
>
)}
- {session === null && !(userIsOwner || props.hideBranding) && (
+ {bookingInfo?.description && (
+ <>
+
{t("additional_notes")}
+
+
{bookingInfo.description}
+
+ >
+ )}
+ {customInputs &&
+ Object.keys(customInputs).map((key) => {
+ // This breaks if you have two label that are the same.
+ // TODO: Fix this in another PR
+ const customInput = customInputs[key as keyof typeof customInputs];
+ const eventTypeCustomFound = eventType.customInputs?.find((ci) => ci.label === key);
+ return (
+ <>
+ {eventTypeCustomFound?.type === "RADIO" && (
+ <>
+
+ {eventTypeCustomFound.label}
+
+
+ {eventTypeCustomFound.options &&
+ eventTypeCustomFound.options.map((option) => {
+ const selected = option.label == customInput;
+ return (
+
+
{option.label}
+
{option.label === customInput && "✅"}
+
+ );
+ })}
+
+ >
+ )}
+ {eventTypeCustomFound?.type !== "RADIO" && customInput !== "" && (
+ <>
+
{key}
+
+ {typeof customInput === "boolean" ? (
+
{customInput ? "true" : "false"}
+ ) : (
+
{customInput}
+ )}
+
+ >
+ )}
+ >
+ );
+ })}
+ {bookingInfo?.smsReminderNumber && hasSMSAttendeeAction && (
+ <>
+
{t("number_sms_notifications")}
+
+
{bookingInfo.smsReminderNumber}
+
+ >
+ )}
+
+
+ {(!needsConfirmation || !userIsOwner) &&
+ !isCancelled &&
+ (!isCancellationMode ? (
+ <>
+
+
+
+ {t("need_to_make_a_change")}
+
+
+ {!props.recurringBookings && (
+
+
+
+ {t("reschedule")}
+
+
+ {t("or_lowercase")}
+
+ )}
+
+ setIsCancellationMode(true)}>
+ {t("cancel")}
+
+
+ >
+ ) : (
+ <>
+
+
+ >
+ ))}
+ {userIsOwner &&
+ !needsConfirmation &&
+ !isCancellationMode &&
+ !isCancelled &&
+ calculatedDuration && (
<>
-
+ {session === null && !(userIsOwner || props.hideBranding) && (
+ <>
+
+
+ >
+ )}
diff --git a/apps/web/pages/event-types/index.tsx b/apps/web/pages/event-types/index.tsx
index 52dedda296..04837cc593 100644
--- a/apps/web/pages/event-types/index.tsx
+++ b/apps/web/pages/event-types/index.tsx
@@ -250,7 +250,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
const lastItem = types[types.length - 1];
return (
-
+
{types.map((type, index) => {
const embedLink = `${group.profile.slug}/${type.slug}`;
const calLink = `${CAL_URL}/${embedLink}`;
@@ -311,7 +311,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
@@ -320,7 +320,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
{
showToast(t("link_copied"), "success");
@@ -335,7 +335,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
className="radix-state-open:rounded-r-md">
@@ -395,7 +395,12 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL
-
+
diff --git a/apps/web/pages/settings/billing/index.tsx b/apps/web/pages/settings/billing/index.tsx
index 72f1560589..ae5efa594e 100644
--- a/apps/web/pages/settings/billing/index.tsx
+++ b/apps/web/pages/settings/billing/index.tsx
@@ -28,7 +28,7 @@ const CtaRow = ({ title, description, className, children }: CtaRowProps) => {
{children}
-
+
>
);
};
diff --git a/apps/web/pages/settings/my-account/appearance.tsx b/apps/web/pages/settings/my-account/appearance.tsx
index e7920ae231..12824b24a9 100644
--- a/apps/web/pages/settings/my-account/appearance.tsx
+++ b/apps/web/pages/settings/my-account/appearance.tsx
@@ -122,7 +122,7 @@ const AppearanceView = () => {
/>
-
+
{t("custom_brand_colors")}
@@ -168,7 +168,7 @@ const AppearanceView = () => {
onClick={() => window.open(`${WEBAPP_URL}/${user.username}/${user.eventTypes[0].title}`, "_blank")}>
Preview
*/}
-
+
{
return (
@@ -75,22 +74,17 @@ const ConferencingLayout = () => {
apps.items
.map((app) => ({ ...app, title: app.title || app.name }))
.map((app) => (
-
-
- {
- // eslint-disable-next-line @next/next/no-img-element
- app.logo &&
- }
-
-
- {app.title}
-
- {app.description}
-
+
-
+
@@ -109,8 +103,8 @@ const ConferencingLayout = () => {
-
-
+ }
+ />
))}
diff --git a/apps/web/pages/settings/my-account/profile.tsx b/apps/web/pages/settings/my-account/profile.tsx
index 8cb5353b0d..602ffe93d6 100644
--- a/apps/web/pages/settings/my-account/profile.tsx
+++ b/apps/web/pages/settings/my-account/profile.tsx
@@ -222,7 +222,7 @@ const ProfileView = () => {
}
/>
-
+
{t("danger_zone")}
{/* Delete account Dialog */}
diff --git a/apps/web/pages/team/[slug].tsx b/apps/web/pages/team/[slug].tsx
index d01b5f12d9..7ea6129fca 100644
--- a/apps/web/pages/team/[slug].tsx
+++ b/apps/web/pages/team/[slug].tsx
@@ -36,12 +36,12 @@ function TeamPage({ team }: TeamPageProps) {
}, [telemetry, router.asPath]);
const EventTypes = () => (
-
+
{team.eventTypes.map((type, index) => (
diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json
index 13b0cce05a..9d220e2b0d 100644
--- a/apps/web/public/static/locales/en/common.json
+++ b/apps/web/public/static/locales/en/common.json
@@ -64,7 +64,7 @@
"someone_requested_an_event": "Someone has requested to schedule an event on your calendar.",
"someone_requested_password_reset": "Someone has requested a link to change your password.",
"password_reset_instructions": "If you didn't request this, you can safely ignore this email and your password will not be changed.",
- "event_awaiting_approval_subject": "Awaiting Approval: {{eventType}} at {{date}}",
+ "event_awaiting_approval_subject": "Awaiting Approval: {{title}} at {{date}}",
"event_still_awaiting_approval": "An event is still waiting for your approval",
"booking_submitted_subject": "Booking Submitted: {{title}} at {{date}}",
"your_meeting_has_been_booked": "Your meeting has been booked",
@@ -660,6 +660,7 @@
"edit_availability": "Edit availability",
"configure_availability": "Configure times when you are available for bookings.",
"copy_times_to": "Copy times to",
+ "copy_times_to_tooltip": "Copy times to …",
"change_weekly_schedule": "Change your weekly schedule",
"logo": "Logo",
"error": "Error",
@@ -789,6 +790,7 @@
"number_apps_one": "{{count}} App",
"number_apps_other": "{{count}} Apps",
"trending_apps": "Trending Apps",
+ "most_popular":"Most Popular",
"explore_apps": "{{category}} apps",
"installed_apps": "Installed Apps",
"free_to_use_apps": "Free",
diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css
index 2ecf6effe6..f538905811 100644
--- a/apps/web/styles/globals.css
+++ b/apps/web/styles/globals.css
@@ -183,19 +183,19 @@ button[role="switch"][data-state="checked"] {
}
.slider > .slider-track {
- @apply relative h-1 flex-grow rounded-md bg-neutral-400;
+ @apply relative h-1 flex-grow rounded-md bg-gray-400;
}
.slider .slider-range {
- @apply absolute h-full rounded-full bg-neutral-700;
+ @apply absolute h-full rounded-full bg-gray-700;
}
.slider .slider-thumb {
- @apply block h-3 w-3 cursor-pointer rounded-full bg-neutral-700 transition-all;
+ @apply block h-3 w-3 cursor-pointer rounded-full bg-gray-700 transition-all;
}
.slider .slider-thumb:hover {
- @apply bg-neutral-600;
+ @apply bg-gray-600;
}
.slider .slider-thumb:focus {
@@ -237,12 +237,12 @@ button[role="switch"][data-state="checked"] {
}
.react-multi-email > [type="text"] {
- @apply dark:placeholder:text-darkgray-600 focus:border-brand dark:border-darkgray-300 dark:text-darkgray-900 block w-full rounded-md border-gray-300 text-sm focus:ring-black disabled:bg-gray-200 disabled:hover:cursor-not-allowed dark:bg-transparent dark:selection:bg-green-500 disabled:dark:text-gray-500 dark:text-white;
+ @apply dark:placeholder:text-darkgray-600 focus:border-brand dark:border-darkgray-300 dark:text-white block w-full rounded-md border-gray-300 text-sm focus:ring-black disabled:bg-gray-200 disabled:hover:cursor-not-allowed dark:bg-transparent dark:selection:bg-green-500 disabled:dark:text-gray-500;
}
.react-multi-email [data-tag] {
box-shadow: none !important;
- @apply dark:bg-brand my-1 inline-flex items-center rounded-md border border-transparent bg-neutral-200 px-2 py-1 text-sm font-medium text-gray-900 hover:bg-neutral-100 focus:outline-none focus:ring-2 focus:ring-neutral-500 focus:ring-offset-2 ltr:mr-2 rtl:ml-2 dark:text-white;
+ @apply dark:bg-brand my-1 inline-flex items-center rounded-md border border-transparent bg-gray-200 px-2 py-1 text-sm font-medium text-gray-900 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 ltr:mr-2 rtl:ml-2 dark:text-white;
}
.react-multi-email > span[data-placeholder] {
@@ -270,7 +270,7 @@ button[role="switch"][data-state="checked"] {
}
.react-multi-email [data-tag] {
- @apply my-1 inline-flex items-center rounded-md border border-transparent bg-neutral-200 px-2 py-1 text-sm font-medium text-gray-900 hover:bg-neutral-100 focus:outline-none focus:ring-2 focus:ring-neutral-500 focus:ring-offset-2 ltr:mr-2 rtl:ml-2 dark:bg-neutral-900 dark:text-white dark:hover:bg-neutral-700;
+ @apply my-1 inline-flex items-center rounded-md border border-transparent bg-gray-200 px-2 py-1 text-sm font-medium text-gray-900 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 ltr:mr-2 rtl:ml-2 dark:bg-gray-900 dark:text-white dark:hover:bg-gray-700;
}
.react-multi-email [data-tag] [data-tag-item] {
@@ -383,7 +383,7 @@ nav#nav--settings > a svg {
}
nav#nav--settings > a.active {
- @apply border-neutral-500 bg-neutral-50 text-gray-700 hover:bg-neutral-50 hover:text-gray-700;
+ @apply border-gray-500 bg-gray-50 text-gray-700 hover:bg-gray-50 hover:text-gray-700;
}
nav#nav--settings > a.active svg {
diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js
index 36a889ad6d..771a3a866b 100644
--- a/apps/web/tailwind.config.js
+++ b/apps/web/tailwind.config.js
@@ -2,23 +2,5 @@ const base = require("@calcom/config/tailwind-preset");
/** @type {import('tailwindcss').Config} */
module.exports = {
...base,
- theme: {
- ...base.theme,
- extend: {
- ...base.theme.extend,
- backgroundImage: {
- "gradient-conic": "conic-gradient(var(--tw-gradient-stops))",
- },
- keyframes: {
- disco: {
- "0%": { transform: "translateY(-50%) rotate(0deg)" },
- "100%": { transform: "translateY(-50%) rotate(360deg)" },
- },
- },
- animation: {
- disco: "disco 8s linear infinite",
- },
- },
- },
content: [...base.content],
};
diff --git a/apps/website b/apps/website
deleted file mode 160000
index bb8a37c4ce..0000000000
--- a/apps/website
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit bb8a37c4ce912b825c31d5a8caf5d1f19fe04656
diff --git a/git-init.sh b/git-init.sh
new file mode 100755
index 0000000000..0fb7890985
--- /dev/null
+++ b/git-init.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+# If there's a `.gitmodule` file skip this script
+[ -f .gitmodules ] && {
+ echo ".gitmodules already initializied"
+ exit 0
+}
+
+./git-setup.sh api website console
diff --git a/git-setup.sh b/git-setup.sh
new file mode 100755
index 0000000000..eb740005df
--- /dev/null
+++ b/git-setup.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+# If no project name is given
+if [ $# -eq 0 ]; then
+ # Display usage and stop
+ echo "Usage: git-setup.sh "
+ exit 1
+fi
+# Loop through the requested modules
+for module in "$@"; do
+ echo "Setting up '$module' module..."
+ # Set the project git URL
+ project=$(echo "git@github.com:calcom/$module.git")
+ # Check if we have access to the module
+ if [ "$(git ls-remote "$project" 2>/dev/null)" ]; then
+ echo "You have access to '${module}'"
+ # Create the .gitmodules file if it doesn't exist
+ ([ -e ".gitmodules" ] || touch ".gitmodules") && [ ! -w ".gitmodules" ] && echo cannot write to .gitmodules && exit 1
+ # Prevents duplicate entries
+ git config -f .gitmodules --unset-all "submodule.apps/$module.branch"
+ # Add the submodule
+ git submodule add --force "git@github.com:calcom/$module.git" "apps/$module"
+ # Set the default branch to main
+ git config -f .gitmodules --add "submodule.apps/$module.branch" main
+ # Adding the subdmoule ignores the `.gitignore` so a reset is needed
+ git reset
+ else
+ # If the module is the API, display a link to request access
+ if [ "$module" == "api" ]; then
+ echo "You don't have access to: '${module}' module. You can request access in: https://console.cal.com"
+ else
+ # If the module is not the API, display normal message
+ echo "You don't have access to: '${module}' module."
+ fi
+ fi
+done
diff --git a/jest.config.ts b/jest.config.ts
index 0fbd094883..87a2fcc9fb 100644
--- a/jest.config.ts
+++ b/jest.config.ts
@@ -60,28 +60,29 @@ const config: Config = {
transformIgnorePatterns: ["/node_modules/", "^.+\\.module\\.(css|sass|scss)$"],
testEnvironment: "jsdom",
},
- {
- displayName: "@calcom/api",
- roots: ["/apps/api"],
- testMatch: ["**/test/lib/**/*.(spec|test).(ts|tsx|js)"],
- setupFilesAfterEnv: ["/tests/config/singleton.ts"],
- transform: {
- "^.+\\.ts?$": "ts-jest",
- },
- globals: {
- "ts-jest": {
- tsconfig: "/apps/api/tsconfig.json",
- },
- },
- transformIgnorePatterns: ["/node_modules/", "^.+\\.module\\.(css|sass|scss)$"],
- testEnvironment: "node",
- clearMocks: true,
- moduleNameMapper: {
- "^@lib/(.*)$": "/apps/api/lib/$1",
- "^@api/(.*)$": "/apps/api/pages/api/$1",
- },
- // setupFilesAfterEnv: ["/apps/api/jest.setup.ts"], // Uncomment when API becomes public
- },
+ // FIXME: Prevent this breaking Jest when API module is missing
+ // {
+ // displayName: "@calcom/api",
+ // roots: ["/apps/api"],
+ // testMatch: ["**/test/lib/**/*.(spec|test).(ts|tsx|js)"],
+ // setupFilesAfterEnv: ["/tests/config/singleton.ts"],
+ // transform: {
+ // "^.+\\.ts?$": "ts-jest",
+ // },
+ // globals: {
+ // "ts-jest": {
+ // tsconfig: "/apps/api/tsconfig.json",
+ // },
+ // },
+ // transformIgnorePatterns: ["/node_modules/", "^.+\\.module\\.(css|sass|scss)$"],
+ // testEnvironment: "node",
+ // clearMocks: true,
+ // moduleNameMapper: {
+ // "^@lib/(.*)$": "/apps/api/lib/$1",
+ // "^@api/(.*)$": "/apps/api/pages/api/$1",
+ // },
+ // // setupFilesAfterEnv: ["/apps/api/jest.setup.ts"], // Uncomment when API becomes public
+ // },
],
watchPlugins: [
"jest-watch-typeahead/filename",
diff --git a/package.json b/package.json
index 0c479d9af3..36566cfbf9 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,12 @@
"app-store:build": "yarn app-store-cli build",
"app-store:watch": "yarn app-store-cli watch",
"app-store": "yarn app-store-cli cli",
+ "create-app": "yarn app-store create",
+ "edit-app": "yarn app-store edit",
+ "delete-app": "yarn app-store delete",
+ "create-app-template": "yarn app-store create-template",
+ "edit-app-template": "yarn app-store edit-template",
+ "delete-app-template": "yarn app-store delete-template",
"build": "turbo run build --filter=@calcom/web...",
"clean": "find . -name node_modules -o -name .next -o -name .turbo -o -name dist -type d -prune | xargs rm -rf",
"db-deploy": "turbo run db-deploy",
@@ -45,6 +51,7 @@
"lint": "turbo run lint",
"postinstall": "turbo run post-install",
"pre-commit": "lint-staged",
+ "preinstall": "./git-init.sh",
"predev": "echo 'Checking env files'",
"prepare": "husky install",
"prisma": "yarn workspace @calcom/prisma prisma",
diff --git a/packages/app-store-cli/README.md b/packages/app-store-cli/README.md
new file mode 100644
index 0000000000..48153efd01
--- /dev/null
+++ b/packages/app-store-cli/README.md
@@ -0,0 +1,9 @@
+## How to build an App using the CLI
+Refer to https://developer.cal.com/guides/how-to-build-an-app
+
+## TODO
+- Merge app-store:watch and app-store commands; introduce app-store --watch
+- An app created through CLI should be able to completely skip API validation for testing purposes. Credentials should be created with no API specified specific to the app. It would allow us to test any app end to end not worrying about the corresponding API endpoint.
+- Someone can add wrong directory name(which doesn't satisfy slug requirements) manually. How to handle it.
+- Allow editing and updating app from the cal app itself - including assets uploading when developing locally.
+- Use AppDeclarativeHandler across all apps. Whatever isn't supported in it, support that.
\ No newline at end of file
diff --git a/packages/app-store-cli/package.json b/packages/app-store-cli/package.json
index f6a63397fb..22b63dabe7 100644
--- a/packages/app-store-cli/package.json
+++ b/packages/app-store-cli/package.json
@@ -7,10 +7,10 @@
"node": ">=10"
},
"scripts": {
- "build": "ts-node --transpile-only src/app-store.ts",
+ "build": "ts-node --transpile-only src/build.ts",
"cli": "ts-node --transpile-only src/cli.tsx",
- "watch": "ts-node --transpile-only src/app-store.ts --watch",
- "generate": "ts-node --transpile-only src/app-store.ts",
+ "watch": "ts-node --transpile-only src/build.ts --watch",
+ "generate": "ts-node --transpile-only src/build.ts",
"post-install": "yarn build"
},
"files": [
diff --git a/packages/app-store-cli/readme.md b/packages/app-store-cli/readme.md
deleted file mode 100644
index 5b095ac91e..0000000000
--- a/packages/app-store-cli/readme.md
+++ /dev/null
@@ -1,37 +0,0 @@
-## Steps to create an app
-
-- Create a folder in packages/app-store/{APP_NAME} = {APP}
-- Fill it with a sample app
- - Modify {APP}/\_metadata.ts with the data provided
-
-## Approach
-
-- appType is derived from App Name(a slugify operation that makes a string that can be used as a director name, a variable name for imports and a URL path).
-- appType is then used to create the app directory. It becomes `config.type` of config.json. config.type is the value used to create an entry in App table and retrieve any apps or credentials. It also becomes App.dirName
-- dirnames that don't start with \_ are considered apps in packages/app-store and based on those apps .generated.ts\* files are created. This allows pre-cli apps to keep on working.
-- app directory is populated with app-store/\_baseApp with newly updated config.json and package.json
-- `packages/prisma/seed-app-store.config.json` is updated with new app.
-
-NOTE: After app-store-cli is live, Credential.appId and Credential.type would be same for new apps. For old apps they would remain different. Credential.type would be used to identify credentials in integrations call and Credential.appId/App.slug would be used to identify apps.
-If we rename all existing apps to their slug names, we can remove type and then use just appId to refer to things everywhere. This can be done later on.
-
-## TODO
-
-- Improvements
- - Edit command Improvements
- - Prefill fields in edit command -> It allows only that content to change which user wants to change.
- - Don't override icon.svg
- - Merge app-store:watch and app-store commands; introduce app-store --watch
- - Allow inputs in non interactive way as well - That would allow easily copy pasting commands.
- - An app created through CLI should be able to completely skip API validation for testing purposes. Credentials should be created with no API specified specific to the app. It would allow us to test any app end to end not worrying about the corresponding API endpoint.
- - Require assets path relative to app dir.
-
-## Roadmap
-
-- Avoid delete and edit on apps created outside of cli
-- Someone can add wrong directory name(which doesn't satisfy slug requirements) manually. How to handle it.
-- Allow editing and updating app from the cal app itself - including assets uploading when developing locally.
-- Improvements in shared code across app
- - Use baseApp/api/add.ts for all apps with configuration of credentials creation and redirection URL.
-- Delete creation side effects if App creation fails - Might make debugging difficult
- - This is so that web app doesn't break because of additional app folders or faulty db-seed
diff --git a/packages/app-store-cli/src/App.tsx b/packages/app-store-cli/src/App.tsx
new file mode 100644
index 0000000000..01236c0e49
--- /dev/null
+++ b/packages/app-store-cli/src/App.tsx
@@ -0,0 +1,49 @@
+import React, { FC } from "react";
+import { SupportedCommands } from "src/types";
+
+import Create from "./commandViews/Create";
+import CreateTemplate from "./commandViews/Create";
+import Delete from "./commandViews/Delete";
+import DeleteTemplate from "./commandViews/DeleteTemplate";
+import Edit from "./commandViews/Edit";
+import EditTemplate from "./commandViews/EditTemplate";
+
+export const App: FC<{
+ template: string;
+ command: SupportedCommands;
+ slug?: string;
+}> = ({ command, template, slug }) => {
+ if (command === "create") {
+ return ;
+ }
+
+ if (command === "edit") {
+ return ;
+ }
+
+ if (command === "edit-template") {
+ return ;
+ }
+
+ if (command === "delete") {
+ if (!slug) {
+ throw new Error('Slug is required for "delete" command');
+ }
+ return ;
+ }
+
+ if (command === "create-template") {
+ return ;
+ }
+
+ if (command === "delete-template") {
+ if (!slug) {
+ throw new Error('Slug is required for "delete-template" command');
+ }
+ return ;
+ }
+
+ return null;
+};
+
+export default App;
diff --git a/packages/app-store-cli/src/CliApp.tsx b/packages/app-store-cli/src/CliApp.tsx
deleted file mode 100644
index eb6fe8f370..0000000000
--- a/packages/app-store-cli/src/CliApp.tsx
+++ /dev/null
@@ -1,463 +0,0 @@
-import fs from "fs";
-import { Box, Text } from "ink";
-import SelectInput from "ink-select-input";
-import TextInput from "ink-text-input";
-import path from "path";
-import React, { FC, useEffect, useState } from "react";
-
-import execSync from "./execSync";
-
-const slugify = (str: string) => {
- // It is to be a valid dir name, a valid JS variable name and a valid URL path
- return str.replace(/[^a-zA-Z0-9]/g, "_").toLowerCase();
-};
-
-function getSlugFromAppName(appName: string | null): string | null {
- if (!appName) {
- return appName;
- }
- return slugify(appName);
-}
-
-function getAppDirPath(slug: any) {
- return path.join(appStoreDir, `${slug}`);
-}
-
-const appStoreDir = path.resolve(__dirname, "..", "..", "app-store");
-const workspaceDir = path.resolve(__dirname, "..", "..", "..");
-
-function absolutePath(appRelativePath) {
- return path.join(appStoreDir, appRelativePath);
-}
-const updatePackageJson = ({ slug, appDescription, appDirPath }) => {
- const packageJsonConfig = JSON.parse(fs.readFileSync(`${appDirPath}/package.json`).toString());
- packageJsonConfig.name = `@calcom/${slug}`;
- packageJsonConfig.description = appDescription;
- // packageJsonConfig.description = `@calcom/${appName}`;
- fs.writeFileSync(`${appDirPath}/package.json`, JSON.stringify(packageJsonConfig, null, 2));
-};
-
-const BaseAppFork = {
- create: function* ({
- category,
- subCategory,
- editMode = false,
- appDescription,
- appName,
- slug,
- publisherName,
- publisherEmail,
- extendsFeature,
- }) {
- const appDirPath = getAppDirPath(slug);
- let message = !editMode ? "Forking base app" : "Updating app";
- yield message;
- if (!editMode) {
- execSync(`mkdir -p ${appDirPath}`);
- execSync(`cp -r ${absolutePath("_baseApp/*")} ${appDirPath}`);
- }
- updatePackageJson({ slug, appDirPath, appDescription });
-
- const categoryToVariantMap = {
- video: "conferencing",
- };
-
- const dataFromCategory =
- category === "video"
- ? {
- appData: {
- location: {
- type: `integrations:${slug}_video`,
- label: `${appName}`,
- },
- },
- }
- : {};
- const dataFromSubCategory =
- category === "video" && subCategory === "static"
- ? {
- appData: {
- ...dataFromCategory.appData,
- location: {
- ...dataFromCategory.appData.location,
- linkType: "static",
- organizerInputPlaceholder: "https://anything.anything",
- urlRegExp: "",
- },
- },
- }
- : {};
- let config = {
- "/*": "Don't modify slug - If required, do it using cli edit command",
- name: appName,
- // Plan to remove it. DB already has it and name of dir is also the same.
- slug: slug,
- type: `${slug}_${category}`,
- imageSrc: `/api/app-store/${slug}/icon.svg`,
- logo: `/api/app-store/${slug}/icon.svg`,
- url: `https://cal.com/apps/${slug}`,
- variant: categoryToVariantMap[category] || category,
- categories: [category],
- publisher: publisherName,
- email: publisherEmail,
- description: appDescription,
- extendsFeature: extendsFeature,
- // TODO: Use this to avoid edit and delete on the apps created outside of cli
- __createdUsingCli: true,
- ...dataFromCategory,
- ...dataFromSubCategory,
- };
- const currentConfig = JSON.parse(fs.readFileSync(`${appDirPath}/config.json`).toString());
- config = {
- ...currentConfig,
- ...config,
- };
- fs.writeFileSync(`${appDirPath}/config.json`, JSON.stringify(config, null, 2));
- fs.writeFileSync(
- `${appDirPath}/DESCRIPTION.md`,
- fs
- .readFileSync(`${appDirPath}/DESCRIPTION.md`)
- .toString()
- .replace(/_DESCRIPTION_/g, appDescription)
- .replace(/_APP_DIR_/g, slug)
- );
- message = !editMode ? "Forked base app" : "Updated app";
- yield message;
- },
- delete: function ({ slug }) {
- const appDirPath = getAppDirPath(slug);
- execSync(`rm -rf ${appDirPath}`);
- },
-};
-
-const Seed = {
- seedConfigPath: absolutePath("../prisma/seed-app-store.config.json"),
- update: function ({ slug, category, noDbUpdate }) {
- let configContent = "[]";
- try {
- if (fs.statSync(this.seedConfigPath)) {
- configContent = fs.readFileSync(this.seedConfigPath).toString();
- }
- } catch (e) {}
- const seedConfig = JSON.parse(configContent);
-
- if (!seedConfig.find((app) => app.slug === slug)) {
- seedConfig.push({
- dirName: slug,
- categories: [category],
- slug: slug,
- type: `${slug}_${category}`,
- });
- }
-
- // Add the message as a property to first item so that it stays always at the top
- seedConfig[0]["/*"] =
- "This file is auto-generated and updated by `yarn app-store create/edit`. Don't edit it manually";
-
- // Add the message as a property to first item so that it stays always at the top
- seedConfig[0]["/*"] =
- "This file is auto-generated and updated by `yarn app-store create/edit`. Don't edit it manually";
-
- fs.writeFileSync(this.seedConfigPath, JSON.stringify(seedConfig, null, 2));
- if (!noDbUpdate) {
- execSync(`cd ${workspaceDir} && yarn db-seed`);
- }
- },
- revert: async function ({ slug, noDbUpdate }) {
- let seedConfig = JSON.parse(fs.readFileSync(this.seedConfigPath).toString());
- seedConfig = seedConfig.filter((app) => app.slug !== slug);
- fs.writeFileSync(this.seedConfigPath, JSON.stringify(seedConfig, null, 2));
- if (!noDbUpdate) {
- execSync(`yarn workspace @calcom/prisma delete-app ${slug}`);
- }
- },
-};
-
-const generateAppFiles = () => {
- execSync(`cd ${__dirname} && yarn ts-node --transpile-only src/app-store.ts`);
-};
-
-const CreateApp = ({ noDbUpdate, slug = null, editMode = false }) => {
- // AppName
- // Type of App - Other, Calendar, Video, Payment, Messaging, Web3
- const [appInputData, setAppInputData] = useState({});
- const [inputIndex, setInputIndex] = useState(0);
- const fields = [
- { label: "App Title", name: "appName", type: "text", explainer: "Keep it very short" },
- {
- label: "App Description",
- name: "appDescription",
- type: "text",
- explainer:
- "A detailed description of your app. You can later modify DESCRIPTION.md to add slider and other components",
- },
- {
- label: "Category of App",
- name: "appCategory",
- type: "select",
- options: [
- { label: "Calendar", value: "calendar" },
- {
- label:
- "Static Link - Video(Apps like Ping.gg/Riverside/Whereby which require you to provide a link to join your room)",
- value: "video_static",
- },
- { label: "Other - Video", value: "video_other" },
- { label: "Payment", value: "payment" },
- { label: "Messaging", value: "messaging" },
- { label: "Web3", value: "web3" },
- { label: "Automation", value: "automation" },
- { label: "Analytics", value: "analytics" },
- { label: "Other", value: "other" },
- ],
- explainer: "This is how apps are categorized in App Store.",
- },
- {
- label: "What kind of app would you consider it?",
- name: "extendsFeature",
- options: [
- { label: "User", value: "User" },
- {
- label: "Event Type(Available for configuration in Apps tab for all Event Types)",
- value: "EventType",
- },
- ],
- },
- { label: "Publisher Name", name: "publisherName", type: "text", explainer: "Let users know who you are" },
- {
- label: "Publisher Email",
- name: "publisherEmail",
- type: "text",
- explainer: "Let users know how they can contact you.",
- },
- ];
- const field = fields[inputIndex];
- const fieldLabel = field?.label || "";
- const fieldName = field?.name || "";
- const fieldValue = appInputData[fieldName] || "";
- const appName = appInputData["appName"];
- const rawCategory = appInputData["appCategory"] || "";
- const appDescription = appInputData["appDescription"];
- const publisherName = appInputData["publisherName"];
- const publisherEmail = appInputData["publisherEmail"];
- let extendsFeature = appInputData["extendsFeature"] || [];
- if (rawCategory === "analytics") {
- // Analytics only means EventType Analytics as of now
- extendsFeature = "EventType";
- }
- const [status, setStatus] = useState<"inProgress" | "done">("inProgress");
- const allFieldsFilled = inputIndex === fields.length;
- const [progressUpdate, setProgressUpdate] = useState("");
- const category = rawCategory.split("_")[0];
- const subCategory = rawCategory.split("_")[1];
- if (!editMode) {
- slug = getSlugFromAppName(appName);
- }
- useEffect(() => {
- // When all fields have been filled
- if (allFieldsFilled) {
- const it = BaseAppFork.create({
- category,
- subCategory,
- appDescription,
- appName,
- slug,
- publisherName,
- publisherEmail,
- extendsFeature,
- });
- for (const item of it) {
- setProgressUpdate(item);
- }
-
- Seed.update({ slug, category, noDbUpdate });
-
- generateAppFiles();
-
- // FIXME: Even after CLI showing this message, it is stuck doing work before exiting
- // So we ask the user to wait for some time
- setStatus("done");
- }
- });
-
- if (!slug && editMode) {
- return --slug is required ;
- }
-
- if (allFieldsFilled) {
- return (
-
-
- {editMode
- ? `Editing app with slug ${slug}`
- : `Creating app with name '${appName}' of type '${category}'`}
-
- {progressUpdate}
- {status === "done" ? (
-
-
- Just wait for a few seconds for process to exit and then you are good to go. Your App code
- exists at ${getAppDirPath(slug)}
- Tip : Go and change the logo of your app by replacing {getAppDirPath(slug) + "/static/icon.svg"}
-
-
- App Summary:
-
-
-
- Slug:
- {slug}
-
-
- App URL:
- {`http://localhost:3000/apps/${slug}`}
-
-
- Name:
- {appName}
-
-
- Description:
- {appDescription}
-
-
- Category:
- {category}
-
-
- Publisher Name:
- {publisherName}
-
-
- Publisher Email:
- {publisherEmail}
-
-
-
- ) : (
- Please wait...
- )}
-
- Note: You should not rename app directory manually. Use cli only to do that as it needs to be
- updated in DB as well
-
-
- );
- }
-
- // Hack: using field.name == "appTitle" to identify that app Name has been submitted and not being edited.
- if (!editMode && field.name === "appTitle" && slug && fs.existsSync(getAppDirPath(slug))) {
- return (
- <>
- App with slug {slug} already exists. If you want to edit it, use edit command
- >
- );
- }
- return (
-
-
-
- {`${fieldLabel}:`}
- {field.type == "text" ? (
- {
- if (!value) {
- return;
- }
- setInputIndex((index) => {
- return index + 1;
- });
- }}
- onChange={(value) => {
- setAppInputData((appInputData) => {
- return {
- ...appInputData,
- [fieldName]: value,
- };
- });
- }}
- />
- ) : (
-
- items={field.options}
- onSelect={(item) => {
- setAppInputData((appInputData) => {
- return {
- ...appInputData,
- [fieldName]: item.value,
- };
- });
- setInputIndex((index) => {
- return index + 1;
- });
- }}
- />
- )}
-
-
-
- {field.explainer}
-
-
-
-
- );
-};
-
-const DeleteApp = ({ noDbUpdate, slug }) => {
- const [confirmedAppSlug, setConfirmedAppSlug] = useState("");
- const [allowDeletion, setAllowDeletion] = useState(false);
- const [state, setState] = useState({ done: null, description: null });
- useEffect(() => {
- if (allowDeletion) {
- BaseAppFork.delete({ slug });
- Seed.revert({ slug });
- generateAppFiles();
- setState({ description: `App with slug ${slug} has been deleted`, done: true });
- }
- }, [allowDeletion, slug]);
- return (
- <>
-
- Confirm the slug of the app that you want to delete. Note, that it would cleanup the app directory,
- App table and Credential table
-
- {!state.done && (
- {
- if (value === slug) {
- setState({ description: `Deletion started`, done: true });
- setAllowDeletion(true);
- } else {
- setState({ description: `Slug doesn't match - Should have been ${slug}`, done: true });
- }
- }}
- onChange={(val) => {
- setConfirmedAppSlug(val);
- }}
- />
- )}
- {state.description}
- >
- );
-};
-
-const App: FC<{ noDbUpdate?: boolean; command: "create" | "delete"; slug?: string }> = ({
- command,
- noDbUpdate,
- slug,
-}) => {
- if (command === "create") {
- return ;
- }
- if (command === "delete") {
- return ;
- }
- if (command === "edit") {
- return ;
- }
-};
-module.exports = App;
-export default App;
diff --git a/packages/app-store-cli/src/app-store.ts b/packages/app-store-cli/src/app-store.ts
deleted file mode 100644
index 2a3a3ec519..0000000000
--- a/packages/app-store-cli/src/app-store.ts
+++ /dev/null
@@ -1,278 +0,0 @@
-import chokidar from "chokidar";
-import fs from "fs";
-import { debounce } from "lodash";
-import path from "path";
-import prettier from "prettier";
-
-import { AppMeta } from "@calcom/types/App";
-
-import prettierConfig from "../../config/prettier-preset";
-import execSync from "./execSync";
-
-function isFileThere(path) {
- try {
- fs.statSync(path);
- return true;
- } catch (e) {
- return false;
- }
-}
-let isInWatchMode = false;
-if (process.argv[2] === "--watch") {
- isInWatchMode = true;
-}
-
-const formatOutput = (source: string) => prettier.format(source, prettierConfig);
-
-const getVariableName = function (appName: string) {
- return appName.replace("-", "_");
-};
-
-const getAppId = function (app: { name: string }) {
- // Handle stripe separately as it's an old app with different dirName than slug/appId
- return app.name === "stripepayment" ? "stripe" : app.name;
-};
-
-const APP_STORE_PATH = path.join(__dirname, "..", "..", "app-store");
-type App = Partial & {
- name: string;
- path: string;
-};
-function getAppName(candidatePath) {
- function isValidAppName(candidatePath) {
- if (
- !candidatePath.startsWith("_") &&
- candidatePath !== "ee" &&
- !candidatePath.includes("/") &&
- !candidatePath.includes("\\")
- ) {
- return candidatePath;
- }
- }
- if (isValidAppName(candidatePath)) {
- // Already a dirname of an app
- return candidatePath;
- }
- // Get dirname of app from full path
- const dirName = path.relative(APP_STORE_PATH, candidatePath);
- return isValidAppName(dirName) ? dirName : null;
-}
-
-function generateFiles() {
- const browserOutput = [`import dynamic from "next/dynamic"`];
- const metadataOutput = [];
- const schemasOutput = [];
- const appKeysSchemasOutput = [];
- const serverOutput = [];
- const appDirs: { name: string; path: string }[] = [];
-
- fs.readdirSync(`${APP_STORE_PATH}`).forEach(function (dir) {
- if (dir === "ee") {
- fs.readdirSync(path.join(APP_STORE_PATH, dir)).forEach(function (eeDir) {
- if (fs.statSync(path.join(APP_STORE_PATH, dir, eeDir)).isDirectory()) {
- if (!getAppName(path.resolve(eeDir))) {
- appDirs.push({
- name: eeDir,
- path: path.join(dir, eeDir),
- });
- }
- }
- });
- } else {
- if (fs.statSync(path.join(APP_STORE_PATH, dir)).isDirectory()) {
- if (!getAppName(dir)) {
- return;
- }
- appDirs.push({
- name: dir,
- path: dir,
- });
- }
- }
- });
-
- function forEachAppDir(callback: (arg: App) => void) {
- for (let i = 0; i < appDirs.length; i++) {
- const configPath = path.join(APP_STORE_PATH, appDirs[i].path, "config.json");
- let app;
-
- if (fs.existsSync(configPath)) {
- app = JSON.parse(fs.readFileSync(configPath).toString());
- } else {
- app = {};
- }
-
- callback({
- ...app,
- name: appDirs[i].name,
- path: appDirs[i].path,
- });
- }
- }
-
- forEachAppDir((app) => {
- const templateDestinationDir = path.join(APP_STORE_PATH, app.path, "extensions");
- const templateDestinationFilePath = path.join(templateDestinationDir, "EventTypeAppCard.tsx");
- const zodDestinationFilePath = path.join(APP_STORE_PATH, app.path, "zod.ts");
-
- if (app.extendsFeature === "EventType" && !isFileThere(templateDestinationFilePath)) {
- execSync(`mkdir -p ${templateDestinationDir}`);
- execSync(`cp ../app-store/_templates/extensions/EventTypeAppCard.tsx ${templateDestinationFilePath}`);
- execSync(`cp ../app-store/_templates/zod.ts ${zodDestinationFilePath}`);
- }
- });
-
- function getObjectExporter(
- objectName,
- {
- fileToBeImported,
- importBuilder,
- entryBuilder,
- }: {
- fileToBeImported: string;
- importBuilder?: (arg: App) => string;
- entryBuilder: (arg: App) => string;
- }
- ) {
- const output = [];
- forEachAppDir((app) => {
- if (
- fs.existsSync(path.join(APP_STORE_PATH, app.path, fileToBeImported)) &&
- typeof importBuilder === "function"
- ) {
- output.push(importBuilder(app));
- }
- });
-
- output.push(`export const ${objectName} = {`);
-
- forEachAppDir((app) => {
- if (fs.existsSync(path.join(APP_STORE_PATH, app.path, fileToBeImported))) {
- output.push(entryBuilder(app));
- }
- });
-
- output.push(`};`);
- return output;
- }
-
- serverOutput.push(
- ...getObjectExporter("apiHandlers", {
- fileToBeImported: "api/index.ts",
- // Import path must have / even for windows and not \
- entryBuilder: (app) => ` "${app.name}": import("./${app.path.replace(/\\/g, "/")}/api"),`,
- })
- );
-
- metadataOutput.push(
- ...getObjectExporter("appStoreMetadata", {
- fileToBeImported: "_metadata.ts",
- // Import path must have / even for windows and not \
- importBuilder: (app) =>
- `import { metadata as ${getVariableName(app.name)}_meta } from "./${app.path.replace(
- /\\/g,
- "/"
- )}/_metadata";`,
- entryBuilder: (app) => ` "${app.name}":${getVariableName(app.name)}_meta,`,
- })
- );
-
- schemasOutput.push(
- ...getObjectExporter("appDataSchemas", {
- fileToBeImported: "zod.ts",
- // Import path must have / even for windows and not \
- importBuilder: (app) =>
- `import { appDataSchema as ${getVariableName(app.name)}_schema } from "./${app.path.replace(
- /\\/g,
- "/"
- )}/zod";`,
- // Key must be appId as this is used by eventType metadata and lookup is by appId
- entryBuilder: (app) => ` "${getAppId(app)}":${getVariableName(app.name)}_schema ,`,
- })
- );
-
- appKeysSchemasOutput.push(
- ...getObjectExporter("appKeysSchemas", {
- fileToBeImported: "zod.ts",
- // Import path must have / even for windows and not \
- importBuilder: (app) =>
- `import { appKeysSchema as ${getVariableName(app.name)}_keys_schema } from "./${app.path.replace(
- /\\/g,
- "/"
- )}/zod";`,
- // Key must be appId as this is used by eventType metadata and lookup is by appId
- entryBuilder: (app) => ` "${getAppId(app)}":${getVariableName(app.name)}_keys_schema ,`,
- })
- );
-
- browserOutput.push(
- ...getObjectExporter("InstallAppButtonMap", {
- fileToBeImported: "components/InstallAppButton.tsx",
- entryBuilder: (app) =>
- ` ${app.name}: dynamic(() =>import("./${app.path}/components/InstallAppButton")),`,
- })
- );
-
- // TODO: Make a component map creator that accepts ComponentName and does the rest.
- // TODO: dailyvideo has a slug of daily-video, so that mapping needs to be taken care of. But it is an old app, so it doesn't need AppSettings
- browserOutput.push(
- ...getObjectExporter("AppSettingsComponentsMap", {
- fileToBeImported: "components/AppSettings.tsx",
- entryBuilder: (app) => ` ${app.name}: dynamic(() =>import("./${app.path}/components/AppSettings")),`,
- })
- );
-
- browserOutput.push(
- ...getObjectExporter("EventTypeAddonMap", {
- fileToBeImported: path.join("extensions", "EventTypeAppCard.tsx"),
- entryBuilder: (app) =>
- ` ${app.name}: dynamic(() =>import("./${app.path}/extensions/EventTypeAppCard")),`,
- })
- );
-
- const banner = `/**
- This file is autogenerated using the command \`yarn app-store:build --watch\`.
- Don't modify this file manually.
-**/
-`;
- const filesToGenerate: [string, string[]][] = [
- ["apps.metadata.generated.ts", metadataOutput],
- ["apps.server.generated.ts", serverOutput],
- ["apps.browser.generated.tsx", browserOutput],
- ["apps.schemas.generated.ts", schemasOutput],
- ["apps.keys-schemas.generated.ts", appKeysSchemasOutput],
- ];
- filesToGenerate.forEach(([fileName, output]) => {
- fs.writeFileSync(`${APP_STORE_PATH}/${fileName}`, formatOutput(`${banner}${output.join("\n")}`));
- });
- console.log(`Generated ${filesToGenerate.map(([fileName]) => fileName).join(", ")}`);
-}
-
-const debouncedGenerateFiles = debounce(generateFiles);
-
-if (isInWatchMode) {
- chokidar
- .watch(APP_STORE_PATH)
- .on("addDir", (dirPath) => {
- const appName = getAppName(dirPath);
- if (appName) {
- console.log(`Added ${appName}`);
- debouncedGenerateFiles();
- }
- })
- .on("change", (filePath) => {
- if (filePath.endsWith("config.json")) {
- console.log("Config file changed");
- debouncedGenerateFiles();
- }
- })
- .on("unlinkDir", (dirPath) => {
- const appName = getAppName(dirPath);
- if (appName) {
- console.log(`Removed ${appName}`);
- debouncedGenerateFiles();
- }
- });
-} else {
- generateFiles();
-}
diff --git a/packages/app-store-cli/src/build.ts b/packages/app-store-cli/src/build.ts
new file mode 100644
index 0000000000..df2f19906a
--- /dev/null
+++ b/packages/app-store-cli/src/build.ts
@@ -0,0 +1,348 @@
+import chokidar from "chokidar";
+import fs from "fs";
+import { debounce } from "lodash";
+import path from "path";
+import prettier from "prettier";
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+//@ts-ignore
+import prettierConfig from "@calcom/config/prettier-preset";
+import { AppMeta } from "@calcom/types/App";
+
+import { APP_STORE_PATH } from "./constants";
+import { getAppName } from "./utils/getAppName";
+
+let isInWatchMode = false;
+if (process.argv[2] === "--watch") {
+ isInWatchMode = true;
+}
+
+const formatOutput = (source: string) =>
+ prettier.format(source, {
+ parser: "babel",
+ ...prettierConfig,
+ });
+
+const getVariableName = function (appName: string) {
+ return appName.replace(/[-.]/g, "_");
+};
+
+const getAppId = function (app: { name: string }) {
+ // Handle stripe separately as it's an old app with different dirName than slug/appId
+ return app.name === "stripepayment" ? "stripe" : app.name;
+};
+
+type App = Partial & {
+ name: string;
+ path: string;
+};
+function generateFiles() {
+ const browserOutput = [`import dynamic from "next/dynamic"`];
+ const metadataOutput = [];
+ const schemasOutput = [];
+ const appKeysSchemasOutput = [];
+ const serverOutput = [];
+ const appDirs: { name: string; path: string }[] = [];
+
+ fs.readdirSync(`${APP_STORE_PATH}`).forEach(function (dir) {
+ if (dir === "ee" || dir === "templates") {
+ fs.readdirSync(path.join(APP_STORE_PATH, dir)).forEach(function (subDir) {
+ if (fs.statSync(path.join(APP_STORE_PATH, dir, subDir)).isDirectory()) {
+ if (getAppName(subDir)) {
+ appDirs.push({
+ name: subDir,
+ path: path.join(dir, subDir),
+ });
+ }
+ }
+ });
+ } else {
+ if (fs.statSync(path.join(APP_STORE_PATH, dir)).isDirectory()) {
+ if (!getAppName(dir)) {
+ return;
+ }
+ appDirs.push({
+ name: dir,
+ path: dir,
+ });
+ }
+ }
+ });
+
+ function forEachAppDir(callback: (arg: App) => void) {
+ for (let i = 0; i < appDirs.length; i++) {
+ const configPath = path.join(APP_STORE_PATH, appDirs[i].path, "config.json");
+ let app;
+
+ if (fs.existsSync(configPath)) {
+ app = JSON.parse(fs.readFileSync(configPath).toString());
+ } else {
+ app = {};
+ }
+
+ callback({
+ ...app,
+ name: appDirs[i].name,
+ path: appDirs[i].path,
+ });
+ }
+ }
+
+ /**
+ * Windows has paths with backslashes, so we need to replace them with forward slashes
+ * .ts and .tsx files are imported without extensions
+ * If a file has index.ts or index.tsx, it can be imported after removing the index.ts* part
+ */
+ function getModulePath(path: string, moduleName: string) {
+ return (
+ `./${path.replace(/\\/g, "/")}/` +
+ moduleName.replace(/\/index\.ts|\/index\.tsx/, "").replace(/\.tsx$|\.ts$/, "")
+ );
+ }
+
+ type ImportConfig =
+ | {
+ fileToBeImported: string;
+ importName?: string;
+ }
+ | [
+ {
+ fileToBeImported: string;
+ importName?: string;
+ },
+ {
+ fileToBeImported: string;
+ importName: string;
+ }
+ ];
+
+ /**
+ * If importConfig is an array, only 2 items are allowed. First one is the main one and second one is the fallback
+ */
+ function getExportedObject(
+ objectName: string,
+ {
+ lazyImport = false,
+ importConfig,
+ entryObjectKeyGetter = (app) => app.name,
+ }: {
+ lazyImport?: boolean;
+ importConfig: ImportConfig;
+ entryObjectKeyGetter?: (arg: App, importName?: string) => string;
+ }
+ ) {
+ const output: string[] = [];
+
+ const getLocalImportName = (
+ app: { name: string },
+ chosenConfig: ReturnType
+ ) => `${getVariableName(app.name)}_${getVariableName(chosenConfig.fileToBeImported)}`;
+
+ const fileToBeImportedExists = (
+ app: { path: string },
+ chosenConfig: ReturnType
+ ) => fs.existsSync(path.join(APP_STORE_PATH, app.path, chosenConfig.fileToBeImported));
+
+ addImportStatements();
+ createExportObject();
+
+ return output;
+
+ function addImportStatements() {
+ forEachAppDir((app) => {
+ const chosenConfig = getChosenImportConfig(importConfig, app);
+ if (fileToBeImportedExists(app, chosenConfig) && chosenConfig.importName) {
+ const importName = chosenConfig.importName;
+ if (!lazyImport) {
+ if (importName !== "default") {
+ // Import with local alias that will be used by createExportObject
+ output.push(
+ `import { ${importName} as ${getLocalImportName(app, chosenConfig)} } from "${getModulePath(
+ app.path,
+ chosenConfig.fileToBeImported
+ )}"`
+ );
+ } else {
+ // Default Import
+ output.push(
+ `import ${getLocalImportName(app, chosenConfig)} from "${getModulePath(
+ app.path,
+ chosenConfig.fileToBeImported
+ )}"`
+ );
+ }
+ }
+ }
+ });
+ }
+
+ function createExportObject() {
+ output.push(`export const ${objectName} = {`);
+
+ forEachAppDir((app) => {
+ const chosenConfig = getChosenImportConfig(importConfig, app);
+
+ if (fileToBeImportedExists(app, chosenConfig)) {
+ if (!lazyImport) {
+ const key = entryObjectKeyGetter(app);
+ output.push(`"${key}": ${getLocalImportName(app, chosenConfig)},`);
+ } else {
+ const key = entryObjectKeyGetter(app);
+ if (chosenConfig.fileToBeImported.endsWith(".tsx")) {
+ output.push(
+ `"${key}": dynamic(() => import("${getModulePath(
+ app.path,
+ chosenConfig.fileToBeImported
+ )}")),`
+ );
+ } else {
+ output.push(`"${key}": import("${getModulePath(app.path, chosenConfig.fileToBeImported)}"),`);
+ }
+ }
+ }
+ });
+
+ output.push(`};`);
+ }
+
+ function getChosenImportConfig(importConfig: ImportConfig, app: { path: string }) {
+ let chosenConfig;
+
+ if (!(importConfig instanceof Array)) {
+ chosenConfig = importConfig;
+ } else {
+ if (fs.existsSync(path.join(APP_STORE_PATH, app.path, importConfig[0].fileToBeImported))) {
+ chosenConfig = importConfig[0];
+ } else {
+ chosenConfig = importConfig[1];
+ }
+ }
+ return chosenConfig;
+ }
+ }
+
+ serverOutput.push(
+ ...getExportedObject("apiHandlers", {
+ importConfig: {
+ fileToBeImported: "api/index.ts",
+ },
+ lazyImport: true,
+ })
+ );
+
+ metadataOutput.push(
+ ...getExportedObject("appStoreMetadata", {
+ // Try looking for config.json and if it's not found use _metadata.ts to generate appStoreMetadata
+ importConfig: [
+ {
+ fileToBeImported: "config.json",
+ importName: "default",
+ },
+ {
+ fileToBeImported: "_metadata.ts",
+ importName: "metadata",
+ },
+ ],
+ })
+ );
+
+ schemasOutput.push(
+ ...getExportedObject("appDataSchemas", {
+ // Import path must have / even for windows and not \
+ importConfig: {
+ fileToBeImported: "zod.ts",
+ importName: "appDataSchema",
+ },
+ // HACK: Key must be appId as this is used by eventType metadata and lookup is by appId
+ // This can be removed once we rename the ids of apps like stripe to that of their app folder name
+ entryObjectKeyGetter: (app) => getAppId(app),
+ })
+ );
+
+ appKeysSchemasOutput.push(
+ ...getExportedObject("appKeysSchemas", {
+ importConfig: {
+ fileToBeImported: "zod.ts",
+ importName: "appKeysSchema",
+ },
+ // HACK: Key must be appId as this is used by eventType metadata and lookup is by appId
+ // This can be removed once we rename the ids of apps like stripe to that of their app folder name
+ entryObjectKeyGetter: (app) => getAppId(app),
+ })
+ );
+
+ browserOutput.push(
+ ...getExportedObject("InstallAppButtonMap", {
+ importConfig: {
+ fileToBeImported: "components/InstallAppButton.tsx",
+ },
+ lazyImport: true,
+ })
+ );
+
+ // TODO: Make a component map creator that accepts ComponentName and does the rest.
+ // TODO: dailyvideo has a slug of daily-video, so that mapping needs to be taken care of. But it is an old app, so it doesn't need AppSettings
+ browserOutput.push(
+ ...getExportedObject("AppSettingsComponentsMap", {
+ importConfig: {
+ fileToBeImported: "components/AppSettingsInterface.tsx",
+ },
+ lazyImport: true,
+ })
+ );
+
+ browserOutput.push(
+ ...getExportedObject("EventTypeAddonMap", {
+ importConfig: {
+ fileToBeImported: "components/EventTypeAppCardInterface.tsx",
+ },
+ lazyImport: true,
+ })
+ );
+
+ const banner = `/**
+ This file is autogenerated using the command \`yarn app-store:build --watch\`.
+ Don't modify this file manually.
+**/
+`;
+ const filesToGenerate: [string, string[]][] = [
+ ["apps.metadata.generated.ts", metadataOutput],
+ ["apps.server.generated.ts", serverOutput],
+ ["apps.browser.generated.tsx", browserOutput],
+ ["apps.schemas.generated.ts", schemasOutput],
+ ["apps.keys-schemas.generated.ts", appKeysSchemasOutput],
+ ];
+ filesToGenerate.forEach(([fileName, output]) => {
+ fs.writeFileSync(`${APP_STORE_PATH}/${fileName}`, formatOutput(`${banner}${output.join("\n")}`));
+ });
+ console.log(`Generated ${filesToGenerate.map(([fileName]) => fileName).join(", ")}`);
+}
+
+const debouncedGenerateFiles = debounce(generateFiles);
+
+if (isInWatchMode) {
+ chokidar
+ .watch(APP_STORE_PATH)
+ .on("addDir", (dirPath) => {
+ const appName = getAppName(dirPath);
+ if (appName) {
+ console.log(`Added ${appName}`);
+ debouncedGenerateFiles();
+ }
+ })
+ .on("change", (filePath) => {
+ if (filePath.endsWith("config.json")) {
+ console.log("Config file changed");
+ debouncedGenerateFiles();
+ }
+ })
+ .on("unlinkDir", (dirPath) => {
+ const appName = getAppName(dirPath);
+ if (appName) {
+ console.log(`Removed ${appName}`);
+ debouncedGenerateFiles();
+ }
+ });
+} else {
+ generateFiles();
+}
diff --git a/packages/app-store-cli/src/cli.tsx b/packages/app-store-cli/src/cli.tsx
index 3f8196d870..33001ffa1f 100644
--- a/packages/app-store-cli/src/cli.tsx
+++ b/packages/app-store-cli/src/cli.tsx
@@ -3,23 +3,35 @@ import { render } from "ink";
import meow from "meow";
import React from "react";
-import App from "./CliApp";
+import App from "./App";
+import { SupportedCommands } from "./types";
const cli = meow(
`
Usage
- $ app-store create/delete/edit - Edit and Delete commands must be used on apps created using cli
+ $ 'app-store create' or 'app-store create-template' - Creates a new app or template
+ Options
+ [--template -t] Template to use.
+
- Options
- [--slug] Slug. This is the name of app dir for apps created with cli.
+ $ 'app-store edit' or 'app-store edit-template' - Edit the App or Template identified by slug
+ Options
+ [--slug -s] Slug. This is the name of app dir for apps created with cli.
+
+
+ $ 'app-store delete' or 'app-store delete-template' - Deletes the app or template identified by slug
+ Options
+ [--slug -s] Slug. This is the name of app dir for apps created with cli.
`,
{
flags: {
- noDbUpdate: {
- type: "boolean",
- },
slug: {
type: "string",
+ alias: "s",
+ },
+ template: {
+ type: "string",
+ alias: "t",
},
},
allowUnknownFlags: false,
@@ -30,20 +42,32 @@ if (cli.input.length !== 1) {
cli.showHelp();
}
-const command = cli.input[0] as "create" | "delete" | "edit";
-const supportedCommands = ["create", "delete", "edit"];
+const command = cli.input[0] as SupportedCommands;
+const supportedCommands = [
+ "create",
+ "delete",
+ "edit",
+ "create-template",
+ "delete-template",
+ "edit-template",
+] as const;
if (!supportedCommands.includes(command)) {
cli.showHelp();
}
+let slug;
-let slug = null;
-
-if (command === "delete" || command === "edit") {
+if (
+ command === "delete" ||
+ command === "edit" ||
+ command === "delete-template" ||
+ command === "edit-template"
+) {
slug = cli.flags.slug;
if (!slug) {
console.log("--slug is required");
- cli.showHelp();
+ cli.showHelp(0);
}
}
-render( );
+
+render( );
diff --git a/packages/app-store-cli/src/commandViews/Create.tsx b/packages/app-store-cli/src/commandViews/Create.tsx
new file mode 100644
index 0000000000..ca0e3c8ce2
--- /dev/null
+++ b/packages/app-store-cli/src/commandViews/Create.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+import { AppForm } from "../components/AppCreateUpdateForm";
+
+export default function Create(props: Omit, "action">) {
+ return ;
+}
diff --git a/packages/app-store-cli/src/commandViews/CreateTemplate.tsx b/packages/app-store-cli/src/commandViews/CreateTemplate.tsx
new file mode 100644
index 0000000000..fbddc3b208
--- /dev/null
+++ b/packages/app-store-cli/src/commandViews/CreateTemplate.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+import { AppForm } from "../components/AppCreateUpdateForm";
+
+export default function CreateTemplate(props: Omit, "action">) {
+ return ;
+}
diff --git a/packages/app-store-cli/src/commandViews/Delete.tsx b/packages/app-store-cli/src/commandViews/Delete.tsx
new file mode 100644
index 0000000000..5282f864bf
--- /dev/null
+++ b/packages/app-store-cli/src/commandViews/Delete.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+import DeleteForm from "../components/DeleteForm";
+
+export default function Delete({ slug }: { slug: string }) {
+ return ;
+}
diff --git a/packages/app-store-cli/src/commandViews/DeleteTemplate.tsx b/packages/app-store-cli/src/commandViews/DeleteTemplate.tsx
new file mode 100644
index 0000000000..ecc4ff320e
--- /dev/null
+++ b/packages/app-store-cli/src/commandViews/DeleteTemplate.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+import DeleteForm from "../components/DeleteForm";
+
+export default function Delete({ slug }: { slug: string }) {
+ return ;
+}
diff --git a/packages/app-store-cli/src/commandViews/Edit.tsx b/packages/app-store-cli/src/commandViews/Edit.tsx
new file mode 100644
index 0000000000..faeb409338
--- /dev/null
+++ b/packages/app-store-cli/src/commandViews/Edit.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+import { AppForm } from "../components/AppCreateUpdateForm";
+
+export default function Edit(props: Omit, "action">) {
+ return ;
+}
diff --git a/packages/app-store-cli/src/commandViews/EditTemplate.tsx b/packages/app-store-cli/src/commandViews/EditTemplate.tsx
new file mode 100644
index 0000000000..4934d2c52d
--- /dev/null
+++ b/packages/app-store-cli/src/commandViews/EditTemplate.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+import { AppForm } from "../components/AppCreateUpdateForm";
+
+export default function Edit(props: Omit, "action">) {
+ return ;
+}
diff --git a/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx b/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx
new file mode 100644
index 0000000000..ede4e13935
--- /dev/null
+++ b/packages/app-store-cli/src/components/AppCreateUpdateForm.tsx
@@ -0,0 +1,353 @@
+import fs from "fs";
+import { Box, Newline, Text, useApp } from "ink";
+import SelectInput from "ink-select-input";
+import TextInput from "ink-text-input";
+import React, { useEffect, useState } from "react";
+
+import { AppMeta } from "@calcom/types/App";
+
+import { getSlugFromAppName, BaseAppFork, Seed, generateAppFiles, getAppDirPath } from "../core";
+import { getApp } from "../utils/getApp";
+import Templates from "../utils/templates";
+import Label from "./Label";
+import { Message } from "./Message";
+
+export const AppForm = ({
+ template: cliTemplate = "",
+ slug: givenSlug = "",
+ action,
+}: {
+ template?: string;
+ slug?: string;
+ action: "create" | "edit" | "create-template" | "edit-template";
+}) => {
+ cliTemplate = Templates.find((t) => t.value === cliTemplate)?.value || "";
+ const { exit } = useApp();
+ const isTemplate = action === "create-template" || action === "edit-template";
+ const isEditAction = action === "edit" || action === "edit-template";
+ let initialConfig = {
+ template: cliTemplate,
+ name: "",
+ description: "",
+ category: "",
+ publisher: "",
+ email: "",
+ };
+
+ const [app] = useState(() => getApp(givenSlug, isTemplate));
+
+ if ((givenSlug && action === "edit-template") || action === "edit")
+ try {
+ const config = JSON.parse(
+ fs.readFileSync(`${getAppDirPath(givenSlug, isTemplate)}/config.json`).toString()
+ ) as AppMeta;
+ initialConfig = {
+ ...config,
+ category: config.categories[0],
+ template: config.__template,
+ };
+ } catch (e) {}
+
+ const fields = [
+ {
+ label: "App Title",
+ name: "name",
+ type: "text",
+ explainer: "Keep it short and sweet like 'Google Meet'",
+ optional: false,
+ defaultValue: "",
+ },
+ {
+ label: "App Description",
+ name: "description",
+ type: "text",
+ explainer:
+ "A detailed description of your app. You can later modify DESCRIPTION.mdx to add markdown as well",
+ optional: false,
+ defaultValue: "",
+ },
+ // You can't edit the base template of an App or Template - You need to start fresh for that.
+ cliTemplate || isEditAction
+ ? null
+ : {
+ label: "Choose a base Template",
+ name: "template",
+ type: "select",
+ options: Templates,
+ optional: false,
+ defaultValue: "",
+ },
+ {
+ optional: false,
+ label: "Category of App",
+ name: "category",
+ type: "select",
+ options: [
+ { label: "Calendar", value: "calendar" },
+ { label: "Video", value: "video" },
+ { label: "Payment", value: "payment" },
+ { label: "Messaging", value: "messaging" },
+ { label: "Web3", value: "web3" },
+ { label: "Automation", value: "automation" },
+ { label: "Analytics", value: "analytics" },
+ { label: "Other", value: "other" },
+ ],
+ defaultValue: "",
+ explainer: "This is how apps are categorized in App Store.",
+ },
+ {
+ optional: true,
+ label: "Publisher Name",
+ name: "publisher",
+ type: "text",
+ explainer: "Let users know who you are",
+ defaultValue: "Your Name",
+ },
+ {
+ optional: true,
+ label: "Publisher Email",
+ name: "email",
+ type: "text",
+ explainer: "Let users know how they can contact you.",
+ defaultValue: "email@example.com",
+ },
+ ].filter((f) => f);
+ const [appInputData, setAppInputData] = useState(initialConfig);
+ const [inputIndex, setInputIndex] = useState(0);
+ const [slugFinalized, setSlugFinalized] = useState(false);
+
+ const field = fields[inputIndex];
+ const fieldLabel = field?.label || "";
+ const fieldName = field?.name || "";
+ let fieldValue = appInputData[fieldName as keyof typeof appInputData] || "";
+ let validationResult: Parameters[0]["message"] | null = null;
+ const { name, category, description, publisher, email, template } = appInputData;
+
+ const [status, setStatus] = useState<"inProgress" | "done">("inProgress");
+ const formCompleted = inputIndex === fields.length;
+ if (field?.name === "appCategory") {
+ // Use template category as the default category
+ fieldValue = Templates.find((t) => t.value === appInputData["template"])?.category || "";
+ }
+ const slug = getSlugFromAppName(name) || givenSlug;
+
+ useEffect(() => {
+ // When all fields have been filled
+ (async () => {
+ if (formCompleted) {
+ await BaseAppFork.create({
+ category,
+ description,
+ name,
+ slug,
+ publisher,
+ email,
+ template,
+ editMode: isEditAction,
+ isTemplate,
+ oldSlug: givenSlug,
+ });
+
+ await Seed.update({ slug, category: category, oldSlug: givenSlug, isTemplate });
+
+ await generateAppFiles();
+
+ // FIXME: Even after CLI showing this message, it is stuck doing work before exiting
+ // So we ask the user to wait for some time
+ setStatus("done");
+ }
+ })();
+ }, [formCompleted]);
+
+ if (action === "edit" || action === "edit-template") {
+ if (!slug) {
+ return --slug is required ;
+ }
+ if (!app) {
+ return (
+
+ );
+ }
+ }
+
+ if (status === "done") {
+ // HACK: This is a hack to exit the process manually because due to some reason cli isn't automatically exiting
+ setTimeout(() => {
+ exit();
+ }, 500);
+ }
+
+ if (formCompleted) {
+ return (
+
+ {status !== "done" && (
+
+ )}
+ {status === "done" && (
+
+
+ Just wait for a few seconds for process to exit and then you are good to go. Your{" "}
+ {isTemplate ? "Template" : "App"} code exists at {getAppDirPath(slug, isTemplate)}
+
+
+ Tip : Go and change the logo of your {isTemplate ? "template" : "app"} by replacing{" "}
+ {getAppDirPath(slug, isTemplate) + "/static/icon.svg"}
+
+
+
+ App Summary:
+
+
+
+ Slug:
+ {slug}
+
+
+ {isTemplate ? "Template" : "App"} URL:
+ {`http://localhost:3000/apps/${slug}`}
+
+
+ Name:
+ {name}
+
+
+ Description:
+ {description}
+
+
+ Category:
+ {category}
+
+
+ Publisher Name:
+ {publisher}
+
+
+ Publisher Email:
+ {email}
+
+
+
+ )}
+
+ Note: You should not rename app directory manually. Use cli only to do that as it needs to be
+ updated in DB as well
+
+
+ );
+ }
+ if (slug && slug !== givenSlug && fs.existsSync(getAppDirPath(slug, isTemplate))) {
+ validationResult = {
+ text: `${
+ action === "create" ? "App" : "Template"
+ } with slug ${slug} already exists. If you want to edit it, use edit command`,
+ type: "error",
+ };
+
+ if (slugFinalized) {
+ return ;
+ }
+ }
+ const selectedOptionIndex =
+ field?.type === "select" ? field?.options?.findIndex((o) => o.value === fieldValue) : 0;
+ return (
+
+
+ {isEditAction ? (
+
+ ) : (
+
+ )}
+
+ {`${fieldLabel}`}
+ {field?.type == "text" ? (
+ {
+ if (!value && !field.optional) {
+ return;
+ }
+ setSlugFinalized(true);
+ setInputIndex((index) => {
+ return index + 1;
+ });
+ }}
+ onChange={(value) => {
+ setAppInputData((appInputData) => {
+ return {
+ ...appInputData,
+ [fieldName]: value,
+ };
+ });
+ }}
+ />
+ ) : (
+
+ items={field?.options}
+ itemComponent={(item) => {
+ const myItem = item as { value: string; label: string };
+ return (
+
+
+ {myItem.value}:
+
+ {item.label}
+
+ );
+ }}
+ key={fieldName}
+ initialIndex={selectedOptionIndex === -1 ? 0 : selectedOptionIndex}
+ onSelect={(item) => {
+ setAppInputData((appInputData) => {
+ return {
+ ...appInputData,
+ [fieldName]: item.value,
+ };
+ });
+ setInputIndex((index) => {
+ return index + 1;
+ });
+ }}
+ />
+ )}
+
+
+ {validationResult ? (
+
+ ) : (
+
+ {field?.explainer}
+
+ )}
+
+
+
+ );
+};
diff --git a/packages/app-store-cli/src/components/DeleteForm.tsx b/packages/app-store-cli/src/components/DeleteForm.tsx
new file mode 100644
index 0000000000..b1a3768f8c
--- /dev/null
+++ b/packages/app-store-cli/src/components/DeleteForm.tsx
@@ -0,0 +1,109 @@
+import { Text } from "ink";
+import TextInput from "ink-text-input";
+import React, { useEffect, useState } from "react";
+
+import { ImportantText } from "../components/ImportantText";
+import { Message } from "../components/Message";
+import { BaseAppFork, Seed, generateAppFiles } from "../core";
+import { getApp } from "../utils/getApp";
+
+export default function DeleteForm({ slug, action }: { slug: string; action: "delete" | "delete-template" }) {
+ const [confirmedAppSlug, setConfirmedAppSlug] = useState("");
+ const [state, setState] = useState<
+ | "INITIALIZED"
+ | "DELETION_CONFIRMATION_FAILED"
+ | "DELETION_CONFIRMATION_SUCCESSFUL"
+ | "DELETION_COMPLETED"
+ | "APP_NOT_EXISTS"
+ >("INITIALIZED");
+ const isTemplate = action === "delete-template";
+ const app = getApp(slug, isTemplate);
+ useEffect(() => {
+ if (!app) {
+ setState("APP_NOT_EXISTS");
+ }
+ }, []);
+
+ useEffect(() => {
+ if (state === "DELETION_CONFIRMATION_SUCCESSFUL") {
+ (async () => {
+ await BaseAppFork.delete({ slug, isTemplate });
+ Seed.revert({ slug });
+ await generateAppFiles();
+ // successMsg({ text: `App with slug ${slug} has been deleted`, done: true });
+ setState("DELETION_COMPLETED");
+ })();
+ }
+ }, [slug, state]);
+
+ if (state === "INITIALIZED") {
+ return (
+ <>
+
+ Type below the slug of the {isTemplate ? "Template" : "App"} that you want to delete.
+
+
+ It would cleanup the app directory and App table and Credential table.
+
+ {
+ if (value === slug) {
+ setState("DELETION_CONFIRMATION_SUCCESSFUL");
+ } else {
+ setState("DELETION_CONFIRMATION_FAILED");
+ }
+ }}
+ onChange={(val) => {
+ setConfirmedAppSlug(val);
+ }}
+ />
+ >
+ );
+ }
+ if (state === "APP_NOT_EXISTS") {
+ return (
+
+ );
+ }
+ if (state === "DELETION_CONFIRMATION_SUCCESSFUL") {
+ return (
+
+ );
+ }
+
+ if (state === "DELETION_COMPLETED") {
+ return (
+
+ );
+ }
+ if (state === "DELETION_CONFIRMATION_FAILED") {
+ return (
+
+ );
+ }
+ return null;
+}
diff --git a/packages/app-store-cli/src/components/ImportantText.tsx b/packages/app-store-cli/src/components/ImportantText.tsx
new file mode 100644
index 0000000000..7920a6ab9b
--- /dev/null
+++ b/packages/app-store-cli/src/components/ImportantText.tsx
@@ -0,0 +1,6 @@
+import { Text } from "ink";
+import React from "react";
+
+export function ImportantText({ children }: { children: React.ReactNode }) {
+ return {children} ;
+}
diff --git a/packages/app-store-cli/src/components/Label.tsx b/packages/app-store-cli/src/components/Label.tsx
new file mode 100644
index 0000000000..c3288bf138
--- /dev/null
+++ b/packages/app-store-cli/src/components/Label.tsx
@@ -0,0 +1,11 @@
+import { Box, Text } from "ink";
+import React from "react";
+
+export default function Label({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+ :
+
+ );
+}
diff --git a/packages/app-store-cli/src/components/Message.tsx b/packages/app-store-cli/src/components/Message.tsx
new file mode 100644
index 0000000000..949275a875
--- /dev/null
+++ b/packages/app-store-cli/src/components/Message.tsx
@@ -0,0 +1,29 @@
+import { Text } from "ink";
+import React, { useEffect, useState } from "react";
+
+export function Message({
+ message,
+}: {
+ message: { text: string; type?: "info" | "error" | "success"; showInProgressIndicator?: boolean };
+}) {
+ const color = message.type === "success" ? "green" : message.type === "error" ? "red" : "white";
+ const [progressText, setProgressText] = useState("...");
+ useEffect(() => {
+ if (message.showInProgressIndicator) {
+ const interval = setInterval(() => {
+ setProgressText((progressText) => {
+ return progressText.length > 3 ? "" : progressText + ".";
+ });
+ }, 1000);
+ return () => {
+ clearInterval(interval);
+ };
+ }
+ }, [message.showInProgressIndicator]);
+ return (
+
+ {message.text}
+ {message.showInProgressIndicator && progressText}
+
+ );
+}
diff --git a/packages/app-store-cli/src/constants.ts b/packages/app-store-cli/src/constants.ts
new file mode 100644
index 0000000000..500c973154
--- /dev/null
+++ b/packages/app-store-cli/src/constants.ts
@@ -0,0 +1,4 @@
+import path from "path";
+
+export const APP_STORE_PATH = path.join(__dirname, "..", "..", "app-store");
+export const TEMPLATES_PATH = path.join(APP_STORE_PATH, "templates");
diff --git a/packages/app-store-cli/src/core.ts b/packages/app-store-cli/src/core.ts
new file mode 100644
index 0000000000..a38d525cf0
--- /dev/null
+++ b/packages/app-store-cli/src/core.ts
@@ -0,0 +1,192 @@
+import fs from "fs";
+import path from "path";
+
+import seedAppStoreConfig from "@calcom/prisma/seed-app-store.config.json";
+
+import { APP_STORE_PATH, TEMPLATES_PATH } from "./constants";
+import execSync from "./utils/execSync";
+
+const slugify = (str: string) => {
+ // A valid dir name
+ // A valid URL path
+ // It is okay to not be a valid variable name. This is so that we can use hyphens which look better then underscores in URL and as directory name
+ return str.replace(/[^a-zA-Z0-9]/g, "-").toLowerCase();
+};
+
+export function getSlugFromAppName(appName: string): string {
+ if (!appName) {
+ return appName;
+ }
+ return slugify(appName);
+}
+
+export function getAppDirPath(slug: string, isTemplate: boolean) {
+ if (!isTemplate) {
+ return path.join(APP_STORE_PATH, `${slug}`);
+ }
+ return path.join(TEMPLATES_PATH, `${slug}`);
+}
+
+function absolutePath(appRelativePath: string) {
+ return path.join(APP_STORE_PATH, appRelativePath);
+}
+
+const updatePackageJson = ({
+ slug,
+ appDescription,
+ appDirPath,
+}: {
+ slug: string;
+ appDescription: string;
+ appDirPath: string;
+}) => {
+ const packageJsonConfig = JSON.parse(fs.readFileSync(`${appDirPath}/package.json`).toString());
+ packageJsonConfig.name = `@calcom/${slug}`;
+ packageJsonConfig.description = appDescription;
+ // packageJsonConfig.description = `@calcom/${appName}`;
+ fs.writeFileSync(`${appDirPath}/package.json`, JSON.stringify(packageJsonConfig, null, 2));
+};
+
+const workspaceDir = path.resolve(__dirname, "..", "..", "..");
+
+export const BaseAppFork = {
+ create: async function ({
+ category,
+ editMode = false,
+ description,
+ name,
+ slug,
+ publisher,
+ email,
+ template,
+ isTemplate,
+ oldSlug,
+ }: {
+ category: string;
+ editMode?: boolean;
+ description: string;
+ name: string;
+ slug: string;
+ publisher: string;
+ email: string;
+ template: string;
+ isTemplate: boolean;
+ oldSlug?: string;
+ }) {
+ const appDirPath = getAppDirPath(slug, isTemplate);
+ if (!editMode) {
+ await execSync(`mkdir -p ${appDirPath}`);
+ await execSync(`cp -r ${TEMPLATES_PATH}/${template}/* ${appDirPath}`);
+ } else {
+ if (!oldSlug) {
+ throw new Error("oldSlug is required when editMode is true");
+ }
+ if (oldSlug !== slug) {
+ // We need to rename only if they are different
+ const oldAppDirPath = getAppDirPath(oldSlug, isTemplate);
+
+ await execSync(`mv ${oldAppDirPath} ${appDirPath}`);
+ }
+ }
+ updatePackageJson({ slug, appDirPath, appDescription: description });
+
+ const categoryToVariantMap = {
+ video: "conferencing",
+ };
+
+ let config = {
+ name: name,
+ // Plan to remove it. DB already has it and name of dir is also the same.
+ slug: slug,
+ type: `${slug}_${category}`,
+ // TODO: Remove usage of imageSrc, it is being used in ConnectCalendars.tsx. After that delete imageSrc in all configs and from here
+ imageSrc: `icon.svg`,
+ logo: `icon.svg`,
+ variant: categoryToVariantMap[category as keyof typeof categoryToVariantMap] || category,
+ categories: [category],
+ publisher: publisher,
+ email: email,
+ description: description,
+ // TODO: Use this to avoid edit and delete on the apps created outside of cli
+ __createdUsingCli: true,
+ isTemplate,
+ // Store the template used to create an app
+ __template: template,
+ };
+ const currentConfig = JSON.parse(fs.readFileSync(`${appDirPath}/config.json`).toString());
+ config = {
+ ...currentConfig,
+ ...config,
+ };
+ fs.writeFileSync(`${appDirPath}/config.json`, JSON.stringify(config, null, 2));
+ fs.writeFileSync(
+ `${appDirPath}/DESCRIPTION.md`,
+ fs
+ .readFileSync(`${appDirPath}/DESCRIPTION.md`)
+ .toString()
+ .replace(/_DESCRIPTION_/g, description)
+ .replace(/_APP_DIR_/g, slug)
+ );
+ },
+
+ delete: async function ({ slug, isTemplate }: { slug: string; isTemplate: boolean }) {
+ const appDirPath = getAppDirPath(slug, isTemplate);
+ await execSync(`rm -rf ${appDirPath}`);
+ },
+};
+
+export const Seed = {
+ seedConfigPath: absolutePath("../prisma/seed-app-store.config.json"),
+ update: async function ({
+ slug,
+ category,
+ oldSlug,
+ isTemplate,
+ }: {
+ slug: string;
+ category: string;
+ oldSlug: string;
+ isTemplate: boolean;
+ }) {
+ let configContent = "[]";
+ try {
+ if (fs.statSync(this.seedConfigPath)) {
+ configContent = fs.readFileSync(this.seedConfigPath).toString();
+ }
+ } catch (e) {}
+
+ let seedConfig: typeof seedAppStoreConfig = JSON.parse(configContent);
+ seedConfig = seedConfig.filter((app) => app.slug !== oldSlug);
+
+ if (!seedConfig.find((app) => app.slug === slug)) {
+ seedConfig.push({
+ dirName: slug,
+ categories: [category],
+ slug: slug,
+ type: `${slug}_${category}`,
+ isTemplate: isTemplate,
+ });
+ }
+
+ // Add the message as a property to first item so that it stays always at the top
+ seedConfig[0]["/*"] =
+ "This file is auto-generated and updated by `yarn app-store create/edit`. Don't edit it manually";
+
+ // Add the message as a property to first item so that it stays always at the top
+ seedConfig[0]["/*"] =
+ "This file is auto-generated and updated by `yarn app-store create/edit`. Don't edit it manually";
+
+ fs.writeFileSync(this.seedConfigPath, JSON.stringify(seedConfig, null, 2));
+ await execSync(`cd ${workspaceDir}/packages/prisma && yarn seed-app-store seed-templates`);
+ },
+ revert: async function ({ slug }: { slug: string }) {
+ let seedConfig: typeof seedAppStoreConfig = JSON.parse(fs.readFileSync(this.seedConfigPath).toString());
+ seedConfig = seedConfig.filter((app) => app.slug !== slug);
+ fs.writeFileSync(this.seedConfigPath, JSON.stringify(seedConfig, null, 2));
+ await execSync(`yarn workspace @calcom/prisma delete-app ${slug}`);
+ },
+};
+
+export const generateAppFiles = async () => {
+ await execSync(`yarn ts-node --transpile-only src/build.ts`);
+};
diff --git a/packages/app-store-cli/src/execSync.ts b/packages/app-store-cli/src/execSync.ts
deleted file mode 100644
index 807fbd7e31..0000000000
--- a/packages/app-store-cli/src/execSync.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import child_process from "child_process";
-
-const execSync = (cmd: string) => {
- if (process.env.DEBUG === "1") {
- console.log(`${process.cwd()}$: ${cmd}`);
- }
- const result = child_process.execSync(cmd).toString();
- if (process.env.DEBUG === "1") {
- console.log(result);
- }
- return cmd;
-};
-export default execSync;
diff --git a/packages/app-store-cli/src/types.d.ts b/packages/app-store-cli/src/types.d.ts
new file mode 100644
index 0000000000..b1a3366c4d
--- /dev/null
+++ b/packages/app-store-cli/src/types.d.ts
@@ -0,0 +1,7 @@
+export type SupportedCommands =
+ | "create"
+ | "edit"
+ | "delete"
+ | "create-template"
+ | "delete-template"
+ | "edit-template";
diff --git a/packages/app-store-cli/src/utils/execSync.ts b/packages/app-store-cli/src/utils/execSync.ts
new file mode 100644
index 0000000000..dce49a2ef6
--- /dev/null
+++ b/packages/app-store-cli/src/utils/execSync.ts
@@ -0,0 +1,26 @@
+import child_process from "child_process";
+
+const execSync = async (cmd: string) => {
+ const silent = process.env.DEBUG === "1" ? false : true;
+ if (!silent) {
+ console.log(`${process.cwd()}$: ${cmd}`);
+ }
+ const result: string = await new Promise((resolve, reject) => {
+ child_process.exec(cmd, (err, stdout, stderr) => {
+ if (err) {
+ reject(err);
+ console.log(err);
+ }
+ if (stderr && !silent) {
+ console.log(stderr);
+ }
+ resolve(stdout);
+ });
+ });
+
+ if (!silent) {
+ console.log(result.toString());
+ }
+ return cmd;
+};
+export default execSync;
diff --git a/packages/app-store-cli/src/utils/getApp.ts b/packages/app-store-cli/src/utils/getApp.ts
new file mode 100644
index 0000000000..6ff3e9c4f1
--- /dev/null
+++ b/packages/app-store-cli/src/utils/getApp.ts
@@ -0,0 +1,26 @@
+import fs from "fs";
+import path from "path";
+
+import { APP_STORE_PATH, TEMPLATES_PATH } from "../constants";
+import { getAppName } from "./getAppName";
+
+export const getApp = (slug: string, isTemplate: boolean) => {
+ const base = isTemplate ? TEMPLATES_PATH : APP_STORE_PATH;
+ const foundApp = fs
+ .readdirSync(base)
+ .filter((dir) => {
+ if (fs.statSync(path.join(base, dir)).isDirectory() && getAppName(dir)) {
+ return true;
+ }
+ return false;
+ })
+ .find((appName) => appName === slug);
+ if (foundApp) {
+ try {
+ return JSON.parse(fs.readFileSync(path.join(base, foundApp, "config.json")).toString());
+ } catch (e) {
+ return {};
+ }
+ }
+ return null;
+};
diff --git a/packages/app-store-cli/src/utils/getAppName.ts b/packages/app-store-cli/src/utils/getAppName.ts
new file mode 100644
index 0000000000..396ef35b8a
--- /dev/null
+++ b/packages/app-store-cli/src/utils/getAppName.ts
@@ -0,0 +1,23 @@
+import path from "path";
+
+import { APP_STORE_PATH } from "../constants";
+
+export function getAppName(candidatePath) {
+ function isValidAppName(candidatePath) {
+ if (
+ !candidatePath.startsWith("_") &&
+ candidatePath !== "ee" &&
+ !candidatePath.includes("/") &&
+ !candidatePath.includes("\\")
+ ) {
+ return candidatePath;
+ }
+ }
+ if (isValidAppName(candidatePath)) {
+ // Already a dirname of an app
+ return candidatePath;
+ }
+ // Get dirname of app from full path
+ const dirName = path.relative(APP_STORE_PATH, candidatePath);
+ return isValidAppName(dirName) ? dirName : null;
+}
diff --git a/packages/app-store-cli/src/utils/templates.ts b/packages/app-store-cli/src/utils/templates.ts
new file mode 100644
index 0000000000..f2e786156b
--- /dev/null
+++ b/packages/app-store-cli/src/utils/templates.ts
@@ -0,0 +1,29 @@
+import fs from "fs";
+import path from "path";
+
+import { TEMPLATES_PATH } from "../constants";
+import { getAppName } from "./getAppName";
+
+const Templates = fs
+ .readdirSync(TEMPLATES_PATH)
+ .filter((dir) => {
+ if (fs.statSync(path.join(TEMPLATES_PATH, dir)).isDirectory() && getAppName(dir)) {
+ return true;
+ }
+ return false;
+ })
+ .map((dir) => {
+ try {
+ const config = JSON.parse(fs.readFileSync(path.join(TEMPLATES_PATH, dir, "config.json")).toString());
+ return {
+ label: `${config.description}`,
+ value: dir,
+ category: config.categories[0],
+ };
+ } catch (e) {
+ // config.json might not exist
+ return null;
+ }
+ })
+ .filter((item) => !!item) as { label: string; value: string; category: string }[];
+export default Templates;
diff --git a/packages/app-store-cli/tsconfig.json b/packages/app-store-cli/tsconfig.json
index abbeb20d05..5e2711b276 100644
--- a/packages/app-store-cli/tsconfig.json
+++ b/packages/app-store-cli/tsconfig.json
@@ -1,12 +1,14 @@
{
"compilerOptions": {
+ "strict": true,
"module": "commonjs",
"jsx": "react",
"esModuleInterop": true,
"outDir": "dist",
"noEmitOnError": false,
"target": "ES2020",
- "baseUrl": "."
+ "baseUrl": ".",
+ "resolveJsonModule": true
},
"include": [
"next-env.d.ts",
diff --git a/packages/app-store/BookingPageTagManager.tsx b/packages/app-store/BookingPageTagManager.tsx
index d22f1c5312..b6a2f248d1 100644
--- a/packages/app-store/BookingPageTagManager.tsx
+++ b/packages/app-store/BookingPageTagManager.tsx
@@ -1,13 +1,9 @@
import Script from "next/script";
+import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import { getEventTypeAppData } from "@calcom/app-store/utils";
-import { trackingApps } from "./eventTypeAnalytics";
-
-export type AppScript = { attrs?: Record } & (
- | { src: undefined; content?: string }
- | { src?: string; content: undefined }
-);
+import { appDataSchemas } from "./apps.schemas.generated";
export default function BookingPageTagManager({
eventType,
@@ -16,16 +12,20 @@ export default function BookingPageTagManager({
}) {
return (
<>
- {Object.entries(trackingApps).map(([appId, scriptConfig]) => {
- const trackingId = getEventTypeAppData(eventType, appId as keyof typeof trackingApps)?.trackingId;
+ {Object.entries(appStoreMetadata).map(([appId, app]) => {
+ const tag = app.appData?.tag;
+ if (!tag) {
+ return null;
+ }
+ const trackingId = getEventTypeAppData(eventType, appId as keyof typeof appDataSchemas)?.trackingId;
if (!trackingId) {
return null;
}
const parseValue = (val: T): T =>
val ? (val.replace(/\{TRACKING_ID\}/g, trackingId) as T) : val;
- return scriptConfig.scripts.map((script, index) => {
- const parsedAttributes: NonNullable = {};
+ return tag.scripts.map((script, index) => {
+ const parsedAttributes: NonNullable = {};
const attrs = script.attrs || {};
Object.entries(attrs).forEach(([name, value]) => {
if (typeof value === "string") {
diff --git a/packages/app-store/_appRegistry.ts b/packages/app-store/_appRegistry.ts
index 60c424d882..ec63be2ba4 100644
--- a/packages/app-store/_appRegistry.ts
+++ b/packages/app-store/_appRegistry.ts
@@ -1,25 +1,18 @@
+import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import prisma, { safeAppSelect, safeCredentialSelect } from "@calcom/prisma";
import { AppFrontendPayload as App } from "@calcom/types/App";
import { CredentialFrontendPayload as Credential } from "@calcom/types/Credential";
export async function getAppWithMetadata(app: { dirName: string }) {
- let appMetadata: App | null = null;
- try {
- appMetadata = (await import(`./${app.dirName}/_metadata`)).default as App;
- } catch (error) {
- try {
- appMetadata = (await import(`./ee/${app.dirName}/_metadata`)).default as App;
- } catch (e) {
- if (error instanceof Error) {
- console.error(`No metadata found for: "${app.dirName}". Message:`, error.message);
- }
- return null;
- }
- }
+ const appMetadata: App | null = appStoreMetadata[app.dirName as keyof typeof appStoreMetadata] as App;
if (!appMetadata) return null;
// Let's not leak api keys to the front end
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { key, ...metadata } = appMetadata;
+ if (metadata.logo && !metadata.logo.includes("/api/app-store/")) {
+ const appDirName = `${metadata.isTemplate ? "templates" : ""}/${app.dirName}`;
+ metadata.logo = `/api/app-store/${appDirName}/${metadata.logo}`;
+ }
return metadata;
}
@@ -62,6 +55,11 @@ export async function getAppRegistryWithCredentials(userId: number) {
select: safeCredentialSelect,
},
},
+ orderBy: {
+ credentials: {
+ _count: "desc",
+ },
+ },
});
const apps = [] as (App & {
credentials: Credential[];
diff --git a/packages/app-store/_baseApp/DESCRIPTION.md b/packages/app-store/_baseApp/DESCRIPTION.md
deleted file mode 100644
index 47afcfe654..0000000000
--- a/packages/app-store/_baseApp/DESCRIPTION.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-description: _DESCRIPTION_
-items:
- - /api/app-store/_APP_DIR_/1.jpg
- - /api/app-store/_APP_DIR_/2.jpg
- - /api/app-store/_APP_DIR_/3.jpg
----
-
-_DESCRIPTION_
diff --git a/packages/app-store/_baseApp/_metadata.ts b/packages/app-store/_baseApp/_metadata.ts
deleted file mode 100644
index 9c7f2aa320..0000000000
--- a/packages/app-store/_baseApp/_metadata.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import type { AppMeta } from "@calcom/types/App";
-
-import config from "./config.json";
-
-export const metadata = {
- category: "other",
- ...config,
-} as AppMeta;
-
-export default metadata;
diff --git a/packages/app-store/_baseApp/config.json b/packages/app-store/_baseApp/config.json
deleted file mode 100644
index 74be1674b4..0000000000
--- a/packages/app-store/_baseApp/config.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "/*": "This file would be automatically updated by cli according to the inputs"
-}
diff --git a/packages/app-store/_baseApp/index.ts b/packages/app-store/_baseApp/index.ts
deleted file mode 100644
index 5d372ceda3..0000000000
--- a/packages/app-store/_baseApp/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * as api from "./api";
-export { metadata } from "./_metadata";
diff --git a/packages/app-store/_baseApp/static/1.jpg b/packages/app-store/_baseApp/static/1.jpg
deleted file mode 100644
index 3ef5a741ed..0000000000
Binary files a/packages/app-store/_baseApp/static/1.jpg and /dev/null differ
diff --git a/packages/app-store/_baseApp/static/2.jpg b/packages/app-store/_baseApp/static/2.jpg
deleted file mode 100644
index cbba9b938e..0000000000
Binary files a/packages/app-store/_baseApp/static/2.jpg and /dev/null differ
diff --git a/packages/app-store/_baseApp/static/3.jpg b/packages/app-store/_baseApp/static/3.jpg
deleted file mode 100644
index cbba9b938e..0000000000
Binary files a/packages/app-store/_baseApp/static/3.jpg and /dev/null differ
diff --git a/packages/app-store/_baseApp/static/icon.svg b/packages/app-store/_baseApp/static/icon.svg
deleted file mode 100644
index 059dfae262..0000000000
--- a/packages/app-store/_baseApp/static/icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/app-store/_components/DynamicComponent.tsx b/packages/app-store/_components/DynamicComponent.tsx
index 26ca507292..6d216e9959 100644
--- a/packages/app-store/_components/DynamicComponent.tsx
+++ b/packages/app-store/_components/DynamicComponent.tsx
@@ -4,10 +4,12 @@ export function DynamicComponent>(props: {
wrapperClassName?: string;
}) {
const { componentMap, slug, ...rest } = props;
+ const dirName = slug === "stripe" ? "stripepayment" : slug;
+ // There can be apps with no matching component
if (!componentMap[slug]) return null;
- const Component = componentMap[slug];
+ const Component = componentMap[dirName];
return (
diff --git a/packages/app-store/_components/EventTypeAppCardInterface.tsx b/packages/app-store/_components/EventTypeAppCardInterface.tsx
new file mode 100644
index 0000000000..0c9b8fc08a
--- /dev/null
+++ b/packages/app-store/_components/EventTypeAppCardInterface.tsx
@@ -0,0 +1,23 @@
+import EventTypeAppContext, { GetAppData, SetAppData } from "@calcom/app-store/EventTypeAppContext";
+import { EventTypeAddonMap } from "@calcom/app-store/apps.browser.generated";
+import { RouterOutputs } from "@calcom/trpc/react";
+import { ErrorBoundary } from "@calcom/ui";
+
+import { EventTypeAppCardComponentProps } from "../types";
+import { DynamicComponent } from "./DynamicComponent";
+
+export const EventTypeAppCard = (props: {
+ app: RouterOutputs["viewer"]["apps"][number];
+ eventType: EventTypeAppCardComponentProps["eventType"];
+ getAppData: GetAppData;
+ setAppData: SetAppData;
+}) => {
+ const { app, getAppData, setAppData } = props;
+ return (
+
+
+
+
+
+ );
+};
diff --git a/packages/app-store/_example/_metadata.ts b/packages/app-store/_example/_metadata.ts
deleted file mode 100644
index 39e5d653db..0000000000
--- a/packages/app-store/_example/_metadata.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import type { AppMeta } 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: "/api/app-store/_example/icon.svg",
- logo: "/api/app-store/_example/icon.svg",
- 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 AppMeta;
-
-export default metadata;
diff --git a/packages/app-store/_example/api/example.ts b/packages/app-store/_example/api/example.ts
deleted file mode 100644
index 38dc4766ac..0000000000
--- a/packages/app-store/_example/api/example.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import type { NextApiRequest, NextApiResponse } from "next";
-
-/**
- * This is an example endpoint 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
deleted file mode 100644
index c10a1b92b3..0000000000
--- a/packages/app-store/_example/api/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as example } from "./example";
diff --git a/packages/app-store/_example/components/InstallAppButton.tsx b/packages/app-store/_example/components/InstallAppButton.tsx
deleted file mode 100644
index 4316d0b4af..0000000000
--- a/packages/app-store/_example/components/InstallAppButton.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
index 0d6008d4ca..0000000000
--- a/packages/app-store/_example/components/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as InstallAppButton } from "./InstallAppButton";
diff --git a/packages/app-store/_example/index.ts b/packages/app-store/_example/index.ts
deleted file mode 100644
index 5373eb04ef..0000000000
--- a/packages/app-store/_example/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * as api from "./api";
-export * as lib from "./lib";
-export { metadata } from "./_metadata";
diff --git a/packages/app-store/_example/lib/VideoApiAdapter.ts b/packages/app-store/_example/lib/VideoApiAdapter.ts
deleted file mode 100644
index 86609db478..0000000000
--- a/packages/app-store/_example/lib/VideoApiAdapter.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-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
deleted file mode 100644
index dc61768d60..0000000000
--- a/packages/app-store/_example/lib/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as VideoApiAdapter } from "./VideoApiAdapter";
diff --git a/packages/app-store/_example/static/icon.svg b/packages/app-store/_example/static/icon.svg
deleted file mode 100644
index d8f2d80f09..0000000000
--- a/packages/app-store/_example/static/icon.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
diff --git a/packages/app-store/amie/api/add.ts b/packages/app-store/amie/api/add.ts
index 3304d3dd57..2537562817 100644
--- a/packages/app-store/amie/api/add.ts
+++ b/packages/app-store/amie/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/amie/config.json b/packages/app-store/amie/config.json
index cc7ffcd8fd..e1b4575706 100644
--- a/packages/app-store/amie/config.json
+++ b/packages/app-store/amie/config.json
@@ -11,6 +11,5 @@
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",
"description": "The joyful productivity app\r\r",
- "extendsFeature": "User",
"__createdUsingCli": true
}
diff --git a/packages/app-store/appStoreMetaData.ts b/packages/app-store/appStoreMetaData.ts
new file mode 100644
index 0000000000..c5212788d8
--- /dev/null
+++ b/packages/app-store/appStoreMetaData.ts
@@ -0,0 +1,18 @@
+import { AppMeta } from "@calcom/types/App";
+
+import { appStoreMetadata as rawAppStoreMetadata } from "./apps.metadata.generated";
+
+type RawAppStoreMetaData = typeof rawAppStoreMetadata;
+type AppStoreMetaData = {
+ [key in keyof RawAppStoreMetaData]: AppMeta;
+};
+
+export const appStoreMetadata = {} as AppStoreMetaData;
+
+for (const [key, value] of Object.entries(rawAppStoreMetadata)) {
+ appStoreMetadata[key as keyof typeof appStoreMetadata] = {
+ appData: null,
+ __template: "",
+ ...value,
+ } as AppStoreMetaData[keyof AppStoreMetaData];
+}
diff --git a/packages/app-store/apps.browser.generated.tsx b/packages/app-store/apps.browser.generated.tsx
index 7bfb735ced..0a47322388 100644
--- a/packages/app-store/apps.browser.generated.tsx
+++ b/packages/app-store/apps.browser.generated.tsx
@@ -30,15 +30,26 @@ export const InstallAppButtonMap = {
zoomvideo: dynamic(() => import("./zoomvideo/components/InstallAppButton")),
};
export const AppSettingsComponentsMap = {
- weather_in_your_calendar: dynamic(() => import("./weather_in_your_calendar/components/AppSettings")),
- zapier: dynamic(() => import("./zapier/components/AppSettings")),
+ "general-app-settings": dynamic(() =>
+ import("./templates/general-app-settings/components/AppSettingsInterface")
+ ),
+ weather_in_your_calendar: dynamic(() =>
+ import("./weather_in_your_calendar/components/AppSettingsInterface")
+ ),
+ zapier: dynamic(() => import("./zapier/components/AppSettingsInterface")),
};
export const EventTypeAddonMap = {
- fathom: dynamic(() => import("./fathom/extensions/EventTypeAppCard")),
- ga4: dynamic(() => import("./ga4/extensions/EventTypeAppCard")),
- giphy: dynamic(() => import("./giphy/extensions/EventTypeAppCard")),
- plausible: dynamic(() => import("./plausible/extensions/EventTypeAppCard")),
- qr_code: dynamic(() => import("./qr_code/extensions/EventTypeAppCard")),
- rainbow: dynamic(() => import("./rainbow/extensions/EventTypeAppCard")),
- stripepayment: dynamic(() => import("./stripepayment/extensions/EventTypeAppCard")),
+ fathom: dynamic(() => import("./fathom/components/EventTypeAppCardInterface")),
+ ga4: dynamic(() => import("./ga4/components/EventTypeAppCardInterface")),
+ giphy: dynamic(() => import("./giphy/components/EventTypeAppCardInterface")),
+ plausible: dynamic(() => import("./plausible/components/EventTypeAppCardInterface")),
+ qr_code: dynamic(() => import("./qr_code/components/EventTypeAppCardInterface")),
+ rainbow: dynamic(() => import("./rainbow/components/EventTypeAppCardInterface")),
+ stripepayment: dynamic(() => import("./stripepayment/components/EventTypeAppCardInterface")),
+ "booking-pages-tag": dynamic(() =>
+ import("./templates/booking-pages-tag/components/EventTypeAppCardInterface")
+ ),
+ "event-type-app-card": dynamic(() =>
+ import("./templates/event-type-app-card/components/EventTypeAppCardInterface")
+ ),
};
diff --git a/packages/app-store/apps.keys-schemas.generated.ts b/packages/app-store/apps.keys-schemas.generated.ts
index 23864a1892..1ac71dc1d2 100644
--- a/packages/app-store/apps.keys-schemas.generated.ts
+++ b/packages/app-store/apps.keys-schemas.generated.ts
@@ -2,46 +2,50 @@
This file is autogenerated using the command `yarn app-store:build --watch`.
Don't modify this file manually.
**/
-import { appKeysSchema as dailyvideo_keys_schema } from "./dailyvideo/zod";
-import { appKeysSchema as routing_forms_keys_schema } from "./ee/routing-forms/zod";
-import { appKeysSchema as fathom_keys_schema } from "./fathom/zod";
-import { appKeysSchema as ga4_keys_schema } from "./ga4/zod";
-import { appKeysSchema as giphy_keys_schema } from "./giphy/zod";
-import { appKeysSchema as googlecalendar_keys_schema } from "./googlecalendar/zod";
-import { appKeysSchema as hubspot_keys_schema } from "./hubspot/zod";
-import { appKeysSchema as larkcalendar_keys_schema } from "./larkcalendar/zod";
-import { appKeysSchema as office365calendar_keys_schema } from "./office365calendar/zod";
-import { appKeysSchema as office365video_keys_schema } from "./office365video/zod";
-import { appKeysSchema as plausible_keys_schema } from "./plausible/zod";
-import { appKeysSchema as qr_code_keys_schema } from "./qr_code/zod";
-import { appKeysSchema as rainbow_keys_schema } from "./rainbow/zod";
-import { appKeysSchema as salesforce_keys_schema } from "./salesforce/zod";
-import { appKeysSchema as stripepayment_keys_schema } from "./stripepayment/zod";
-import { appKeysSchema as tandemvideo_keys_schema } from "./tandemvideo/zod";
-import { appKeysSchema as vital_keys_schema } from "./vital/zod";
-import { appKeysSchema as wordpress_keys_schema } from "./wordpress/zod";
-import { appKeysSchema as zapier_keys_schema } from "./zapier/zod";
-import { appKeysSchema as zoomvideo_keys_schema } from "./zoomvideo/zod";
+import { appKeysSchema as dailyvideo_zod_ts } from "./dailyvideo/zod";
+import { appKeysSchema as routing_forms_zod_ts } from "./ee/routing-forms/zod";
+import { appKeysSchema as fathom_zod_ts } from "./fathom/zod";
+import { appKeysSchema as ga4_zod_ts } from "./ga4/zod";
+import { appKeysSchema as giphy_zod_ts } from "./giphy/zod";
+import { appKeysSchema as googlecalendar_zod_ts } from "./googlecalendar/zod";
+import { appKeysSchema as hubspot_zod_ts } from "./hubspot/zod";
+import { appKeysSchema as larkcalendar_zod_ts } from "./larkcalendar/zod";
+import { appKeysSchema as office365calendar_zod_ts } from "./office365calendar/zod";
+import { appKeysSchema as office365video_zod_ts } from "./office365video/zod";
+import { appKeysSchema as plausible_zod_ts } from "./plausible/zod";
+import { appKeysSchema as qr_code_zod_ts } from "./qr_code/zod";
+import { appKeysSchema as rainbow_zod_ts } from "./rainbow/zod";
+import { appKeysSchema as salesforce_zod_ts } from "./salesforce/zod";
+import { appKeysSchema as stripepayment_zod_ts } from "./stripepayment/zod";
+import { appKeysSchema as tandemvideo_zod_ts } from "./tandemvideo/zod";
+import { appKeysSchema as booking_pages_tag_zod_ts } from "./templates/booking-pages-tag/zod";
+import { appKeysSchema as event_type_app_card_zod_ts } from "./templates/event-type-app-card/zod";
+import { appKeysSchema as vital_zod_ts } from "./vital/zod";
+import { appKeysSchema as wordpress_zod_ts } from "./wordpress/zod";
+import { appKeysSchema as zapier_zod_ts } from "./zapier/zod";
+import { appKeysSchema as zoomvideo_zod_ts } from "./zoomvideo/zod";
export const appKeysSchemas = {
- dailyvideo: dailyvideo_keys_schema,
- "routing-forms": routing_forms_keys_schema,
- fathom: fathom_keys_schema,
- ga4: ga4_keys_schema,
- giphy: giphy_keys_schema,
- googlecalendar: googlecalendar_keys_schema,
- hubspot: hubspot_keys_schema,
- larkcalendar: larkcalendar_keys_schema,
- office365calendar: office365calendar_keys_schema,
- office365video: office365video_keys_schema,
- plausible: plausible_keys_schema,
- qr_code: qr_code_keys_schema,
- rainbow: rainbow_keys_schema,
- salesforce: salesforce_keys_schema,
- stripe: stripepayment_keys_schema,
- tandemvideo: tandemvideo_keys_schema,
- vital: vital_keys_schema,
- wordpress: wordpress_keys_schema,
- zapier: zapier_keys_schema,
- zoomvideo: zoomvideo_keys_schema,
+ dailyvideo: dailyvideo_zod_ts,
+ "routing-forms": routing_forms_zod_ts,
+ fathom: fathom_zod_ts,
+ ga4: ga4_zod_ts,
+ giphy: giphy_zod_ts,
+ googlecalendar: googlecalendar_zod_ts,
+ hubspot: hubspot_zod_ts,
+ larkcalendar: larkcalendar_zod_ts,
+ office365calendar: office365calendar_zod_ts,
+ office365video: office365video_zod_ts,
+ plausible: plausible_zod_ts,
+ qr_code: qr_code_zod_ts,
+ rainbow: rainbow_zod_ts,
+ salesforce: salesforce_zod_ts,
+ stripe: stripepayment_zod_ts,
+ tandemvideo: tandemvideo_zod_ts,
+ "booking-pages-tag": booking_pages_tag_zod_ts,
+ "event-type-app-card": event_type_app_card_zod_ts,
+ vital: vital_zod_ts,
+ wordpress: wordpress_zod_ts,
+ zapier: zapier_zod_ts,
+ zoomvideo: zoomvideo_zod_ts,
};
diff --git a/packages/app-store/apps.metadata.generated.ts b/packages/app-store/apps.metadata.generated.ts
index 0ecf92fdb0..5bf5cf5637 100644
--- a/packages/app-store/apps.metadata.generated.ts
+++ b/packages/app-store/apps.metadata.generated.ts
@@ -2,100 +2,112 @@
This file is autogenerated using the command `yarn app-store:build --watch`.
Don't modify this file manually.
**/
-import { metadata as amie_meta } from "./amie/_metadata";
-import { metadata as applecalendar_meta } from "./applecalendar/_metadata";
-import { metadata as around_meta } from "./around/_metadata";
-import { metadata as caldavcalendar_meta } from "./caldavcalendar/_metadata";
-import { metadata as campfire_meta } from "./campfire/_metadata";
-import { metadata as closecom_meta } from "./closecom/_metadata";
-import { metadata as dailyvideo_meta } from "./dailyvideo/_metadata";
-import { metadata as routing_forms_meta } from "./ee/routing-forms/_metadata";
-import { metadata as exchange2013calendar_meta } from "./exchange2013calendar/_metadata";
-import { metadata as exchange2016calendar_meta } from "./exchange2016calendar/_metadata";
-import { metadata as exchangecalendar_meta } from "./exchangecalendar/_metadata";
-import { metadata as fathom_meta } from "./fathom/_metadata";
-import { metadata as ga4_meta } from "./ga4/_metadata";
-import { metadata as giphy_meta } from "./giphy/_metadata";
-import { metadata as googlecalendar_meta } from "./googlecalendar/_metadata";
-import { metadata as googlevideo_meta } from "./googlevideo/_metadata";
-import { metadata as hubspot_meta } from "./hubspot/_metadata";
-import { metadata as huddle01video_meta } from "./huddle01video/_metadata";
-import { metadata as jitsivideo_meta } from "./jitsivideo/_metadata";
-import { metadata as larkcalendar_meta } from "./larkcalendar/_metadata";
-import { metadata as n8n_meta } from "./n8n/_metadata";
-import { metadata as office365calendar_meta } from "./office365calendar/_metadata";
-import { metadata as office365video_meta } from "./office365video/_metadata";
-import { metadata as ping_meta } from "./ping/_metadata";
-import { metadata as pipedream_meta } from "./pipedream/_metadata";
-import { metadata as plausible_meta } from "./plausible/_metadata";
-import { metadata as qr_code_meta } from "./qr_code/_metadata";
-import { metadata as rainbow_meta } from "./rainbow/_metadata";
-import { metadata as raycast_meta } from "./raycast/_metadata";
-import { metadata as riverside_meta } from "./riverside/_metadata";
-import { metadata as salesforce_meta } from "./salesforce/_metadata";
-import { metadata as sendgrid_meta } from "./sendgrid/_metadata";
-import { metadata as signal_meta } from "./signal/_metadata";
-import { metadata as sirius_video_meta } from "./sirius_video/_metadata";
-import { metadata as stripepayment_meta } from "./stripepayment/_metadata";
-import { metadata as tandemvideo_meta } from "./tandemvideo/_metadata";
-import { metadata as telegram_meta } from "./telegram/_metadata";
-import { metadata as typeform_meta } from "./typeform/_metadata";
-import { metadata as vimcal_meta } from "./vimcal/_metadata";
-import { metadata as vital_meta } from "./vital/_metadata";
-import { metadata as weather_in_your_calendar_meta } from "./weather_in_your_calendar/_metadata";
-import { metadata as whatsapp_meta } from "./whatsapp/_metadata";
-import { metadata as whereby_meta } from "./whereby/_metadata";
-import { metadata as wipemycalother_meta } from "./wipemycalother/_metadata";
-import { metadata as wordpress_meta } from "./wordpress/_metadata";
-import { metadata as zapier_meta } from "./zapier/_metadata";
-import { metadata as zoomvideo_meta } from "./zoomvideo/_metadata";
+import amie_config_json from "./amie/config.json";
+import { metadata as applecalendar__metadata_ts } from "./applecalendar/_metadata";
+import around_config_json from "./around/config.json";
+import { metadata as caldavcalendar__metadata_ts } from "./caldavcalendar/_metadata";
+import campfire_config_json from "./campfire/config.json";
+import closecom_config_json from "./closecom/config.json";
+import { metadata as dailyvideo__metadata_ts } from "./dailyvideo/_metadata";
+import routing_forms_config_json from "./ee/routing-forms/config.json";
+import { metadata as exchange2013calendar__metadata_ts } from "./exchange2013calendar/_metadata";
+import { metadata as exchange2016calendar__metadata_ts } from "./exchange2016calendar/_metadata";
+import exchangecalendar_config_json from "./exchangecalendar/config.json";
+import fathom_config_json from "./fathom/config.json";
+import ga4_config_json from "./ga4/config.json";
+import { metadata as giphy__metadata_ts } from "./giphy/_metadata";
+import { metadata as googlecalendar__metadata_ts } from "./googlecalendar/_metadata";
+import { metadata as googlevideo__metadata_ts } from "./googlevideo/_metadata";
+import { metadata as hubspot__metadata_ts } from "./hubspot/_metadata";
+import { metadata as huddle01video__metadata_ts } from "./huddle01video/_metadata";
+import { metadata as jitsivideo__metadata_ts } from "./jitsivideo/_metadata";
+import { metadata as larkcalendar__metadata_ts } from "./larkcalendar/_metadata";
+import n8n_config_json from "./n8n/config.json";
+import { metadata as office365calendar__metadata_ts } from "./office365calendar/_metadata";
+import office365video_config_json from "./office365video/config.json";
+import ping_config_json from "./ping/config.json";
+import pipedream_config_json from "./pipedream/config.json";
+import plausible_config_json from "./plausible/config.json";
+import qr_code_config_json from "./qr_code/config.json";
+import rainbow_config_json from "./rainbow/config.json";
+import raycast_config_json from "./raycast/config.json";
+import riverside_config_json from "./riverside/config.json";
+import salesforce_config_json from "./salesforce/config.json";
+import sendgrid_config_json from "./sendgrid/config.json";
+import signal_config_json from "./signal/config.json";
+import sirius_video_config_json from "./sirius_video/config.json";
+import { metadata as stripepayment__metadata_ts } from "./stripepayment/_metadata";
+import { metadata as tandemvideo__metadata_ts } from "./tandemvideo/_metadata";
+import telegram_config_json from "./telegram/config.json";
+import basic_config_json from "./templates/basic/config.json";
+import booking_pages_tag_config_json from "./templates/booking-pages-tag/config.json";
+import event_type_app_card_config_json from "./templates/event-type-app-card/config.json";
+import event_type_location_video_static_config_json from "./templates/event-type-location-video-static/config.json";
+import general_app_settings_config_json from "./templates/general-app-settings/config.json";
+import link_as_an_app_config_json from "./templates/link-as-an-app/config.json";
+import typeform_config_json from "./typeform/config.json";
+import vimcal_config_json from "./vimcal/config.json";
+import { metadata as vital__metadata_ts } from "./vital/_metadata";
+import weather_in_your_calendar_config_json from "./weather_in_your_calendar/config.json";
+import whatsapp_config_json from "./whatsapp/config.json";
+import whereby_config_json from "./whereby/config.json";
+import { metadata as wipemycalother__metadata_ts } from "./wipemycalother/_metadata";
+import wordpress_config_json from "./wordpress/config.json";
+import { metadata as zapier__metadata_ts } from "./zapier/_metadata";
+import { metadata as zoomvideo__metadata_ts } from "./zoomvideo/_metadata";
export const appStoreMetadata = {
- amie: amie_meta,
- applecalendar: applecalendar_meta,
- around: around_meta,
- caldavcalendar: caldavcalendar_meta,
- campfire: campfire_meta,
- closecom: closecom_meta,
- dailyvideo: dailyvideo_meta,
- "routing-forms": routing_forms_meta,
- exchange2013calendar: exchange2013calendar_meta,
- exchange2016calendar: exchange2016calendar_meta,
- exchangecalendar: exchangecalendar_meta,
- fathom: fathom_meta,
- ga4: ga4_meta,
- giphy: giphy_meta,
- googlecalendar: googlecalendar_meta,
- googlevideo: googlevideo_meta,
- hubspot: hubspot_meta,
- huddle01video: huddle01video_meta,
- jitsivideo: jitsivideo_meta,
- larkcalendar: larkcalendar_meta,
- n8n: n8n_meta,
- office365calendar: office365calendar_meta,
- office365video: office365video_meta,
- ping: ping_meta,
- pipedream: pipedream_meta,
- plausible: plausible_meta,
- qr_code: qr_code_meta,
- rainbow: rainbow_meta,
- raycast: raycast_meta,
- riverside: riverside_meta,
- salesforce: salesforce_meta,
- sendgrid: sendgrid_meta,
- signal: signal_meta,
- sirius_video: sirius_video_meta,
- stripepayment: stripepayment_meta,
- tandemvideo: tandemvideo_meta,
- telegram: telegram_meta,
- typeform: typeform_meta,
- vimcal: vimcal_meta,
- vital: vital_meta,
- weather_in_your_calendar: weather_in_your_calendar_meta,
- whatsapp: whatsapp_meta,
- whereby: whereby_meta,
- wipemycalother: wipemycalother_meta,
- wordpress: wordpress_meta,
- zapier: zapier_meta,
- zoomvideo: zoomvideo_meta,
+ amie: amie_config_json,
+ applecalendar: applecalendar__metadata_ts,
+ around: around_config_json,
+ caldavcalendar: caldavcalendar__metadata_ts,
+ campfire: campfire_config_json,
+ closecom: closecom_config_json,
+ dailyvideo: dailyvideo__metadata_ts,
+ "routing-forms": routing_forms_config_json,
+ exchange2013calendar: exchange2013calendar__metadata_ts,
+ exchange2016calendar: exchange2016calendar__metadata_ts,
+ exchangecalendar: exchangecalendar_config_json,
+ fathom: fathom_config_json,
+ ga4: ga4_config_json,
+ giphy: giphy__metadata_ts,
+ googlecalendar: googlecalendar__metadata_ts,
+ googlevideo: googlevideo__metadata_ts,
+ hubspot: hubspot__metadata_ts,
+ huddle01video: huddle01video__metadata_ts,
+ jitsivideo: jitsivideo__metadata_ts,
+ larkcalendar: larkcalendar__metadata_ts,
+ n8n: n8n_config_json,
+ office365calendar: office365calendar__metadata_ts,
+ office365video: office365video_config_json,
+ ping: ping_config_json,
+ pipedream: pipedream_config_json,
+ plausible: plausible_config_json,
+ qr_code: qr_code_config_json,
+ rainbow: rainbow_config_json,
+ raycast: raycast_config_json,
+ riverside: riverside_config_json,
+ salesforce: salesforce_config_json,
+ sendgrid: sendgrid_config_json,
+ signal: signal_config_json,
+ sirius_video: sirius_video_config_json,
+ stripepayment: stripepayment__metadata_ts,
+ tandemvideo: tandemvideo__metadata_ts,
+ telegram: telegram_config_json,
+ basic: basic_config_json,
+ "booking-pages-tag": booking_pages_tag_config_json,
+ "event-type-app-card": event_type_app_card_config_json,
+ "event-type-location-video-static": event_type_location_video_static_config_json,
+ "general-app-settings": general_app_settings_config_json,
+ "link-as-an-app": link_as_an_app_config_json,
+ typeform: typeform_config_json,
+ vimcal: vimcal_config_json,
+ vital: vital__metadata_ts,
+ weather_in_your_calendar: weather_in_your_calendar_config_json,
+ whatsapp: whatsapp_config_json,
+ whereby: whereby_config_json,
+ wipemycalother: wipemycalother__metadata_ts,
+ wordpress: wordpress_config_json,
+ zapier: zapier__metadata_ts,
+ zoomvideo: zoomvideo__metadata_ts,
};
diff --git a/packages/app-store/apps.schemas.generated.ts b/packages/app-store/apps.schemas.generated.ts
index 113eeadc47..fa6858e3c5 100644
--- a/packages/app-store/apps.schemas.generated.ts
+++ b/packages/app-store/apps.schemas.generated.ts
@@ -2,46 +2,50 @@
This file is autogenerated using the command `yarn app-store:build --watch`.
Don't modify this file manually.
**/
-import { appDataSchema as dailyvideo_schema } from "./dailyvideo/zod";
-import { appDataSchema as routing_forms_schema } from "./ee/routing-forms/zod";
-import { appDataSchema as fathom_schema } from "./fathom/zod";
-import { appDataSchema as ga4_schema } from "./ga4/zod";
-import { appDataSchema as giphy_schema } from "./giphy/zod";
-import { appDataSchema as googlecalendar_schema } from "./googlecalendar/zod";
-import { appDataSchema as hubspot_schema } from "./hubspot/zod";
-import { appDataSchema as larkcalendar_schema } from "./larkcalendar/zod";
-import { appDataSchema as office365calendar_schema } from "./office365calendar/zod";
-import { appDataSchema as office365video_schema } from "./office365video/zod";
-import { appDataSchema as plausible_schema } from "./plausible/zod";
-import { appDataSchema as qr_code_schema } from "./qr_code/zod";
-import { appDataSchema as rainbow_schema } from "./rainbow/zod";
-import { appDataSchema as salesforce_schema } from "./salesforce/zod";
-import { appDataSchema as stripepayment_schema } from "./stripepayment/zod";
-import { appDataSchema as tandemvideo_schema } from "./tandemvideo/zod";
-import { appDataSchema as vital_schema } from "./vital/zod";
-import { appDataSchema as wordpress_schema } from "./wordpress/zod";
-import { appDataSchema as zapier_schema } from "./zapier/zod";
-import { appDataSchema as zoomvideo_schema } from "./zoomvideo/zod";
+import { appDataSchema as dailyvideo_zod_ts } from "./dailyvideo/zod";
+import { appDataSchema as routing_forms_zod_ts } from "./ee/routing-forms/zod";
+import { appDataSchema as fathom_zod_ts } from "./fathom/zod";
+import { appDataSchema as ga4_zod_ts } from "./ga4/zod";
+import { appDataSchema as giphy_zod_ts } from "./giphy/zod";
+import { appDataSchema as googlecalendar_zod_ts } from "./googlecalendar/zod";
+import { appDataSchema as hubspot_zod_ts } from "./hubspot/zod";
+import { appDataSchema as larkcalendar_zod_ts } from "./larkcalendar/zod";
+import { appDataSchema as office365calendar_zod_ts } from "./office365calendar/zod";
+import { appDataSchema as office365video_zod_ts } from "./office365video/zod";
+import { appDataSchema as plausible_zod_ts } from "./plausible/zod";
+import { appDataSchema as qr_code_zod_ts } from "./qr_code/zod";
+import { appDataSchema as rainbow_zod_ts } from "./rainbow/zod";
+import { appDataSchema as salesforce_zod_ts } from "./salesforce/zod";
+import { appDataSchema as stripepayment_zod_ts } from "./stripepayment/zod";
+import { appDataSchema as tandemvideo_zod_ts } from "./tandemvideo/zod";
+import { appDataSchema as booking_pages_tag_zod_ts } from "./templates/booking-pages-tag/zod";
+import { appDataSchema as event_type_app_card_zod_ts } from "./templates/event-type-app-card/zod";
+import { appDataSchema as vital_zod_ts } from "./vital/zod";
+import { appDataSchema as wordpress_zod_ts } from "./wordpress/zod";
+import { appDataSchema as zapier_zod_ts } from "./zapier/zod";
+import { appDataSchema as zoomvideo_zod_ts } from "./zoomvideo/zod";
export const appDataSchemas = {
- dailyvideo: dailyvideo_schema,
- "routing-forms": routing_forms_schema,
- fathom: fathom_schema,
- ga4: ga4_schema,
- giphy: giphy_schema,
- googlecalendar: googlecalendar_schema,
- hubspot: hubspot_schema,
- larkcalendar: larkcalendar_schema,
- office365calendar: office365calendar_schema,
- office365video: office365video_schema,
- plausible: plausible_schema,
- qr_code: qr_code_schema,
- rainbow: rainbow_schema,
- salesforce: salesforce_schema,
- stripe: stripepayment_schema,
- tandemvideo: tandemvideo_schema,
- vital: vital_schema,
- wordpress: wordpress_schema,
- zapier: zapier_schema,
- zoomvideo: zoomvideo_schema,
+ dailyvideo: dailyvideo_zod_ts,
+ "routing-forms": routing_forms_zod_ts,
+ fathom: fathom_zod_ts,
+ ga4: ga4_zod_ts,
+ giphy: giphy_zod_ts,
+ googlecalendar: googlecalendar_zod_ts,
+ hubspot: hubspot_zod_ts,
+ larkcalendar: larkcalendar_zod_ts,
+ office365calendar: office365calendar_zod_ts,
+ office365video: office365video_zod_ts,
+ plausible: plausible_zod_ts,
+ qr_code: qr_code_zod_ts,
+ rainbow: rainbow_zod_ts,
+ salesforce: salesforce_zod_ts,
+ stripe: stripepayment_zod_ts,
+ tandemvideo: tandemvideo_zod_ts,
+ "booking-pages-tag": booking_pages_tag_zod_ts,
+ "event-type-app-card": event_type_app_card_zod_ts,
+ vital: vital_zod_ts,
+ wordpress: wordpress_zod_ts,
+ zapier: zapier_zod_ts,
+ zoomvideo: zoomvideo_zod_ts,
};
diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts
index 71d7faa024..66ed6541b8 100644
--- a/packages/app-store/apps.server.generated.ts
+++ b/packages/app-store/apps.server.generated.ts
@@ -39,6 +39,12 @@ export const apiHandlers = {
stripepayment: import("./stripepayment/api"),
tandemvideo: import("./tandemvideo/api"),
telegram: import("./telegram/api"),
+ basic: import("./templates/basic/api"),
+ "booking-pages-tag": import("./templates/booking-pages-tag/api"),
+ "event-type-app-card": import("./templates/event-type-app-card/api"),
+ "event-type-location-video-static": import("./templates/event-type-location-video-static/api"),
+ "general-app-settings": import("./templates/general-app-settings/api"),
+ "link-as-an-app": import("./templates/link-as-an-app/api"),
typeform: import("./typeform/api"),
vimcal: import("./vimcal/api"),
vital: import("./vital/api"),
diff --git a/packages/app-store/campfire/api/add.ts b/packages/app-store/campfire/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/campfire/api/add.ts
+++ b/packages/app-store/campfire/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/ee/routing-forms/api/add.ts b/packages/app-store/ee/routing-forms/api/add.ts
index 9b5bf2bc17..30cedc3f81 100644
--- a/packages/app-store/ee/routing-forms/api/add.ts
+++ b/packages/app-store/ee/routing-forms/api/add.ts
@@ -4,7 +4,6 @@ import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/ee/routing-forms/components/FormActions.tsx b/packages/app-store/ee/routing-forms/components/FormActions.tsx
index f50ce25bb9..fa245ea4af 100644
--- a/packages/app-store/ee/routing-forms/components/FormActions.tsx
+++ b/packages/app-store/ee/routing-forms/components/FormActions.tsx
@@ -159,7 +159,7 @@ export const FormActionsDropdown = ({ form, children }: { form: RoutingForm; chi
@@ -105,7 +105,7 @@ const Actions = ({
routingForm={form}
action="embed"
color="secondary"
- size="icon"
+ variant="icon"
StartIcon={Icon.FiCode}
tooltip={t("embed")}
/>
@@ -114,7 +114,7 @@ const Actions = ({
routingForm={form}
action="_delete"
// className="mr-3"
- size="icon"
+ variant="icon"
StartIcon={Icon.FiTrash}
color="secondary"
type="button"
diff --git a/packages/app-store/ee/routing-forms/pages/forms/[...appPages].tsx b/packages/app-store/ee/routing-forms/pages/forms/[...appPages].tsx
index aa9fa79175..c63f6098e4 100644
--- a/packages/app-store/ee/routing-forms/pages/forms/[...appPages].tsx
+++ b/packages/app-store/ee/routing-forms/pages/forms/[...appPages].tsx
@@ -36,7 +36,7 @@ export default function RoutingForms({
function NewFormButton() {
return (
@@ -96,7 +96,7 @@ export default function RoutingForms({
routingForm={form}
action="copyLink"
color="secondary"
- size="icon"
+ variant="icon"
StartIcon={Icon.FiLink}
disabled={disabled}
tooltip={t("copy_link_to_form")}
diff --git a/packages/app-store/eventTypeAnalytics.ts b/packages/app-store/eventTypeAnalytics.ts
deleted file mode 100644
index 58ff75b599..0000000000
--- a/packages/app-store/eventTypeAnalytics.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { AppScript } from "./BookingPageTagManager";
-import { appDataSchemas } from "./apps.schemas.generated";
-
-// TODO: This config might be imported from {APP}/eventTypeAnalytics.ts.
-export const trackingApps: Partial<
- Record<
- keyof typeof appDataSchemas,
- {
- scripts: AppScript[];
- }
- >
-> = {
- fathom: {
- scripts: [
- {
- src: "https://cdn.usefathom.com/script.js",
- content: undefined,
- attrs: {
- "data-site": "{TRACKING_ID}",
- },
- },
- ],
- },
- plausible: {
- scripts: [
- {
- src: "https://plausible.io/js/script.js",
- content: undefined,
- attrs: {
- "data-domain": "{TRACKED_DOMAIN}",
- },
- },
- ],
- },
- ga4: {
- scripts: [
- {
- src: "https://www.googletagmanager.com/gtag/js?id={TRACKING_ID}",
- content: undefined,
- attrs: {},
- },
- {
- src: undefined,
- content: `
- window.dataLayer = window.dataLayer || [];
- function gtag(){dataLayer.push(arguments);}
- gtag('js', new Date());
- gtag('config', '{TRACKING_ID}');
- `,
- },
- ],
- },
-};
diff --git a/packages/app-store/eventTypeAppCardZod.ts b/packages/app-store/eventTypeAppCardZod.ts
index 8bfa059cfa..a41b2e45c5 100644
--- a/packages/app-store/eventTypeAppCardZod.ts
+++ b/packages/app-store/eventTypeAppCardZod.ts
@@ -4,3 +4,5 @@ import { z } from "zod";
export const eventTypeAppCardZod = z.object({
enabled: z.boolean().optional(),
});
+
+export const appKeysSchema = z.object({});
diff --git a/packages/app-store/fathom/api/add.ts b/packages/app-store/fathom/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/fathom/api/add.ts
+++ b/packages/app-store/fathom/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/fathom/extensions/EventTypeAppCard.tsx b/packages/app-store/fathom/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/fathom/extensions/EventTypeAppCard.tsx
rename to packages/app-store/fathom/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/fathom/config.json b/packages/app-store/fathom/config.json
index 742f56e84a..435053f0f9 100644
--- a/packages/app-store/fathom/config.json
+++ b/packages/app-store/fathom/config.json
@@ -11,6 +11,18 @@
"publisher": "Cal.com, Inc.",
"email": "help@cal.com",
"extendsFeature": "EventType",
+ "appData": {
+ "tag": {
+ "scripts": [
+ {
+ "src": "https://cdn.usefathom.com/script.js",
+ "attrs": {
+ "data-site": "{TRACKING_ID}"
+ }
+ }
+ ]
+ }
+ },
"description": "Fathom Analytics provides simple, privacy-focused website analytics. We're a GDPR-compliant, Google Analytics alternative.",
"__createdUsingCli": true
}
diff --git a/packages/app-store/ga4/api/add.ts b/packages/app-store/ga4/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/ga4/api/add.ts
+++ b/packages/app-store/ga4/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/ga4/extensions/EventTypeAppCard.tsx b/packages/app-store/ga4/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/ga4/extensions/EventTypeAppCard.tsx
rename to packages/app-store/ga4/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/ga4/config.json b/packages/app-store/ga4/config.json
index 5f8b4d3146..d614bdaad8 100644
--- a/packages/app-store/ga4/config.json
+++ b/packages/app-store/ga4/config.json
@@ -12,5 +12,16 @@
"email": "support@cal.com",
"description": "Google Analytics is a web analytics service offered by Google that tracks and reports website traffic, currently as a platform inside the Google Marketing Platform brand.",
"extendsFeature": "EventType",
+ "tag": {
+ "scripts": [
+ {
+ "src": "https://www.googletagmanager.com/gtag/js?id={TRACKING_ID}",
+ "attrs": {}
+ },
+ {
+ "content": "window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '{TRACKING_ID}');"
+ }
+ ]
+ },
"__createdUsingCli": true
}
diff --git a/packages/app-store/giphy/extensions/EventTypeAppCard.tsx b/packages/app-store/giphy/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/giphy/extensions/EventTypeAppCard.tsx
rename to packages/app-store/giphy/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/locations.ts b/packages/app-store/locations.ts
index 7b7efaab88..daecdc69f3 100644
--- a/packages/app-store/locations.ts
+++ b/packages/app-store/locations.ts
@@ -1,11 +1,11 @@
import { BookingStatus } from "@prisma/client";
import type { TFunction } from "next-i18next";
+import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import logger from "@calcom/lib/logger";
import { Ensure, Optional } from "@calcom/types/utils";
import type { EventLocationTypeFromAppMeta } from "../types/App";
-import { appStoreMetadata } from "./apps.metadata.generated";
export type DefaultEventLocationType = {
default: true;
@@ -142,6 +142,14 @@ const locationsFromApps: EventLocationTypeFromApp[] = [];
for (const [appName, meta] of Object.entries(appStoreMetadata)) {
const location = meta.appData?.location;
if (location) {
+ // TODO: This template variable replacement should happen once during app-store:build.
+ for (const [key, value] of Object.entries(location)) {
+ if (typeof value === "string") {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ location[key] = value.replace(/{SLUG}/g, meta.slug).replace(/{TITLE}/g, meta.name);
+ }
+ }
const newLocation = {
...location,
messageForOrganizer: location.messageForOrganizer || `Set ${location.label} link`,
diff --git a/packages/app-store/n8n/api/add.ts b/packages/app-store/n8n/api/add.ts
index 039ac60e87..b4c95f1426 100644
--- a/packages/app-store/n8n/api/add.ts
+++ b/packages/app-store/n8n/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/pipedream/api/add.ts b/packages/app-store/pipedream/api/add.ts
index 8ecf1ce2a3..3b4b5384ef 100644
--- a/packages/app-store/pipedream/api/add.ts
+++ b/packages/app-store/pipedream/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/pipedream/config.json b/packages/app-store/pipedream/config.json
index 77205a2951..a696fa49d1 100644
--- a/packages/app-store/pipedream/config.json
+++ b/packages/app-store/pipedream/config.json
@@ -11,6 +11,5 @@
"publisher": "Pipedream, Inc.",
"email": "support@pipedream.com",
"description": "Connect APIs, remarkably fast. Stop writing boilerplate code, struggling with authentication and managing infrastructure. Start connecting APIs with code-level control when you need it — and no code when you don't",
- "extendsFeature": "User",
"__createdUsingCli": true
}
diff --git a/packages/app-store/plausible/api/add.ts b/packages/app-store/plausible/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/plausible/api/add.ts
+++ b/packages/app-store/plausible/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/plausible/extensions/EventTypeAppCard.tsx b/packages/app-store/plausible/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/plausible/extensions/EventTypeAppCard.tsx
rename to packages/app-store/plausible/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/plausible/config.json b/packages/app-store/plausible/config.json
index f514b7172c..afe469d189 100644
--- a/packages/app-store/plausible/config.json
+++ b/packages/app-store/plausible/config.json
@@ -11,6 +11,16 @@
"publisher": "Cal.com, Inc.",
"email": "help@cal.com",
"extendsFeature": "EventType",
+ "tag": {
+ "scripts": [
+ {
+ "src": "https://plausible.io/js/script.js",
+ "attrs": {
+ "data-domain": "{TRACKED_DOMAIN}"
+ }
+ }
+ ]
+ },
"description": "Simple, privacy-friendly Google Analytics alternative.",
"__createdUsingCli": true
}
diff --git a/packages/app-store/qr_code/api/add.ts b/packages/app-store/qr_code/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/qr_code/api/add.ts
+++ b/packages/app-store/qr_code/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/qr_code/components/.gitkeep b/packages/app-store/qr_code/components/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/packages/app-store/qr_code/extensions/EventTypeAppCard.tsx b/packages/app-store/qr_code/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/qr_code/extensions/EventTypeAppCard.tsx
rename to packages/app-store/qr_code/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/rainbow/api/add.ts b/packages/app-store/rainbow/api/add.ts
index bfcb5d2be1..5834fdbd88 100644
--- a/packages/app-store/rainbow/api/add.ts
+++ b/packages/app-store/rainbow/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
slug: appConfig.slug,
variant: appConfig.slug,
diff --git a/packages/app-store/rainbow/extensions/EventTypeAppCard.tsx b/packages/app-store/rainbow/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/rainbow/extensions/EventTypeAppCard.tsx
rename to packages/app-store/rainbow/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/raycast/api/add.ts b/packages/app-store/raycast/api/add.ts
index 93294b1c41..7f13c0244e 100644
--- a/packages/app-store/raycast/api/add.ts
+++ b/packages/app-store/raycast/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
slug: appConfig.slug,
variant: appConfig.variant,
diff --git a/packages/app-store/salesforce/config.json b/packages/app-store/salesforce/config.json
index 52e0ad3308..855f1166df 100644
--- a/packages/app-store/salesforce/config.json
+++ b/packages/app-store/salesforce/config.json
@@ -11,6 +11,5 @@
"publisher": "Cal.com",
"email": "help@cal.com",
"description": "Salesforce (Sales Cloud) is a cloud-based application designed to help your salespeople sell smarter and faster by centralizing customer information, logging their interactions with your company, and automating many of the tasks salespeople do every day.",
- "extendsFeature": "User",
"__createdUsingCli": true
}
diff --git a/packages/app-store/sendgrid/config.json b/packages/app-store/sendgrid/config.json
index d95d4b11ce..3dc3936858 100644
--- a/packages/app-store/sendgrid/config.json
+++ b/packages/app-store/sendgrid/config.json
@@ -11,6 +11,5 @@
"publisher": "Cal.com",
"email": "help@cal.com",
"description": "SendGrid delivers your transactional and marketing emails through the world's largest cloud-based email delivery platform.",
- "extendsFeature": "User",
"__createdUsingCli": true
}
diff --git a/packages/app-store/signal/api/add.ts b/packages/app-store/signal/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/signal/api/add.ts
+++ b/packages/app-store/signal/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/signal/config.json b/packages/app-store/signal/config.json
index 8c850718f7..4b1cdd2621 100644
--- a/packages/app-store/signal/config.json
+++ b/packages/app-store/signal/config.json
@@ -11,7 +11,6 @@
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",
"description": "Schedule a chat with your guests or have a Signal Video call.",
- "extendsFeature": "User",
"__createdUsingCli": true,
"appData": {
"location": {
diff --git a/packages/app-store/sirius_video/api/add.ts b/packages/app-store/sirius_video/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/sirius_video/api/add.ts
+++ b/packages/app-store/sirius_video/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/stripepayment/extensions/EventTypeAppCard.tsx b/packages/app-store/stripepayment/components/EventTypeAppCardInterface.tsx
similarity index 100%
rename from packages/app-store/stripepayment/extensions/EventTypeAppCard.tsx
rename to packages/app-store/stripepayment/components/EventTypeAppCardInterface.tsx
diff --git a/packages/app-store/telegram/api/add.ts b/packages/app-store/telegram/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/telegram/api/add.ts
+++ b/packages/app-store/telegram/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/telegram/config.json b/packages/app-store/telegram/config.json
index f4d2f0a8e5..e36861cf10 100644
--- a/packages/app-store/telegram/config.json
+++ b/packages/app-store/telegram/config.json
@@ -11,7 +11,6 @@
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",
"description": "Schedule a chat with your guests or have a Telegram Video call.",
- "extendsFeature": "User",
"__createdUsingCli": true,
"appData": {
"location": {
diff --git a/packages/app-store/templates/_auth-based-app/README.md b/packages/app-store/templates/_auth-based-app/README.md
new file mode 100644
index 0000000000..b3d6e23ef2
--- /dev/null
+++ b/packages/app-store/templates/_auth-based-app/README.md
@@ -0,0 +1,2 @@
+## TODO:
+Identify an ideal app among existing auth based apps and add it here
\ No newline at end of file
diff --git a/packages/app-store/templates/_calendar/README.md b/packages/app-store/templates/_calendar/README.md
new file mode 100644
index 0000000000..124b3749c6
--- /dev/null
+++ b/packages/app-store/templates/_calendar/README.md
@@ -0,0 +1 @@
+Calendar apps are not streamlined and thus a template for it needs some good amount of work
\ No newline at end of file
diff --git a/packages/app-store/templates/basic/DESCRIPTION.md b/packages/app-store/templates/basic/DESCRIPTION.md
new file mode 100644
index 0000000000..a4b15502c3
--- /dev/null
+++ b/packages/app-store/templates/basic/DESCRIPTION.md
@@ -0,0 +1,8 @@
+---
+items:
+ - 1.jpeg
+ - 2.jpeg
+ - 3.jpeg
+---
+
+{DESCRIPTION}
diff --git a/packages/app-store/_baseApp/api/add.ts b/packages/app-store/templates/basic/api/add.ts
similarity index 66%
rename from packages/app-store/_baseApp/api/add.ts
rename to packages/app-store/templates/basic/api/add.ts
index 45c6741f36..f8c6354180 100644
--- a/packages/app-store/_baseApp/api/add.ts
+++ b/packages/app-store/templates/basic/api/add.ts
@@ -1,10 +1,9 @@
+import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
-import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/_baseApp/api/index.ts b/packages/app-store/templates/basic/api/index.ts
similarity index 100%
rename from packages/app-store/_baseApp/api/index.ts
rename to packages/app-store/templates/basic/api/index.ts
diff --git a/packages/app-store/_baseApp/components/.gitkeep b/packages/app-store/templates/basic/components/.gitkeep
similarity index 100%
rename from packages/app-store/_baseApp/components/.gitkeep
rename to packages/app-store/templates/basic/components/.gitkeep
diff --git a/packages/app-store/templates/basic/config.json b/packages/app-store/templates/basic/config.json
new file mode 100644
index 0000000000..e06dae2b5f
--- /dev/null
+++ b/packages/app-store/templates/basic/config.json
@@ -0,0 +1,17 @@
+{
+ "/*": "Don't modify slug - If required, do it using cli edit command",
+ "name": "Basic",
+ "slug": "basic",
+ "type": "basic_other",
+ "imageSrc": "icon.svg",
+ "logo": "icon.svg",
+ "url": "https://example.com/link",
+ "variant": "other",
+ "categories": ["other"],
+ "publisher": "Cal.com, Inc.",
+ "email": "support@cal.com",
+ "description": "It is a template for an app that can be installed and provides no other feature.",
+ "isTemplate": true,
+ "__createdUsingCli": true,
+ "__template": "link-as-an-app"
+}
diff --git a/packages/app-store/templates/basic/index.ts b/packages/app-store/templates/basic/index.ts
new file mode 100644
index 0000000000..d7f3602204
--- /dev/null
+++ b/packages/app-store/templates/basic/index.ts
@@ -0,0 +1 @@
+export * as api from "./api";
diff --git a/packages/app-store/templates/basic/package.json b/packages/app-store/templates/basic/package.json
new file mode 100644
index 0000000000..5f4640dab0
--- /dev/null
+++ b/packages/app-store/templates/basic/package.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/basic",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ },
+ "description": "It is a template for an app that can be installed and provides no other feature."
+}
diff --git a/packages/app-store/templates/basic/static/1.jpeg b/packages/app-store/templates/basic/static/1.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/basic/static/1.jpeg differ
diff --git a/packages/app-store/templates/basic/static/2.jpeg b/packages/app-store/templates/basic/static/2.jpeg
new file mode 100644
index 0000000000..dbdcdb5473
Binary files /dev/null and b/packages/app-store/templates/basic/static/2.jpeg differ
diff --git a/packages/app-store/templates/basic/static/3.jpeg b/packages/app-store/templates/basic/static/3.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/basic/static/3.jpeg differ
diff --git a/packages/app-store/templates/basic/static/icon.svg b/packages/app-store/templates/basic/static/icon.svg
new file mode 100644
index 0000000000..44966edfc1
--- /dev/null
+++ b/packages/app-store/templates/basic/static/icon.svg
@@ -0,0 +1 @@
+blockchain
\ No newline at end of file
diff --git a/packages/app-store/templates/booking-pages-tag/DESCRIPTION.md b/packages/app-store/templates/booking-pages-tag/DESCRIPTION.md
new file mode 100644
index 0000000000..02c40f00ac
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/DESCRIPTION.md
@@ -0,0 +1,8 @@
+---
+items:
+ - 1.jpeg
+ - 2.jpeg
+ - 3.jpeg
+---
+
+{DESCRIPTION}
\ No newline at end of file
diff --git a/packages/app-store/fathom/components/.gitkeep b/packages/app-store/templates/booking-pages-tag/README.md
similarity index 100%
rename from packages/app-store/fathom/components/.gitkeep
rename to packages/app-store/templates/booking-pages-tag/README.md
diff --git a/packages/app-store/templates/booking-pages-tag/api/add.ts b/packages/app-store/templates/booking-pages-tag/api/add.ts
new file mode 100644
index 0000000000..f8c6354180
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/api/add.ts
@@ -0,0 +1,16 @@
+import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
+import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
+
+import appConfig from "../config.json";
+
+const handler: AppDeclarativeHandler = {
+ appType: appConfig.type,
+ variant: appConfig.variant,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/templates/booking-pages-tag/api/index.ts b/packages/app-store/templates/booking-pages-tag/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/templates/booking-pages-tag/components/EventTypeAppCardInterface.tsx b/packages/app-store/templates/booking-pages-tag/components/EventTypeAppCardInterface.tsx
new file mode 100644
index 0000000000..77c5b45b59
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/components/EventTypeAppCardInterface.tsx
@@ -0,0 +1,38 @@
+import { useState } from "react";
+
+import { useAppContextWithSchema } from "@calcom/app-store/EventTypeAppContext";
+import AppCard from "@calcom/app-store/_components/AppCard";
+import type { EventTypeAppCardComponent } from "@calcom/app-store/types";
+import { TextField } from "@calcom/ui";
+
+import { appDataSchema } from "../zod";
+
+const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({ app }) {
+ const [getAppData, setAppData] = useAppContextWithSchema();
+ const trackingId = getAppData("trackingId");
+ const [enabled, setEnabled] = useState(getAppData("enabled"));
+
+ return (
+ {
+ if (!e) {
+ setEnabled(false);
+ } else {
+ setEnabled(true);
+ }
+ }}
+ switchChecked={enabled}>
+ {
+ setAppData("trackingId", e.target.value);
+ }}
+ />
+
+ );
+};
+
+export default EventTypeAppCard;
diff --git a/packages/app-store/templates/booking-pages-tag/config.json b/packages/app-store/templates/booking-pages-tag/config.json
new file mode 100644
index 0000000000..9f80aaf414
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/config.json
@@ -0,0 +1,28 @@
+{
+ "name": "Booking Pages Tag",
+ "slug": "booking-pages-tag",
+ "type": "booking-pages-tag_analytics",
+ "imageSrc": "icon.svg",
+ "logo": "icon.svg",
+ "url": "https://example.com/link",
+ "variant": "analytics",
+ "categories": ["analytics"],
+ "publisher": "Cal.com, Inc.",
+ "email": "support@cal.com",
+ "description": "It is a template demoing a Booking Pages tracking app like GA4, Fathom and Plausible.",
+ "extendsFeature": "EventType",
+ "appData": {
+ "tag": {
+ "scripts": [
+ {
+ "src": "https://cdn.example.com/script.js",
+ "attrs": {
+ "data-site": "{TRACKING_ID}"
+ }
+ }
+ ]
+ }
+ },
+ "isTemplate": true,
+ "__createdUsingCli": true
+}
diff --git a/packages/app-store/templates/booking-pages-tag/index.ts b/packages/app-store/templates/booking-pages-tag/index.ts
new file mode 100644
index 0000000000..d7f3602204
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/index.ts
@@ -0,0 +1 @@
+export * as api from "./api";
diff --git a/packages/app-store/_baseApp/package.json b/packages/app-store/templates/booking-pages-tag/package.json
similarity index 71%
rename from packages/app-store/_baseApp/package.json
rename to packages/app-store/templates/booking-pages-tag/package.json
index ff2856f018..024bc7b430 100644
--- a/packages/app-store/_baseApp/package.json
+++ b/packages/app-store/templates/booking-pages-tag/package.json
@@ -1,10 +1,9 @@
{
"$schema": "https://json.schemastore.org/package.json",
"private": true,
- "name": "@calcom/cli_base__app_name",
+ "name": "@calcom/template-event-type-analytics",
"version": "0.0.0",
"main": "./index.ts",
- "description": "Your app description goes here.",
"dependencies": {
"@calcom/lib": "*"
},
diff --git a/packages/app-store/templates/booking-pages-tag/static/1.jpeg b/packages/app-store/templates/booking-pages-tag/static/1.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/booking-pages-tag/static/1.jpeg differ
diff --git a/packages/app-store/templates/booking-pages-tag/static/2.jpeg b/packages/app-store/templates/booking-pages-tag/static/2.jpeg
new file mode 100644
index 0000000000..dbdcdb5473
Binary files /dev/null and b/packages/app-store/templates/booking-pages-tag/static/2.jpeg differ
diff --git a/packages/app-store/templates/booking-pages-tag/static/3.jpeg b/packages/app-store/templates/booking-pages-tag/static/3.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/booking-pages-tag/static/3.jpeg differ
diff --git a/packages/app-store/templates/booking-pages-tag/static/icon.svg b/packages/app-store/templates/booking-pages-tag/static/icon.svg
new file mode 100644
index 0000000000..44966edfc1
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/static/icon.svg
@@ -0,0 +1 @@
+blockchain
\ No newline at end of file
diff --git a/packages/app-store/templates/booking-pages-tag/zod.ts b/packages/app-store/templates/booking-pages-tag/zod.ts
new file mode 100644
index 0000000000..6f45d901cc
--- /dev/null
+++ b/packages/app-store/templates/booking-pages-tag/zod.ts
@@ -0,0 +1,11 @@
+import { z } from "zod";
+
+import { eventTypeAppCardZod } from "@calcom/app-store/eventTypeAppCardZod";
+
+export const appDataSchema = eventTypeAppCardZod.merge(
+ z.object({
+ trackingId: z.string(),
+ })
+);
+
+export const appKeysSchema = z.object({});
diff --git a/packages/app-store/templates/event-type-app-card/DESCRIPTION.md b/packages/app-store/templates/event-type-app-card/DESCRIPTION.md
new file mode 100644
index 0000000000..30a038f826
--- /dev/null
+++ b/packages/app-store/templates/event-type-app-card/DESCRIPTION.md
@@ -0,0 +1,9 @@
+---
+items:
+ - 1.jpeg
+ - 2.jpeg
+ - 3.jpeg
+---
+
+{DESCRIPTION}
+
diff --git a/packages/app-store/templates/event-type-app-card/api/add.ts b/packages/app-store/templates/event-type-app-card/api/add.ts
new file mode 100644
index 0000000000..f8c6354180
--- /dev/null
+++ b/packages/app-store/templates/event-type-app-card/api/add.ts
@@ -0,0 +1,16 @@
+import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
+import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
+
+import appConfig from "../config.json";
+
+const handler: AppDeclarativeHandler = {
+ appType: appConfig.type,
+ variant: appConfig.variant,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/templates/event-type-app-card/api/index.ts b/packages/app-store/templates/event-type-app-card/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/templates/event-type-app-card/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/_templates/extensions/EventTypeAppCard.tsx b/packages/app-store/templates/event-type-app-card/components/EventTypeAppCardInterface.tsx
similarity index 94%
rename from packages/app-store/_templates/extensions/EventTypeAppCard.tsx
rename to packages/app-store/templates/event-type-app-card/components/EventTypeAppCardInterface.tsx
index 930052fdcf..3eda0cc54d 100644
--- a/packages/app-store/_templates/extensions/EventTypeAppCard.tsx
+++ b/packages/app-store/templates/event-type-app-card/components/EventTypeAppCardInterface.tsx
@@ -32,8 +32,8 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
an AppCard for Event with Title: {eventType.title}
{" "}
- Edit packages/app-store/{app.slug}/extensions/EventTypeAppCard.tsx {" "}
- to play with me
+ Edit packages/app-store/{app.slug}/EventTypeAppCardInterface.tsx to
+ play with me
diff --git a/packages/app-store/templates/event-type-app-card/config.json b/packages/app-store/templates/event-type-app-card/config.json
new file mode 100644
index 0000000000..af1fd9917b
--- /dev/null
+++ b/packages/app-store/templates/event-type-app-card/config.json
@@ -0,0 +1,16 @@
+{
+ "name": "EventType AppCard",
+ "slug": "event-type-app-card",
+ "type": "event-type-app-card_other",
+ "imageSrc": "icon.svg",
+ "logo": "icon.svg",
+ "url": "https://example.com/link",
+ "variant": "other",
+ "categories": ["other"],
+ "publisher": "Cal.com, Inc.",
+ "email": "support@cal.com",
+ "description": "A template showcasing how an app with EventType AppCard can be built e.g. Giphy, QR Code",
+ "extendsFeature": "EventType",
+ "isTemplate": true,
+ "__createdUsingCli": true
+}
diff --git a/packages/app-store/templates/event-type-app-card/index.ts b/packages/app-store/templates/event-type-app-card/index.ts
new file mode 100644
index 0000000000..d7f3602204
--- /dev/null
+++ b/packages/app-store/templates/event-type-app-card/index.ts
@@ -0,0 +1 @@
+export * as api from "./api";
diff --git a/packages/app-store/_example/package.json b/packages/app-store/templates/event-type-app-card/package.json
similarity index 61%
rename from packages/app-store/_example/package.json
rename to packages/app-store/templates/event-type-app-card/package.json
index 757b0296d3..65ddce10eb 100644
--- a/packages/app-store/_example/package.json
+++ b/packages/app-store/templates/event-type-app-card/package.json
@@ -1,12 +1,11 @@
{
"$schema": "https://json.schemastore.org/package.json",
"private": true,
- "name": "@calcom/example-app",
+ "name": "@calcom/template-event-type-app-card",
"version": "0.0.0",
"main": "./index.ts",
- "description": "This is a brief description for the Example App.",
"dependencies": {
- "@calcom/prisma": "*"
+ "@calcom/lib": "*"
},
"devDependencies": {
"@calcom/types": "*"
diff --git a/packages/app-store/templates/event-type-app-card/static/1.jpeg b/packages/app-store/templates/event-type-app-card/static/1.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/event-type-app-card/static/1.jpeg differ
diff --git a/packages/app-store/templates/event-type-app-card/static/2.jpeg b/packages/app-store/templates/event-type-app-card/static/2.jpeg
new file mode 100644
index 0000000000..dbdcdb5473
Binary files /dev/null and b/packages/app-store/templates/event-type-app-card/static/2.jpeg differ
diff --git a/packages/app-store/templates/event-type-app-card/static/3.jpeg b/packages/app-store/templates/event-type-app-card/static/3.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/event-type-app-card/static/3.jpeg differ
diff --git a/packages/app-store/templates/event-type-app-card/static/icon.svg b/packages/app-store/templates/event-type-app-card/static/icon.svg
new file mode 100644
index 0000000000..44966edfc1
--- /dev/null
+++ b/packages/app-store/templates/event-type-app-card/static/icon.svg
@@ -0,0 +1 @@
+
blockchain
\ No newline at end of file
diff --git a/packages/app-store/_templates/zod.ts b/packages/app-store/templates/event-type-app-card/zod.ts
similarity index 69%
rename from packages/app-store/_templates/zod.ts
rename to packages/app-store/templates/event-type-app-card/zod.ts
index 99e1f6da5d..5bb6cdc59f 100644
--- a/packages/app-store/_templates/zod.ts
+++ b/packages/app-store/templates/event-type-app-card/zod.ts
@@ -1,11 +1,10 @@
import { z } from "zod";
-import { eventTypeAppCardZod } from "../eventTypeAppCardZod";
+import { eventTypeAppCardZod } from "@calcom/app-store/eventTypeAppCardZod";
export const appDataSchema = eventTypeAppCardZod.merge(
z.object({
isSunrise: z.boolean(),
})
);
-
export const appKeysSchema = z.object({});
diff --git a/packages/app-store/templates/event-type-location-video-static/DESCRIPTION.md b/packages/app-store/templates/event-type-location-video-static/DESCRIPTION.md
new file mode 100644
index 0000000000..02c40f00ac
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/DESCRIPTION.md
@@ -0,0 +1,8 @@
+---
+items:
+ - 1.jpeg
+ - 2.jpeg
+ - 3.jpeg
+---
+
+{DESCRIPTION}
\ No newline at end of file
diff --git a/packages/app-store/templates/event-type-location-video-static/api/add.ts b/packages/app-store/templates/event-type-location-video-static/api/add.ts
new file mode 100644
index 0000000000..f8c6354180
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/api/add.ts
@@ -0,0 +1,16 @@
+import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
+import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
+
+import appConfig from "../config.json";
+
+const handler: AppDeclarativeHandler = {
+ appType: appConfig.type,
+ variant: appConfig.variant,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/templates/event-type-location-video-static/api/index.ts b/packages/app-store/templates/event-type-location-video-static/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/templates/event-type-location-video-static/config.json b/packages/app-store/templates/event-type-location-video-static/config.json
new file mode 100644
index 0000000000..eb2afc9501
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/config.json
@@ -0,0 +1,25 @@
+{
+ "/*": "Don't modify slug - If required, do it using cli edit command",
+ "name": "EventType Location Video - Static",
+ "slug": "event-type-location-video-static",
+ "type": "event-type-location-video-static_video",
+ "imageSrc": "icon.svg",
+ "logo": "icon.svg",
+ "url": "https://example.com/link",
+ "variant": "conferencing",
+ "categories": ["video"],
+ "publisher": "Cal.com Inc",
+ "email": "support@cal.com",
+ "appData": {
+ "location": {
+ "type": "integrations:{SLUG}_video",
+ "label": "{TITLE}",
+ "linkType": "static",
+ "organizerInputPlaceholder": "https://video.app/mylink",
+ "urlRegExp": "^http(s)?:\\/\\/(www\\.)?video.app\\/[a-zA-Z0-9]*"
+ }
+ },
+ "description": "It is a template showing how to add a static URL EventType location e.g. Around, Whereby",
+ "isTemplate": true,
+ "__createdUsingCli": true
+}
diff --git a/packages/app-store/templates/event-type-location-video-static/index.ts b/packages/app-store/templates/event-type-location-video-static/index.ts
new file mode 100644
index 0000000000..d7f3602204
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/index.ts
@@ -0,0 +1 @@
+export * as api from "./api";
diff --git a/packages/app-store/templates/event-type-location-video-static/package.json b/packages/app-store/templates/event-type-location-video-static/package.json
new file mode 100644
index 0000000000..0227642829
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/package.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/template-event-type-location-video-static",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/templates/event-type-location-video-static/static/1.jpeg b/packages/app-store/templates/event-type-location-video-static/static/1.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/event-type-location-video-static/static/1.jpeg differ
diff --git a/packages/app-store/templates/event-type-location-video-static/static/2.jpeg b/packages/app-store/templates/event-type-location-video-static/static/2.jpeg
new file mode 100644
index 0000000000..dbdcdb5473
Binary files /dev/null and b/packages/app-store/templates/event-type-location-video-static/static/2.jpeg differ
diff --git a/packages/app-store/templates/event-type-location-video-static/static/3.jpeg b/packages/app-store/templates/event-type-location-video-static/static/3.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/event-type-location-video-static/static/3.jpeg differ
diff --git a/packages/app-store/templates/event-type-location-video-static/static/icon.svg b/packages/app-store/templates/event-type-location-video-static/static/icon.svg
new file mode 100644
index 0000000000..44966edfc1
--- /dev/null
+++ b/packages/app-store/templates/event-type-location-video-static/static/icon.svg
@@ -0,0 +1 @@
+
blockchain
\ No newline at end of file
diff --git a/packages/app-store/templates/general-app-settings/DESCRIPTION.md b/packages/app-store/templates/general-app-settings/DESCRIPTION.md
new file mode 100644
index 0000000000..02c40f00ac
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/DESCRIPTION.md
@@ -0,0 +1,8 @@
+---
+items:
+ - 1.jpeg
+ - 2.jpeg
+ - 3.jpeg
+---
+
+{DESCRIPTION}
\ No newline at end of file
diff --git a/packages/app-store/templates/general-app-settings/api/add.ts b/packages/app-store/templates/general-app-settings/api/add.ts
new file mode 100644
index 0000000000..f8c6354180
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/api/add.ts
@@ -0,0 +1,16 @@
+import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
+import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
+
+import appConfig from "../config.json";
+
+const handler: AppDeclarativeHandler = {
+ appType: appConfig.type,
+ variant: appConfig.variant,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/templates/general-app-settings/api/index.ts b/packages/app-store/templates/general-app-settings/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/templates/general-app-settings/components/AppSettingsInterface.tsx b/packages/app-store/templates/general-app-settings/components/AppSettingsInterface.tsx
new file mode 100644
index 0000000000..666f6eaeb7
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/components/AppSettingsInterface.tsx
@@ -0,0 +1,23 @@
+import { useState } from "react";
+
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import { Button, TextField } from "@calcom/ui";
+
+export default function AppSettings() {
+ const { t } = useLocale();
+ const [input, setInput] = useState("");
+
+ return (
+
+ {
+ setInput(e.target.value);
+ }}
+ />
+ {t("submit")}
+
+ );
+}
diff --git a/packages/app-store/templates/general-app-settings/config.json b/packages/app-store/templates/general-app-settings/config.json
new file mode 100644
index 0000000000..8cf6d0f3f1
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/config.json
@@ -0,0 +1,15 @@
+{
+ "name": "General App Settings",
+ "slug": "general-app-settings",
+ "type": "general-app-settings_other",
+ "imageSrc": "icon.svg",
+ "logo": "icon.svg",
+ "url": "https://example.com/link",
+ "variant": "other",
+ "categories": ["other"],
+ "publisher": "Cal.com Inc",
+ "email": "support@cal.com",
+ "description": "It is a template showing how an App can have settings in installed section that configures the app globally e.g. Weather in your Calendar",
+ "isTemplate": true,
+ "__createdUsingCli": true
+}
diff --git a/packages/app-store/templates/general-app-settings/index.ts b/packages/app-store/templates/general-app-settings/index.ts
new file mode 100644
index 0000000000..d7f3602204
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/index.ts
@@ -0,0 +1 @@
+export * as api from "./api";
diff --git a/packages/app-store/templates/general-app-settings/package.json b/packages/app-store/templates/general-app-settings/package.json
new file mode 100644
index 0000000000..13ee6a80bb
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/package.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/template-general-app-settings",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/templates/general-app-settings/static/1.jpeg b/packages/app-store/templates/general-app-settings/static/1.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/general-app-settings/static/1.jpeg differ
diff --git a/packages/app-store/templates/general-app-settings/static/2.jpeg b/packages/app-store/templates/general-app-settings/static/2.jpeg
new file mode 100644
index 0000000000..dbdcdb5473
Binary files /dev/null and b/packages/app-store/templates/general-app-settings/static/2.jpeg differ
diff --git a/packages/app-store/templates/general-app-settings/static/3.jpeg b/packages/app-store/templates/general-app-settings/static/3.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/general-app-settings/static/3.jpeg differ
diff --git a/packages/app-store/templates/general-app-settings/static/icon.svg b/packages/app-store/templates/general-app-settings/static/icon.svg
new file mode 100644
index 0000000000..44966edfc1
--- /dev/null
+++ b/packages/app-store/templates/general-app-settings/static/icon.svg
@@ -0,0 +1 @@
+
blockchain
\ No newline at end of file
diff --git a/packages/app-store/templates/link-as-an-app/DESCRIPTION.md b/packages/app-store/templates/link-as-an-app/DESCRIPTION.md
new file mode 100644
index 0000000000..a4b15502c3
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/DESCRIPTION.md
@@ -0,0 +1,8 @@
+---
+items:
+ - 1.jpeg
+ - 2.jpeg
+ - 3.jpeg
+---
+
+{DESCRIPTION}
diff --git a/packages/app-store/templates/link-as-an-app/api/add.ts b/packages/app-store/templates/link-as-an-app/api/add.ts
new file mode 100644
index 0000000000..d27cdfd098
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/api/add.ts
@@ -0,0 +1,20 @@
+import { createDefaultInstallation } from "@calcom/app-store/_utils/installation";
+import { AppDeclarativeHandler } from "@calcom/types/AppHandler";
+
+import appConfig from "../config.json";
+
+const handler: AppDeclarativeHandler = {
+ appType: appConfig.type,
+ variant: appConfig.variant,
+ slug: appConfig.slug,
+ supportsMultipleInstalls: false,
+ handlerType: "add",
+ redirect: {
+ newTab: true,
+ url: "https://example.com/link",
+ },
+ createCredential: ({ appType, user, slug }) =>
+ createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
+};
+
+export default handler;
diff --git a/packages/app-store/templates/link-as-an-app/api/index.ts b/packages/app-store/templates/link-as-an-app/api/index.ts
new file mode 100644
index 0000000000..4c0d2ead01
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/api/index.ts
@@ -0,0 +1 @@
+export { default as add } from "./add";
diff --git a/packages/app-store/plausible/components/.gitkeep b/packages/app-store/templates/link-as-an-app/components/.gitkeep
similarity index 100%
rename from packages/app-store/plausible/components/.gitkeep
rename to packages/app-store/templates/link-as-an-app/components/.gitkeep
diff --git a/packages/app-store/templates/link-as-an-app/config.json b/packages/app-store/templates/link-as-an-app/config.json
new file mode 100644
index 0000000000..bd695dbf55
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/config.json
@@ -0,0 +1,16 @@
+{
+ "/*": "Don't modify slug - If required, do it using cli edit command",
+ "name": "Link as An App",
+ "slug": "link-as-an-app",
+ "type": "link-as-an-app_other",
+ "imageSrc": "icon.svg",
+ "logo": "icon.svg",
+ "url": "https://example.com/link",
+ "variant": "other",
+ "categories": ["other"],
+ "publisher": "Cal.com, Inc.",
+ "email": "support@cal.com",
+ "description": "It's a template showing how an app, that is just a link to some webpage, can be made e.g. Pipedream, Amie, Vimcal.",
+ "isTemplate": true,
+ "__createdUsingCli": true
+}
diff --git a/packages/app-store/templates/link-as-an-app/index.ts b/packages/app-store/templates/link-as-an-app/index.ts
new file mode 100644
index 0000000000..d7f3602204
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/index.ts
@@ -0,0 +1 @@
+export * as api from "./api";
diff --git a/packages/app-store/templates/link-as-an-app/package.json b/packages/app-store/templates/link-as-an-app/package.json
new file mode 100644
index 0000000000..ad8ec5fe0b
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/package.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://json.schemastore.org/package.json",
+ "private": true,
+ "name": "@calcom/link-as-an-app",
+ "version": "0.0.0",
+ "main": "./index.ts",
+ "dependencies": {
+ "@calcom/lib": "*"
+ },
+ "devDependencies": {
+ "@calcom/types": "*"
+ }
+}
diff --git a/packages/app-store/templates/link-as-an-app/static/1.jpeg b/packages/app-store/templates/link-as-an-app/static/1.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/link-as-an-app/static/1.jpeg differ
diff --git a/packages/app-store/templates/link-as-an-app/static/2.jpeg b/packages/app-store/templates/link-as-an-app/static/2.jpeg
new file mode 100644
index 0000000000..dbdcdb5473
Binary files /dev/null and b/packages/app-store/templates/link-as-an-app/static/2.jpeg differ
diff --git a/packages/app-store/templates/link-as-an-app/static/3.jpeg b/packages/app-store/templates/link-as-an-app/static/3.jpeg
new file mode 100644
index 0000000000..d3ba68492d
Binary files /dev/null and b/packages/app-store/templates/link-as-an-app/static/3.jpeg differ
diff --git a/packages/app-store/templates/link-as-an-app/static/icon.svg b/packages/app-store/templates/link-as-an-app/static/icon.svg
new file mode 100644
index 0000000000..44966edfc1
--- /dev/null
+++ b/packages/app-store/templates/link-as-an-app/static/icon.svg
@@ -0,0 +1 @@
+
blockchain
\ No newline at end of file
diff --git a/packages/app-store/typeform/api/add.ts b/packages/app-store/typeform/api/add.ts
index 5ea6d24a58..dc41ae123c 100644
--- a/packages/app-store/typeform/api/add.ts
+++ b/packages/app-store/typeform/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
slug: appConfig.slug,
variant: appConfig.variant,
diff --git a/packages/app-store/types.d.ts b/packages/app-store/types.d.ts
index b586522960..37c8b91951 100644
--- a/packages/app-store/types.d.ts
+++ b/packages/app-store/types.d.ts
@@ -10,6 +10,12 @@ export type IntegrationOAuthCallbackState = {
installGoogleVideo?: boolean;
};
+type AppScript = { attrs?: Record
} & { src?: string; content?: string };
+
+export type Tag = {
+ scripts: AppScript[];
+};
+
export interface InstallAppButtonProps {
render: (
renderProps: ButtonProps & {
diff --git a/packages/app-store/utils.ts b/packages/app-store/utils.ts
index cdef280d0d..05fc9f742f 100644
--- a/packages/app-store/utils.ts
+++ b/packages/app-store/utils.ts
@@ -2,20 +2,25 @@ import { Prisma } from "@prisma/client";
import { TFunction } from "next-i18next";
import { z } from "zod";
+// If you import this file on any app it should produce circular dependency
+// import appStore from "./index";
+import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData";
import { defaultLocations, EventLocationType } from "@calcom/app-store/locations";
import { EventTypeModel } from "@calcom/prisma/zod";
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
import type { App, AppMeta } from "@calcom/types/App";
-// If you import this file on any app it should produce circular dependency
-// import appStore from "./index";
-import { appStoreMetadata } from "./apps.metadata.generated";
-
export type EventTypeApps = NonNullable>["apps"]>;
export type EventTypeAppsList = keyof EventTypeApps;
const ALL_APPS_MAP = Object.keys(appStoreMetadata).reduce((store, key) => {
- store[key] = appStoreMetadata[key as keyof typeof appStoreMetadata];
+ const metadata = appStoreMetadata[key as keyof typeof appStoreMetadata] as AppMeta;
+ if (metadata.logo && !metadata.logo.includes("/")) {
+ const appDirName = `${metadata.isTemplate ? "templates" : ""}/${metadata.slug}`;
+ metadata.logo = `/api/app-store/${appDirName}/${metadata.logo}`;
+ }
+ store[key] = metadata;
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
delete store[key]["/*"];
diff --git a/packages/app-store/vimcal/api/add.ts b/packages/app-store/vimcal/api/add.ts
index a9a7df96d3..b1cbdc1ac1 100644
--- a/packages/app-store/vimcal/api/add.ts
+++ b/packages/app-store/vimcal/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/vimcal/config.json b/packages/app-store/vimcal/config.json
index 41bfd3b790..7ea2953c5e 100644
--- a/packages/app-store/vimcal/config.json
+++ b/packages/app-store/vimcal/config.json
@@ -11,6 +11,5 @@
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",
"description": "The world's fastest calendar, beautifully designed for a remote world\r",
- "extendsFeature": "User",
"__createdUsingCli": true
}
diff --git a/packages/app-store/weather_in_your_calendar/api/add.ts b/packages/app-store/weather_in_your_calendar/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/weather_in_your_calendar/api/add.ts
+++ b/packages/app-store/weather_in_your_calendar/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/weather_in_your_calendar/components/AppSettings.tsx b/packages/app-store/weather_in_your_calendar/components/AppSettingsInterface.tsx
similarity index 100%
rename from packages/app-store/weather_in_your_calendar/components/AppSettings.tsx
rename to packages/app-store/weather_in_your_calendar/components/AppSettingsInterface.tsx
diff --git a/packages/app-store/whatsapp/api/add.ts b/packages/app-store/whatsapp/api/add.ts
index 45c6741f36..8f569c854c 100644
--- a/packages/app-store/whatsapp/api/add.ts
+++ b/packages/app-store/whatsapp/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/whatsapp/config.json b/packages/app-store/whatsapp/config.json
index d18f8e792f..6ce34f58e5 100644
--- a/packages/app-store/whatsapp/config.json
+++ b/packages/app-store/whatsapp/config.json
@@ -11,7 +11,6 @@
"publisher": "Cal.com, Inc.",
"email": "support@cal.com",
"description": "Schedule a chat with your guests or have a WhatsApp Video call.",
- "extendsFeature": "User",
"__createdUsingCli": true,
"appData": {
"location": {
diff --git a/packages/app-store/wordpress/api/add.ts b/packages/app-store/wordpress/api/add.ts
index fb6e427a8a..f4b106f9d4 100644
--- a/packages/app-store/wordpress/api/add.ts
+++ b/packages/app-store/wordpress/api/add.ts
@@ -4,7 +4,6 @@ import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
- // Instead of passing appType and slug from here, api/integrations/[..args] should be able to derive and pass these directly to createCredential
appType: appConfig.type,
variant: appConfig.variant,
slug: appConfig.slug,
diff --git a/packages/app-store/zapier/components/AppSettings.tsx b/packages/app-store/zapier/components/AppSettingsInterface.tsx
similarity index 100%
rename from packages/app-store/zapier/components/AppSettings.tsx
rename to packages/app-store/zapier/components/AppSettingsInterface.tsx
diff --git a/packages/app-store/zapier/components/TemplateCard.tsx b/packages/app-store/zapier/components/TemplateCard.tsx
index dd6d546938..34b955858f 100644
--- a/packages/app-store/zapier/components/TemplateCard.tsx
+++ b/packages/app-store/zapier/components/TemplateCard.tsx
@@ -1,6 +1,6 @@
import { Button } from "@calcom/ui";
-import { Template } from "./AppSettings";
+import { Template } from "./AppSettingsInterface";
export default function TemplateCard({ template }: { template: Template }) {
return (
diff --git a/packages/features/apps/AdminAppsList.tsx b/packages/features/apps/AdminAppsList.tsx
index cda2986067..5c8e745cb7 100644
--- a/packages/features/apps/AdminAppsList.tsx
+++ b/packages/features/apps/AdminAppsList.tsx
@@ -11,6 +11,7 @@ import { appKeysSchemas } from "@calcom/app-store/apps.keys-schemas.generated";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { RouterOutputs, trpc } from "@calcom/trpc/react";
import {
+ Badge,
Button,
ConfirmationDialogContent,
Dialog,
@@ -76,8 +77,13 @@ const IntegrationContainer = ({
{app.logo &&
}
-
+
{app.name || app.title}
+ {app.isTemplate && (
+
+ Template
+
+ )}
{app.description}
@@ -101,7 +107,7 @@ const IntegrationContainer = ({
setShowKeys(!showKeys)}>
diff --git a/packages/features/apps/components/DisconnectIntegration.tsx b/packages/features/apps/components/DisconnectIntegration.tsx
index d9a31a9554..4bdcf75101 100644
--- a/packages/features/apps/components/DisconnectIntegration.tsx
+++ b/packages/features/apps/components/DisconnectIntegration.tsx
@@ -55,7 +55,8 @@ export default function DisconnectIntegration({
{label && label}
diff --git a/packages/features/auth/components/AuthContainer.tsx b/packages/features/auth/components/AuthContainer.tsx
index 3d0c892fdc..3896c20482 100644
--- a/packages/features/auth/components/AuthContainer.tsx
+++ b/packages/features/auth/components/AuthContainer.tsx
@@ -30,7 +30,7 @@ export default function AuthContainer(props: React.PropsWithChildren) {
)}
-
+
{props.children}
diff --git a/packages/features/calendars/weeklyview/components/heading/SchedulerHeading.tsx b/packages/features/calendars/weeklyview/components/heading/SchedulerHeading.tsx
index 152b51d8d0..3e7a82d761 100644
--- a/packages/features/calendars/weeklyview/components/heading/SchedulerHeading.tsx
+++ b/packages/features/calendars/weeklyview/components/heading/SchedulerHeading.tsx
@@ -30,7 +30,7 @@ export function SchedulerHeading() {
{/* TODO: i18n label with correct view */}
{
@@ -39,7 +39,7 @@ export function SchedulerHeading() {
/>
{
diff --git a/packages/features/ee/api-keys/components/ApiKeyListItem.tsx b/packages/features/ee/api-keys/components/ApiKeyListItem.tsx
index f54d4151e7..1b19f5e4d7 100644
--- a/packages/features/ee/api-keys/components/ApiKeyListItem.tsx
+++ b/packages/features/ee/api-keys/components/ApiKeyListItem.tsx
@@ -66,7 +66,7 @@ const ApiKeyListItem = ({
-
+
diff --git a/packages/features/ee/sso/components/SAMLConfiguration.tsx b/packages/features/ee/sso/components/SAMLConfiguration.tsx
index 46779e822b..a7e9928b3a 100644
--- a/packages/features/ee/sso/components/SAMLConfiguration.tsx
+++ b/packages/features/ee/sso/components/SAMLConfiguration.tsx
@@ -102,7 +102,7 @@ export default function SAMLConfiguration({ teamId }: { teamId: number | null })
{/* Service Provider Details */}
{connection && connection.provider && (
<>
-
+
{t("saml_sp_title")}
{t("saml_sp_description")}
@@ -153,7 +153,7 @@ export default function SAMLConfiguration({ teamId }: { teamId: number | null })
{/* Danger Zone and Delete Confirmation */}
{connection && connection.provider && (
<>
-
+
{t("danger_zone")}
diff --git a/packages/features/ee/teams/components/AddNewTeamMembers.tsx b/packages/features/ee/teams/components/AddNewTeamMembers.tsx
index 284a171e11..5040f281b0 100644
--- a/packages/features/ee/teams/components/AddNewTeamMembers.tsx
+++ b/packages/features/ee/teams/components/AddNewTeamMembers.tsx
@@ -164,7 +164,7 @@ const PendingMemberItem = (props: { member: TeamMember; index: number; teamId: n
{
diff --git a/packages/features/ee/teams/components/MemberChangeRoleModal.tsx b/packages/features/ee/teams/components/MemberChangeRoleModal.tsx
index 070512d825..d3fa78013a 100644
--- a/packages/features/ee/teams/components/MemberChangeRoleModal.tsx
+++ b/packages/features/ee/teams/components/MemberChangeRoleModal.tsx
@@ -67,7 +67,7 @@ export default function MemberChangeRoleModal(props: {
}
return (
-
+
<>
diff --git a/packages/features/ee/teams/components/MemberListItem.tsx b/packages/features/ee/teams/components/MemberListItem.tsx
index 02dc669c2c..2b9ee4632c 100644
--- a/packages/features/ee/teams/components/MemberListItem.tsx
+++ b/packages/features/ee/teams/components/MemberListItem.tsx
@@ -133,7 +133,7 @@ export default function MemberListItem(props: Props) {
disabled={!props.member.accepted}
onClick={() => (props.member.accepted ? setShowTeamAvailabilityModal(true) : null)}
color="secondary"
- size="icon"
+ variant="icon"
StartIcon={Icon.FiClock}
/>
@@ -143,7 +143,7 @@ export default function MemberListItem(props: Props) {
href={"/" + props.member.username}
color="secondary"
className={classNames(!editMode ? "rounded-r-md" : "")}
- size="icon"
+ variant="icon"
StartIcon={Icon.FiExternalLink}
/>
@@ -154,7 +154,7 @@ export default function MemberListItem(props: Props) {
className="h-[36px] w-[36px] bg-transparent px-0 py-0 hover:bg-transparent focus:bg-transparent focus:outline-none focus:ring-0 focus:ring-offset-0">
@@ -197,7 +197,7 @@ export default function MemberListItem(props: Props) {
-
+
{props.member.accepted && (
@@ -219,7 +219,7 @@ export default function MemberListItem(props: Props) {
type="button"
onClick={() => setShowChangeMemberRoleModal(true)}
StartIcon={Icon.FiEdit2}>
- {t("edit") as string}
+ {t("edit")}
@@ -228,7 +228,7 @@ export default function MemberListItem(props: Props) {
color="destructive"
onClick={() => setShowDeleteModal(true)}
StartIcon={Icon.FiTrash}>
- {t("edit") as string}
+ {t("delete")}
>
diff --git a/packages/features/ee/teams/components/TeamInviteListItem.tsx b/packages/features/ee/teams/components/TeamInviteListItem.tsx
index 80e89e22e1..1c23baf6eb 100644
--- a/packages/features/ee/teams/components/TeamInviteListItem.tsx
+++ b/packages/features/ee/teams/components/TeamInviteListItem.tsx
@@ -90,7 +90,7 @@ export default function TeamInviteListItem(props: Props) {
-
+
diff --git a/packages/features/ee/teams/components/TeamListItem.tsx b/packages/features/ee/teams/components/TeamListItem.tsx
index 38cea12ce2..49e0ac4b29 100644
--- a/packages/features/ee/teams/components/TeamListItem.tsx
+++ b/packages/features/ee/teams/components/TeamListItem.tsx
@@ -115,7 +115,7 @@ export default function TeamListItem(props: Props) {
-
+
@@ -150,14 +150,19 @@ export default function TeamListItem(props: Props) {
);
showToast(t("link_copied"), "success");
}}
- size="icon"
+ variant="icon"
StartIcon={Icon.FiLink}
/>
)}
-
+
{isAdmin && (
diff --git a/packages/features/ee/teams/pages/team-profile-view.tsx b/packages/features/ee/teams/pages/team-profile-view.tsx
index 52c448c5d1..8b354bd103 100644
--- a/packages/features/ee/teams/pages/team-profile-view.tsx
+++ b/packages/features/ee/teams/pages/team-profile-view.tsx
@@ -277,7 +277,7 @@ const ProfileView = () => {
)}
-
+
{t("danger_zone")}
{team?.membership.role === "OWNER" ? (
diff --git a/packages/features/ee/video/ViewRecordingsDialog.tsx b/packages/features/ee/video/ViewRecordingsDialog.tsx
index c7d5df8b41..0b46197c43 100644
--- a/packages/features/ee/video/ViewRecordingsDialog.tsx
+++ b/packages/features/ee/video/ViewRecordingsDialog.tsx
@@ -109,7 +109,7 @@ export const ViewRecordingsDialog = (props: IViewRecordingsDialog) => {
<>
- {isLoading && isLoadingHasTeamPlan && }
+ {(isLoading || isLoadingHasTeamPlan) && }
{recordings && "data" in recordings && recordings?.data?.length > 0 && (
{recordings.data.map((recording: RecordingItemSchema, index: number) => {
diff --git a/packages/features/ee/workflows/components/WorkflowListPage.tsx b/packages/features/ee/workflows/components/WorkflowListPage.tsx
index 766e7f17a1..0476febf91 100644
--- a/packages/features/ee/workflows/components/WorkflowListPage.tsx
+++ b/packages/features/ee/workflows/components/WorkflowListPage.tsx
@@ -143,7 +143,7 @@ export default function WorkflowListPage({ workflows }: Props) {
await router.replace("/workflows/" + workflow.id)}
/>
@@ -155,7 +155,7 @@ export default function WorkflowListPage({ workflows }: Props) {
setwWorkflowToDeleteId(workflow.id);
}}
color="secondary"
- size="icon"
+ variant="icon"
StartIcon={Icon.FiTrash2}
/>
@@ -167,7 +167,7 @@ export default function WorkflowListPage({ workflows }: Props) {
diff --git a/packages/features/ee/workflows/components/WorkflowStepContainer.tsx b/packages/features/ee/workflows/components/WorkflowStepContainer.tsx
index 3d6309c0af..0f04106a4d 100644
--- a/packages/features/ee/workflows/components/WorkflowStepContainer.tsx
+++ b/packages/features/ee/workflows/components/WorkflowStepContainer.tsx
@@ -296,7 +296,12 @@ export default function WorkflowStepContainer(props: WorkflowStepProps) {
-
+
diff --git a/packages/features/ee/workflows/pages/index.tsx b/packages/features/ee/workflows/pages/index.tsx
index cc4c2ab085..593868cc82 100644
--- a/packages/features/ee/workflows/pages/index.tsx
+++ b/packages/features/ee/workflows/pages/index.tsx
@@ -44,7 +44,7 @@ function WorkflowsPage() {
CTA={
session.data?.hasValidLicense && data?.workflows && data?.workflows.length > 0 ? (
createMutation.mutate()}
loading={createMutation.isLoading}>
diff --git a/packages/features/eventtypes/components/CreateEventTypeButton.tsx b/packages/features/eventtypes/components/CreateEventTypeButton.tsx
index c12268f834..6448fd043a 100644
--- a/packages/features/eventtypes/components/CreateEventTypeButton.tsx
+++ b/packages/features/eventtypes/components/CreateEventTypeButton.tsx
@@ -286,7 +286,7 @@ export default function CreateEventTypeButton(props: CreateEventTypeBtnProps) {
onClick={() => openModal(props.options[0])}
data-testid="new-event-type"
StartIcon={Icon.FiPlus}
- size="fab"
+ variant="fab"
disabled={!props.canAddEvents}>
{t("new")}
@@ -295,7 +295,7 @@ export default function CreateEventTypeButton(props: CreateEventTypeBtnProps) {
{t("new")}
diff --git a/packages/features/eventtypes/components/CustomInputItem.tsx b/packages/features/eventtypes/components/CustomInputItem.tsx
index 1702fcc3a3..1bb7a93cc4 100644
--- a/packages/features/eventtypes/components/CustomInputItem.tsx
+++ b/packages/features/eventtypes/components/CustomInputItem.tsx
@@ -28,7 +28,7 @@ function CustomInputItem({ required, deleteOnClick, editOnClick, type, question
@@ -85,7 +85,7 @@ const DateOverrideList = ({
remove(index)}
/>
diff --git a/packages/features/schedules/components/NewScheduleButton.tsx b/packages/features/schedules/components/NewScheduleButton.tsx
index 65b7d5018d..2dc2089674 100644
--- a/packages/features/schedules/components/NewScheduleButton.tsx
+++ b/packages/features/schedules/components/NewScheduleButton.tsx
@@ -58,7 +58,7 @@ export function NewScheduleButton({ name = "new-schedule" }: { name?: string })
return (
-
+
{t("new")}
diff --git a/packages/features/schedules/components/Schedule.tsx b/packages/features/schedules/components/Schedule.tsx
index 1cd9b6ab76..58d1e0638c 100644
--- a/packages/features/schedules/components/Schedule.tsx
+++ b/packages/features/schedules/components/Schedule.tsx
@@ -102,11 +102,14 @@ const CopyButton = ({
@@ -181,10 +184,10 @@ export const DayRanges = ({
{index === 0 && (
{
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -193,7 +196,7 @@ export const DayRanges = ({
}}
/>
)}
- {index !== 0 && }
+ {index !== 0 && }
))}
@@ -213,7 +216,7 @@ const RemoveTimeButton = ({
return (
remove(index)}
diff --git a/packages/features/schedules/components/ScheduleListItem.tsx b/packages/features/schedules/components/ScheduleListItem.tsx
index 29e8700834..2a7a059356 100644
--- a/packages/features/schedules/components/ScheduleListItem.tsx
+++ b/packages/features/schedules/components/ScheduleListItem.tsx
@@ -73,7 +73,7 @@ export function ScheduleListItem({
-
+
{!isLoading && data && (
diff --git a/packages/features/settings/layouts/SettingsLayout.tsx b/packages/features/settings/layouts/SettingsLayout.tsx
index dc327ce11b..168060d0dc 100644
--- a/packages/features/settings/layouts/SettingsLayout.tsx
+++ b/packages/features/settings/layouts/SettingsLayout.tsx
@@ -339,7 +339,7 @@ const MobileSettingsContainer = (props: { onSideContainerOpen?: () => void }) =>
<>
-
+
{t("show_navigation")}
@@ -423,7 +423,7 @@ function ShellHeader() {
const { t, isLocaleReady } = useLocale();
return (
-
+
{meta.backButton && (
@@ -431,7 +431,9 @@ function ShellHeader() {
)}
{meta.title && isLocaleReady ? (
-
{t(meta.title)}
+
+ {t(meta.title)}
+
) : (
)}
diff --git a/packages/features/shell/Shell.tsx b/packages/features/shell/Shell.tsx
index 78aa12993c..f020a097d4 100644
--- a/packages/features/shell/Shell.tsx
+++ b/packages/features/shell/Shell.tsx
@@ -766,7 +766,7 @@ export function ShellMain(props: LayoutProps) {
{!!props.backPath && (
typeof props.backPath === "string" ? router.push(props.backPath as string) : router.back()
diff --git a/packages/features/webhooks/components/WebhookListItem.tsx b/packages/features/webhooks/components/WebhookListItem.tsx
index d1597a6d4f..6eb4c18be9 100644
--- a/packages/features/webhooks/components/WebhookListItem.tsx
+++ b/packages/features/webhooks/components/WebhookListItem.tsx
@@ -75,7 +75,7 @@ export default function WebhookListItem(props: {
{
// TODO: Confimation dialog before deleting
deleteWebhook.mutate({ id: webhook.id, eventTypeId: webhook.eventTypeId || undefined });
diff --git a/packages/lib/classNames.ts b/packages/lib/classNames.ts
index fa17f266ab..f6b6874767 100644
--- a/packages/lib/classNames.ts
+++ b/packages/lib/classNames.ts
@@ -1,3 +1,5 @@
+import { twMerge } from "tailwind-merge";
+
export default function classNames(...classes: unknown[]) {
- return classes.filter(Boolean).join(" ");
+ return twMerge(classes.filter(Boolean).join(" "));
}
diff --git a/packages/lib/package.json b/packages/lib/package.json
index 6e2af2846f..fbe66029b1 100644
--- a/packages/lib/package.json
+++ b/packages/lib/package.json
@@ -22,6 +22,7 @@
"next-i18next": "^11.3.0",
"react-hot-toast": "^2.3.0",
"rrule": "^2.7.1",
+ "tailwind-merge": "^1.8.1",
"tsdav": "2.0.3",
"tslog": "^3.2.1",
"uuid": "^8.3.2"
diff --git a/packages/lib/slots.ts b/packages/lib/slots.ts
index c9344acd3b..81a00b43fb 100644
--- a/packages/lib/slots.ts
+++ b/packages/lib/slots.ts
@@ -118,6 +118,12 @@ function buildSlots({
return slots;
}
+function fromIndex(cb: (val: T, i: number, a: T[]) => boolean, index: number) {
+ return function (e: T, i: number, a: T[]) {
+ return i >= index && cb(e, i, a);
+ };
+}
+
const getSlots = ({
inviteeDate,
frequency,
@@ -203,14 +209,25 @@ const getSlots = ({
startTime: override.start.getUTCHours() * 60 + override.start.getUTCMinutes(),
endTime: override.end.getUTCHours() * 60 + override.end.getUTCMinutes(),
}));
+ // unset all working hours that relate to this user availability override
overrides.forEach((override) => {
- const index = computedLocalAvailability.findIndex(
- (a) => !a.userIds?.length || (override.userIds[0] && a.userIds?.includes(override.userIds[0]))
- );
- if (index >= 0) {
- computedLocalAvailability[index] = override;
+ let i = -1;
+ const indexes: number[] = [];
+ while (
+ (i = computedLocalAvailability.findIndex(
+ fromIndex(
+ (a) => !a.userIds?.length || (!!override.userIds[0] && a.userIds?.includes(override.userIds[0])),
+ i + 1
+ )
+ )) != -1
+ ) {
+ indexes.push(i);
}
+ // work backwards as splice modifies the original array.
+ indexes.reverse().forEach((idx) => computedLocalAvailability.splice(idx, 1));
});
+ // and push all overrides as new computed availability
+ computedLocalAvailability.push(...overrides);
}
return buildSlots({
diff --git a/packages/prisma/seed-app-store.config.json b/packages/prisma/seed-app-store.config.json
index 01f313ddc3..e0c669cb61 100644
--- a/packages/prisma/seed-app-store.config.json
+++ b/packages/prisma/seed-app-store.config.json
@@ -155,5 +155,47 @@
"categories": ["calendar"],
"slug": "amie",
"type": "amie_other"
+ },
+ {
+ "dirName": "booking-pages-tag",
+ "categories": ["analytics"],
+ "slug": "booking-pages-tag",
+ "type": "booking-pages-tag_other",
+ "isTemplate": true
+ },
+ {
+ "dirName": "event-type-app-card",
+ "categories": ["other"],
+ "slug": "event-type-app-card",
+ "type": "event-type-app-card_other",
+ "isTemplate": true
+ },
+ {
+ "dirName": "event-type-location-video-static",
+ "categories": ["video"],
+ "slug": "event-type-location-video-static",
+ "type": "event-type-location-video-static_other",
+ "isTemplate": true
+ },
+ {
+ "dirName": "general-app-settings",
+ "categories": ["other"],
+ "slug": "general-app-settings",
+ "type": "general-app-settings_other",
+ "isTemplate": true
+ },
+ {
+ "dirName": "link-as-an-app",
+ "categories": ["other"],
+ "slug": "link-as-an-app",
+ "type": "link-as-an-app_other",
+ "isTemplate": true
+ },
+ {
+ "dirName": "basic",
+ "categories": ["other"],
+ "slug": "basic",
+ "type": "basic_other",
+ "isTemplate": true
}
]
diff --git a/packages/prisma/seed-app-store.ts b/packages/prisma/seed-app-store.ts
index 5bc0b877d7..54ce69d978 100644
--- a/packages/prisma/seed-app-store.ts
+++ b/packages/prisma/seed-app-store.ts
@@ -154,7 +154,8 @@ async function createApp(
categories: Prisma.AppCreateInput["categories"],
/** This is used so credentials gets linked to the correct app */
type: Prisma.CredentialCreateInput["type"],
- keys?: Prisma.AppCreateInput["keys"]
+ keys?: Prisma.AppCreateInput["keys"],
+ isTemplate?: boolean
) {
await prisma.app.upsert({
where: { slug },
@@ -165,7 +166,7 @@ async function createApp(
where: { type },
data: { appId: slug },
});
- console.log(`📲 Upserted app: '${slug}'`);
+ console.log(`📲 Upserted ${isTemplate ? "template" : "app"}: '${slug}'`);
}
export default async function main() {
@@ -293,7 +294,17 @@ export default async function main() {
);
for (let i = 0; i < generatedApps.length; i++) {
const generatedApp = generatedApps[i];
- await createApp(generatedApp.slug, generatedApp.dirName, generatedApp.categories, generatedApp.type);
+ if (generatedApp.isTemplate && process.argv[2] !== "seed-templates") {
+ continue;
+ }
+ await createApp(
+ generatedApp.slug,
+ generatedApp.dirName,
+ generatedApp.categories,
+ generatedApp.type,
+ undefined,
+ generatedApp.isTemplate
+ );
}
await seedAppData();
diff --git a/packages/trpc/server/routers/viewer.tsx b/packages/trpc/server/routers/viewer.tsx
index 461845f50c..d60c4ed819 100644
--- a/packages/trpc/server/routers/viewer.tsx
+++ b/packages/trpc/server/routers/viewer.tsx
@@ -473,7 +473,6 @@ const loggedInViewerRouter = router({
if (onlyInstalled) {
apps = apps.flatMap((item) => (item.credentialIds.length > 0 || item.isGlobal ? [item] : []));
}
-
return {
items: apps,
};
diff --git a/packages/trpc/server/routers/viewer/apps.tsx b/packages/trpc/server/routers/viewer/apps.tsx
index 09f54bb453..0f053e27e0 100644
--- a/packages/trpc/server/routers/viewer/apps.tsx
+++ b/packages/trpc/server/routers/viewer/apps.tsx
@@ -22,6 +22,7 @@ interface FilteredApp {
dirName: string;
keys: Prisma.JsonObject | null;
enabled: boolean;
+ isTemplate?: boolean;
}
export const appsRouter = router({
@@ -72,6 +73,7 @@ export const appsRouter = router({
keys: dbData.keys,
dirName: app.dirName || app.slug,
enabled: dbData?.enabled || false,
+ isTemplate: app.isTemplate,
});
} else {
const keysSchema = appKeysSchemas[app.dirName as keyof typeof appKeysSchemas];
diff --git a/packages/trpc/server/routers/viewer/bookings.tsx b/packages/trpc/server/routers/viewer/bookings.tsx
index 38af479dba..b4ba2b4392 100644
--- a/packages/trpc/server/routers/viewer/bookings.tsx
+++ b/packages/trpc/server/routers/viewer/bookings.tsx
@@ -241,7 +241,9 @@ export const bookingsRouter = router({
members: {
some: {
userId: user.id,
- role: "OWNER",
+ role: {
+ in: ["ADMIN", "OWNER"],
+ },
},
},
},
diff --git a/packages/types/App.d.ts b/packages/types/App.d.ts
index 783bd514be..a632c0a82e 100644
--- a/packages/types/App.d.ts
+++ b/packages/types/App.d.ts
@@ -1,5 +1,7 @@
import type { Prisma } from "@prisma/client";
+import { Tag } from "@calcom/app-store/types";
+
import { Optional } from "./utils";
type CommonProperties = {
@@ -30,9 +32,10 @@ type DynamicLinkBasedEventLocation = {
export type EventLocationTypeFromAppMeta = StaticLinkBasedEventLocation | DynamicLinkBasedEventLocation;
-type EventLocationAppData = {
- location: EventLocationTypeFromAppMeta;
-};
+type AppData = {
+ location?: EventLocationTypeFromAppMeta;
+ tag?: Tag;
+} | null;
/**
* This is the definition for an app store's app metadata.
@@ -41,7 +44,7 @@ type EventLocationAppData = {
export interface App {
/**
* @deprecated
- * Wheter if the app is installed or not. Usually we check for api keys in env
+ * Whether 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;
@@ -107,13 +110,13 @@ export interface App {
/** Optional documentation website URL */
docsUrl?: string;
/** Wether if the app is verified by Cal.com or not */
- verified: boolean;
+ verified?: boolean;
/** Wether the app should appear in the trending section of the app store */
- trending: boolean;
+ trending?: boolean;
/** Rating from 0 to 5, harcoded for now. Should be fetched later on. */
- rating: number;
+ rating?: number;
/** Number of reviews, harcoded for now. Should be fetched later on. */
- reviews: number;
+ reviews?: number;
/**
* Wheter if the app is installed globally or needs user intervention.
* Used to show Connect/Disconnect buttons in App Store
@@ -131,8 +134,10 @@ export interface App {
commission?: number;
licenseRequired?: boolean;
isProOnly?: boolean;
- appData?: EventLocationAppData;
+ appData?: AppData;
dirName?: string;
+ isTemplate?: boolean;
+ __template?: string;
}
export type AppFrontendPayload = Omit & {
diff --git a/packages/ui/components/apps/AllApps.tsx b/packages/ui/components/apps/AllApps.tsx
index aa9af0eb9a..3973dddb38 100644
--- a/packages/ui/components/apps/AllApps.tsx
+++ b/packages/ui/components/apps/AllApps.tsx
@@ -155,7 +155,12 @@ export function AllApps({ apps, searchText, categories }: AllAppsPropsType) {
: app.category === selectedCategory
: true
)
- .filter((app) => (searchText ? app.name.toLowerCase().includes(searchText.toLowerCase()) : true));
+ .filter((app) => (searchText ? app.name.toLowerCase().includes(searchText.toLowerCase()) : true))
+ .sort(function (a, b) {
+ if (a.name < b.name) return -1;
+ else if (a.name > b.name) return 1;
+ return 0;
+ });
return (
diff --git a/packages/ui/components/apps/AppCard.tsx b/packages/ui/components/apps/AppCard.tsx
index b0f05106e5..342b80bf05 100644
--- a/packages/ui/components/apps/AppCard.tsx
+++ b/packages/ui/components/apps/AppCard.tsx
@@ -72,6 +72,7 @@ export function AppCard({ app, credentials, searchText }: AppCardProps) {
}}>
{app.description}
+
)}
+ {app.isTemplate && (
+ Template
+ )}
+
{app.isGlobal && (
{t("default")}
diff --git a/packages/ui/components/apps/TrendingAppsSlider.tsx b/packages/ui/components/apps/PopularAppsSlider.tsx
similarity index 82%
rename from packages/ui/components/apps/TrendingAppsSlider.tsx
rename to packages/ui/components/apps/PopularAppsSlider.tsx
index 7e0ff29a7e..3c95ff2e70 100644
--- a/packages/ui/components/apps/TrendingAppsSlider.tsx
+++ b/packages/ui/components/apps/PopularAppsSlider.tsx
@@ -4,12 +4,12 @@ import { AppFrontendPayload as App } from "@calcom/types/App";
import { AppCard } from "./AppCard";
import { Slider } from "./Slider";
-export const TrendingAppsSlider = ({ items }: { items: T[] }) => {
+export const PopularAppsSlider = ({ items }: { items: T[] }) => {
const { t } = useLocale();
return (
- title={t("trending_apps")}
+ title={t("most_popular")}
items={items.filter((app) => !!app.trending)}
itemKey={(app) => app.name}
options={{
diff --git a/packages/ui/components/apps/Slider.tsx b/packages/ui/components/apps/Slider.tsx
index 9209bc3bff..5754d657d0 100644
--- a/packages/ui/components/apps/Slider.tsx
+++ b/packages/ui/components/apps/Slider.tsx
@@ -56,11 +56,11 @@ export const Slider = ({
`}
-
+
{isLocaleReady ? (
title && (
-
{title}
+ {title}
)
) : (
diff --git a/packages/ui/components/apps/index.ts b/packages/ui/components/apps/index.ts
index c715a7657d..359e1503fe 100644
--- a/packages/ui/components/apps/index.ts
+++ b/packages/ui/components/apps/index.ts
@@ -3,5 +3,5 @@ export { AppCard } from "./AppCard";
export { Slider } from "./Slider";
export { SkeletonLoader as AppSkeletonLoader } from "./SkeletonLoader";
export { SkeletonLoader } from "./SkeletonLoader";
-export { TrendingAppsSlider } from "./TrendingAppsSlider";
+export { PopularAppsSlider } from "./PopularAppsSlider";
export { AppStoreCategories } from "./Categories";
diff --git a/packages/ui/components/avatar/AvatarGroup.tsx b/packages/ui/components/avatar/AvatarGroup.tsx
index af5bacd673..b6bc736153 100644
--- a/packages/ui/components/avatar/AvatarGroup.tsx
+++ b/packages/ui/components/avatar/AvatarGroup.tsx
@@ -20,7 +20,7 @@ export const AvatarGroup = function AvatarGroup(props: AvatarGroupProps) {
const truncateAfter = props.truncateAfter || 4;
return (
-
+
{avatars.map((item, enumerator) => {
if (item.image != null) {
if (LENGTH > truncateAfter && enumerator === truncateAfter - 1) {
diff --git a/packages/ui/components/button/Button.tsx b/packages/ui/components/button/Button.tsx
index bae939b50b..50494d1ee0 100644
--- a/packages/ui/components/button/Button.tsx
+++ b/packages/ui/components/button/Button.tsx
@@ -36,6 +36,11 @@ const buttonClasses = cva(
"inline-flex items-center text-sm font-medium relative rounded-md transition-colors",
{
variants: {
+ variant: {
+ button: "",
+ icon: "flex justify-center",
+ fab: "h-14 w-14 sm:h-9 sm:w-auto rounded-full justify-center sm:rounded-md sm:px-4 sm:py-2.5 radix-state-open:rotate-45 sm:radix-state-open:rotate-0 transition-transform radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none",
+ },
color: {
primary: "text-white dark:text-black",
secondary: "text-gray-900 dark:text-darkgray-900",
@@ -46,10 +51,6 @@ const buttonClasses = cva(
sm: "px-3 py-2 leading-4 rounded-sm" /** For backwards compatibility */,
base: "h-9 px-4 py-2.5 ",
lg: "h-[36px] px-4 py-2.5 ",
- icon: "flex justify-center min-h-[36px] min-w-[36px] ",
- // fab = floating action button, used for the main action in a page.
- // it uses the same primary classNames for desktop size
- fab: "h-14 w-14 sm:h-9 sm:w-auto rounded-full justify-center sm:rounded-md sm:px-4 sm:py-2.5 radix-state-open:rotate-45 sm:radix-state-open:rotate-0 transition-transform radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none",
},
loading: {
true: "cursor-wait",
@@ -133,8 +134,20 @@ const buttonClasses = cva(
className:
"border dark:text-white text-gray-900 hover:text-red-700 focus:text-red-700 dark:hover:text-red-700 dark:focus:text-red-700 hover:border-red-100 focus:border-red-100 hover:bg-red-100 focus:bg-red-100 focus:outline-none focus:ring-2 focus:ring-offset focus:ring-red-700",
}),
+ // https://github.com/joe-bell/cva/issues/95 created an issue about using !p-2 on the icon variants as i would expect this to take priority
+ {
+ variant: "icon",
+ size: "base",
+ className: "min-h-[36px] min-w-[36px] !p-2",
+ },
+ {
+ variant: "icon",
+ size: "sm",
+ className: "h-6 w-6 !p-1",
+ },
],
defaultVariants: {
+ variant: "button",
color: "primary",
size: "base",
},
@@ -149,6 +162,7 @@ export const Button = forwardRef
{StartIcon && (
<>
- {size === "fab" ? (
+ {variant === "fab" ? (
<>
@@ -190,14 +204,14 @@ export const Button = forwardRef
)}
>
)}
- {size === "fab" ? {props.children} : props.children}
+ {variant === "fab" ? {props.children} : props.children}
{loading && (
- {size === "fab" ? (
+ {variant === "fab" ? (
<>
>
) : (
-
+
)}
>
)}
diff --git a/packages/ui/components/button/button.stories.mdx b/packages/ui/components/button/button.stories.mdx
index e7af447208..59193f6cd4 100644
--- a/packages/ui/components/button/button.stories.mdx
+++ b/packages/ui/components/button/button.stories.mdx
@@ -65,6 +65,17 @@ Button are clickable elements that initiates user actions. Labels in the button
+
+
+
+
+
+
+
+
+
+
+
## Anatomy
Button are clickable elements that initiates user actions. Labels in the button guide users to what action will occur when the user interacts with it.
@@ -80,36 +91,41 @@ Button are clickable elements that initiates user actions. Labels in the button
-
+
Button text
Button text
Button text
Button text
+
Button text
Button text
Button text
Button text
+
Button text
Button text
Button text
Button text
+
Button text
Button text
Button text
Button text
+
Button text
Button text
Button text
Button text
+
diff --git a/packages/ui/components/buttonGroup/ButtonGroup.tsx b/packages/ui/components/buttonGroup/ButtonGroup.tsx
index 81dc8b8bb1..dd8500dbd9 100644
--- a/packages/ui/components/buttonGroup/ButtonGroup.tsx
+++ b/packages/ui/components/buttonGroup/ButtonGroup.tsx
@@ -21,7 +21,7 @@ export function ButtonGroup({ children, combined = false, containerProps }: Prop
"flex",
!combined
? "space-x-2 rtl:space-x-reverse"
- : "[&_button]:rounded-none [&_button]:ltr:border-l-0 rtl:[&_button]:border-r-0 ltr:[&>*:first-child]:rounded-l-md ltr:[&>*:first-child]:border-l rtl:[&>*:first-child]:rounded-r-md rtl:[&>*:first-child]:border-r [&_a]:rounded-none ltr:[&_a]:border-l-0 rtl:[&_a]:border-r-0 ltr:[&>*:last-child]:rounded-r-md rtl:[&>*:last-child]:rounded-l-md",
+ : "ltr:[&>*:first-child]:rounded-l-md ltr:[&>*:first-child]:border-l rtl:[&>*:first-child]:rounded-r-md rtl:[&>*:first-child]:border-r ltr:[&>*:last-child]:rounded-r-md rtl:[&>*:last-child]:rounded-l-md [&_button]:rounded-none [&_button]:ltr:border-l-0 rtl:[&_button]:border-r-0 [&_a]:rounded-none ltr:[&_a]:border-l-0 rtl:[&_a]:border-r-0",
containerProps?.className
)}>
{children}
diff --git a/packages/ui/components/buttonGroup/buttongroup.stories.mdx b/packages/ui/components/buttonGroup/buttongroup.stories.mdx
index 9dc0373ad0..fb8e1fd485 100644
--- a/packages/ui/components/buttonGroup/buttongroup.stories.mdx
+++ b/packages/ui/components/buttonGroup/buttongroup.stories.mdx
@@ -31,16 +31,16 @@ Button group enables multiple buttons to be combined into a single unit. It offe
>
-
-
-
+
+
+
-
-
-
+
+
+
@@ -52,31 +52,31 @@ Button group enables multiple buttons to be combined into a single unit. It offe
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/packages/ui/components/card/Card.tsx b/packages/ui/components/card/Card.tsx
index a20d85b07e..0bc2f432be 100644
--- a/packages/ui/components/card/Card.tsx
+++ b/packages/ui/components/card/Card.tsx
@@ -64,7 +64,7 @@ export function Card({
className={classNames(
containerProps?.className,
cardTypeByVariant[variant].card,
- "border-1 rounded-md border-gray-200 bg-white"
+ "rounded-md border border-gray-200 bg-white"
)}
{...containerProps}>
{image && (
diff --git a/packages/ui/components/dialog/Dialog.tsx b/packages/ui/components/dialog/Dialog.tsx
index d1fe17c6bd..73cf22e667 100644
--- a/packages/ui/components/dialog/Dialog.tsx
+++ b/packages/ui/components/dialog/Dialog.tsx
@@ -68,10 +68,11 @@ type DialogContentProps = React.ComponentProps(
- ({ children, title, Icon, type = "creation", ...props }, forwardedRef) => {
+ ({ children, title, Icon, disableOverflow, type = "creation", ...props }, forwardedRef) => {
return (
@@ -87,7 +88,8 @@ export const DialogContent = React.forwardRef
diff --git a/packages/ui/components/divider/Divider.tsx b/packages/ui/components/divider/Divider.tsx
index e9f39f5bb6..a14c191470 100644
--- a/packages/ui/components/divider/Divider.tsx
+++ b/packages/ui/components/divider/Divider.tsx
@@ -1,12 +1,12 @@
import { classNames } from "@calcom/lib";
export function Divider({ className, ...props }: JSX.IntrinsicElements["hr"]) {
- className = classNames(className, "gray-200");
+ className = classNames("gray-200", className);
return ;
}
export function VerticalDivider({ className, ...props }: JSX.IntrinsicElements["svg"]) {
- className = classNames(className, "mx-3");
+ className = classNames("mx-3", className);
return (
diff --git a/packages/ui/components/list/List.tsx b/packages/ui/components/list/List.tsx
index cab007727a..89ee949f5c 100644
--- a/packages/ui/components/list/List.tsx
+++ b/packages/ui/components/list/List.tsx
@@ -17,7 +17,7 @@ export function List(props: ListProps) {
"-mx-4 rounded-sm sm:mx-0 sm:overflow-hidden ",
// Add rounded top and bottome if roundContainer is true
props.roundContainer && "[&>*:first-child]:rounded-t-md [&>*:last-child]:rounded-b-md ",
- !props.noBorderTreatment && "divide-y divide-neutral-200 rounded-md border border-l border-r ",
+ !props.noBorderTreatment && "divide-y divide-gray-200 rounded-md border border-l border-r ",
props.className
)}>
{props.children}
diff --git a/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx b/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx
index 84a77c010c..5433583ec1 100644
--- a/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx
+++ b/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx
@@ -29,7 +29,7 @@ const HorizontalTabItem = function ({ name, href, linkProps, ...props }: Horizon
{...linkProps}
className={classNames(
isCurrent ? "bg-gray-200 text-gray-900" : " text-gray-600 hover:bg-gray-100 hover:text-gray-900 ",
- "inline-flex items-center justify-center whitespace-nowrap rounded-[4px] py-[10px] px-4 text-sm font-medium leading-4 md:mb-0",
+ "inline-flex items-center justify-center whitespace-nowrap rounded-[6px] py-[10px] px-4 text-sm font-medium leading-4 md:mb-0",
props.disabled && "pointer-events-none !opacity-30",
props.className
)}
diff --git a/packages/ui/components/navigation/tabs/HorizontalTabs.tsx b/packages/ui/components/navigation/tabs/HorizontalTabs.tsx
index b946c98d22..27ab54fc8f 100644
--- a/packages/ui/components/navigation/tabs/HorizontalTabs.tsx
+++ b/packages/ui/components/navigation/tabs/HorizontalTabs.tsx
@@ -10,7 +10,7 @@ const HorizontalTabs = function ({ tabs, linkProps, actions, ...props }: NavTabP
return (
{tabs.map((tab, idx) => (
diff --git a/packages/ui/components/table/TableActions.tsx b/packages/ui/components/table/TableActions.tsx
index 0e4cb1d2d6..73436fb0b8 100644
--- a/packages/ui/components/table/TableActions.tsx
+++ b/packages/ui/components/table/TableActions.tsx
@@ -45,7 +45,7 @@ export const DropdownActions = ({
{!actionTrigger ? (
-
+
) : (
{actionTrigger}
diff --git a/packages/ui/form/AddressInput.tsx b/packages/ui/form/AddressInput.tsx
index 616d903b56..ddc4efaf19 100644
--- a/packages/ui/form/AddressInput.tsx
+++ b/packages/ui/form/AddressInput.tsx
@@ -42,7 +42,7 @@ function AddressInput({ bookingForm, name, className, ...rest }: Add
{...bookingForm.register("attendeeAddress")}
name={name}
color="#D2D2D2"
- className={`${className} border-1 focus-within:border-brand dark:bg-darkgray-100 dark:border-darkgray-300 block h-10 w-full rounded-md border border-gray-300 py-px pl-10 text-sm outline-none ring-black focus-within:ring-1 disabled:text-gray-500 disabled:opacity-50 dark:text-white dark:placeholder-gray-500 dark:selection:bg-green-500 disabled:dark:text-gray-500`}
+ className={`${className} focus-within:border-brand dark:bg-darkgray-100 dark:border-darkgray-300 block h-10 w-full rounded-md border border border-gray-300 py-px pl-10 text-sm outline-none ring-black focus-within:ring-1 disabled:text-gray-500 disabled:opacity-50 dark:text-white dark:placeholder-gray-500 dark:selection:bg-green-500 disabled:dark:text-gray-500`}
/>
);
diff --git a/packages/ui/form/PhoneInput.tsx b/packages/ui/form/PhoneInput.tsx
index e8e00f5867..90c7a6cc97 100644
--- a/packages/ui/form/PhoneInput.tsx
+++ b/packages/ui/form/PhoneInput.tsx
@@ -29,7 +29,7 @@ function PhoneInput({
numberInputProps={{
className: "border-0 text-sm focus:ring-0 dark:bg-darkgray-100 dark:placeholder:text-darkgray-600",
}}
- className={`${className} border-1 focus-within:border-brand dark:bg-darkgray-100 dark:border-darkgray-300 block w-full rounded-md rounded-sm border border-gray-300 py-px pl-3 ring-black focus-within:ring-1 disabled:text-gray-500 disabled:opacity-50 dark:text-white dark:selection:bg-green-500 disabled:dark:text-gray-500`}
+ className={`${className} focus-within:border-brand dark:bg-darkgray-100 dark:border-darkgray-300 block w-full rounded-md rounded-sm border border border-gray-300 py-px pl-3 ring-black focus-within:ring-1 disabled:text-gray-500 disabled:opacity-50 dark:text-white dark:selection:bg-green-500 disabled:dark:text-gray-500`}
/>
);
}
diff --git a/packages/ui/form/fields.tsx b/packages/ui/form/fields.tsx
index 244341fd4e..59a989264d 100644
--- a/packages/ui/form/fields.tsx
+++ b/packages/ui/form/fields.tsx
@@ -75,7 +75,7 @@ const InputField = forwardRef(function InputF
diff --git a/packages/ui/form/radio-area/RadioAreaGroup.tsx b/packages/ui/form/radio-area/RadioAreaGroup.tsx
index 1eb24d531d..b1ed354734 100644
--- a/packages/ui/form/radio-area/RadioAreaGroup.tsx
+++ b/packages/ui/form/radio-area/RadioAreaGroup.tsx
@@ -14,7 +14,7 @@ const RadioArea = React.forwardRef(
type="radio"
{...props}
/>
-
+
{children}
diff --git a/packages/ui/form/radio-area/Select.tsx b/packages/ui/form/radio-area/Select.tsx
index 3d29172933..6371db64b7 100644
--- a/packages/ui/form/radio-area/Select.tsx
+++ b/packages/ui/form/radio-area/Select.tsx
@@ -42,7 +42,7 @@ export const Select = function RadioAreaSelect
type="button"
disabled={disabled}
className={classNames(
- "border-1 focus:ring-primary-500 mb-1 block w-full cursor-pointer rounded-sm border border-gray-300 bg-white p-2 text-left shadow-sm sm:text-sm",
+ "focus:ring-primary-500 mb-1 block w-full cursor-pointer rounded-sm border border border-gray-300 bg-white p-2 text-left shadow-sm sm:text-sm",
disabled && "cursor-default bg-gray-200 focus:ring-0 "
)}>
{getLabel(props.value) ?? placeholder}
diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx
index fc9b15f187..0980225564 100644
--- a/packages/ui/index.tsx
+++ b/packages/ui/index.tsx
@@ -65,7 +65,7 @@ export {
AppSkeletonLoader,
SkeletonLoader,
Slider,
- TrendingAppsSlider,
+ PopularAppsSlider,
useShouldShowArrows,
AppStoreCategories,
} from "./components/apps";
diff --git a/packages/ui/package.json b/packages/ui/package.json
index fcb3cea499..6d4cd7b648 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -22,7 +22,7 @@
"@radix-ui/react-select": "^0.1.1",
"@tanstack/react-query": "^4.3.9",
"@wojtekmaj/react-daterange-picker": "^3.3.1",
- "class-variance-authority": "^0.3.0",
+ "class-variance-authority": "^0.4.0",
"downshift": "^6.1.9",
"next": "^13.1.1",
"react": "^18.2.0",
diff --git a/yarn.lock b/yarn.lock
index e823ffee6d..75f2d1af0c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,28 +2,6 @@
# yarn lockfile v1
-"@47ng/cloak@^1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@47ng/cloak/-/cloak-1.1.0.tgz#4172ea63287d3c28aef3ac361fbe313d55647204"
- integrity sha512-47dVSPgjTiH3Fgt2CATudxJAU7Fv1WjFIo2e4tXG2UcQitqmIGf9GCgv1MnGv8ctNGPAy9gsjHnNujzuZ1bOow==
- dependencies:
- "@47ng/codec" "^1.0.1"
- "@stablelib/base64" "^1.0.1"
- "@stablelib/hex" "^1.0.1"
- "@stablelib/utf8" "^1.0.1"
- chalk "^4.1.2"
- commander "^8.3.0"
- dotenv "^10.0.0"
- s-ago "^2.2.0"
-
-"@47ng/codec@^1.0.1":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@47ng/codec/-/codec-1.1.0.tgz#ff4a3e37855fb45273152c9d8dd99f2400b57f08"
- integrity sha512-gvtA2RjijvEiYQbURPM6/Z+ySfS4lmtQ9NovDzzT+5ekeZ3M5pGiotlT94Qd+At4AYwWp7mWJLvxFn3JR+BZbA==
- dependencies:
- "@stablelib/base64" "^1.0.1"
- "@stablelib/hex" "^1.0.1"
-
"@ampproject/remapping@^2.1.0":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
@@ -31,50 +9,6 @@
dependencies:
"@jridgewell/trace-mapping" "^0.3.0"
-"@apidevtools/json-schema-ref-parser@^9.0.6":
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.0.tgz#a28015be4693af1b02bb955eb2dc2f27918f0090"
- integrity sha512-teB30tFooE3iQs2HQIKJ02D8UZA1Xy1zaczzhUjJs0CymYxeC0g+y5rCY2p8NHBM6DBUVoR8rSM4kHLj1WE9mQ==
- dependencies:
- "@jsdevtools/ono" "^7.1.3"
- "@types/json-schema" "^7.0.6"
- call-me-maybe "^1.0.1"
- js-yaml "^4.1.0"
-
-"@apidevtools/openapi-schemas@^2.0.4":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17"
- integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==
-
-"@apidevtools/swagger-methods@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267"
- integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==
-
-"@apidevtools/swagger-parser@10.0.2":
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz#f4145afb7c3a3bafe0376f003b5c3bdeae17a952"
- integrity sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==
- dependencies:
- "@apidevtools/json-schema-ref-parser" "^9.0.6"
- "@apidevtools/openapi-schemas" "^2.0.4"
- "@apidevtools/swagger-methods" "^3.0.2"
- "@jsdevtools/ono" "^7.1.3"
- call-me-maybe "^1.0.1"
- z-schema "^4.2.3"
-
-"@auth/core@^0.1.4":
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/@auth/core/-/core-0.1.4.tgz#72a15907be721ddb142c57a717b2b1695017363d"
- integrity sha512-RsGtCWzbimuTUfV0ODE8NDxiJ5iDJAR3Wedj5OgdyZxTlCxSirXKf7+6g+krE6gHG3PoOkkd6xN6QENk+D60xw==
- dependencies:
- "@panva/hkdf" "1.0.2"
- cookie "0.5.0"
- jose "4.11.1"
- oauth4webapi "2.0.5"
- preact "10.11.3"
- preact-render-to-string "5.2.3"
-
"@aws-crypto/ie11-detection@^2.0.0":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz#9c39f4a5558196636031a933ec1b4792de959d6a"
@@ -3809,11 +3743,6 @@
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-0.7.3.tgz#d274116678ffae87f6b60e90f88cc4083eefab86"
integrity sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==
-"@floating-ui/core@^1.0.5":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.1.0.tgz#0a1dee4bbce87ff71602625d33f711cafd8afc08"
- integrity sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ==
-
"@floating-ui/dom@^0.5.3":
version "0.5.4"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-0.5.4.tgz#4eae73f78bcd4bd553ae2ade30e6f1f9c73fe3f1"
@@ -3821,13 +3750,6 @@
dependencies:
"@floating-ui/core" "^0.7.3"
-"@floating-ui/dom@^1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.1.0.tgz#29fea1344fdef15b6ba270a733d20b7134fee5c2"
- integrity sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A==
- dependencies:
- "@floating-ui/core" "^1.0.5"
-
"@floating-ui/react-dom@0.7.2":
version "0.7.2"
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-0.7.2.tgz#0bf4ceccb777a140fc535c87eb5d6241c8e89864"
@@ -3836,13 +3758,6 @@
"@floating-ui/dom" "^0.5.3"
use-isomorphic-layout-effect "^1.1.1"
-"@floating-ui/react-dom@^1.0.0":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-1.1.2.tgz#214d395adf0ed5277e824505f7ee0f5a367ec239"
- integrity sha512-dtz6NGI9nfWll0TPcL5fZzhUoaWo7UpMSmhHYdABQoBA9V/BUVye4SiRa/affb4IocVZefN6HaX+ihrb3kj/dg==
- dependencies:
- "@floating-ui/dom" "^1.1.0"
-
"@formatjs/ecma402-abstract@1.11.4":
version "1.11.4"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz#b962dfc4ae84361f9f08fbce411b4e4340930eda"
@@ -3928,13 +3843,6 @@
resolved "https://registry.yarnpkg.com/@glidejs/glide/-/glide-3.5.2.tgz#7012c5920ecf202bbda44d8526fc979984b6dd54"
integrity sha512-7jGciNJ2bQ4eZLSNlSZ+VAyW63kALf420CvkEpK4lEsUfWJq9odqimci0YCiyNyMUFB+pWHwLYyNc57dijYsCg==
-"@headlessui/react@^1.5.0":
- version "1.7.7"
- resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.7.tgz#d6f8708d8943ae8ebb1a6929108234e4515ac7e8"
- integrity sha512-BqDOd/tB9u2tA0T3Z0fn18ktw+KbVwMnkxxsGPIH2hzssrQhKB5n/6StZOyvLYP/FsYtvuXfi9I0YowKPv2c1w==
- dependencies:
- client-only "^0.0.1"
-
"@heroicons/react@^1.0.6":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.6.tgz#35dd26987228b39ef2316db3b1245c42eb19e324"
@@ -4632,11 +4540,6 @@
resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-5.4.2.tgz#fedb8b4b98cf0750daf5802fa2a661edbf83892b"
integrity sha512-QIDIZ9a0NfDStgD47VaTgwiPjlw1p4QPLwjOB/9+/DqIztoQopPNNAd+HdtQMHgE+ibP3dJacd8/TVL/A1RaaA==
-"@jsdevtools/ono@^7.1.3":
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796"
- integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==
-
"@json-rpc-tools/provider@^1.5.5":
version "1.7.6"
resolved "https://registry.yarnpkg.com/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6"
@@ -4662,11 +4565,6 @@
"@json-rpc-tools/types" "^1.7.6"
"@pedrouid/environment" "^1.0.1"
-"@juggle/resize-observer@^3.4.0":
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
- integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
-
"@lexical/clipboard@0.5.0":
version "0.5.0"
resolved "https://registry.yarnpkg.com/@lexical/clipboard/-/clipboard-0.5.0.tgz#3d835289c0e1543a13a5fd032294aa2614e4373a"
@@ -5117,7 +5015,7 @@
"@otplib/plugin-crypto" "^12.0.1"
"@otplib/plugin-thirty-two" "^12.0.1"
-"@panva/hkdf@1.0.2", "@panva/hkdf@^1.0.1":
+"@panva/hkdf@^1.0.1":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.2.tgz#bab0f09d09de9fd83628220d496627681bc440d6"
integrity sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==
@@ -5183,15 +5081,6 @@
ms "2.1.3"
strip-ansi "6.0.1"
-"@prisma/debug@4.7.1":
- version "4.7.1"
- resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-4.7.1.tgz#855d2c21fb5792c0dd3204aecbf73b03f909511f"
- integrity sha512-oppjBRcTakJuAn0rANxWT9caxLKypSBT4Ajh7t+uPcO06CJOoN2Gt4VpFdw2i79U+klGAjTe/1yh8SCsTmxAhA==
- dependencies:
- "@types/debug" "4.1.7"
- debug "4.3.4"
- strip-ansi "6.0.1"
-
"@prisma/engines-version@4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe":
version "4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe"
resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.8.0-61.d6e67a83f971b175a593ccc12e15c4a757f93ffe.tgz#30401aba1029e7d32e3cb717e705a7c92ccc211e"
@@ -5202,16 +5091,6 @@
resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.8.1.tgz#8428f7dcd7912c6073024511376595017630dc85"
integrity sha512-93tctjNXcIS+i/e552IO6tqw17sX8liivv8WX9lDMCpEEe3ci+nT9F+1oHtAafqruXLepKF80i/D20Mm+ESlOw==
-"@prisma/generator-helper@^4.0.0":
- version "4.7.1"
- resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-4.7.1.tgz#1764834fa2c5224caf5add606a7bb0a6cb6ba19c"
- integrity sha512-q9mjYOyLxkLWhqjvPB5sx5J1VRegWA2eC9mwrGgA0CSMo6SzZ7xwIe4rMJKnh4a7QMUO03+HQFdv/Nz7BOWCcg==
- dependencies:
- "@prisma/debug" "4.7.1"
- "@types/cross-spawn" "6.0.2"
- chalk "4.1.2"
- cross-spawn "7.0.3"
-
"@prisma/generator-helper@~3.8.1":
version "3.8.1"
resolved "https://registry.yarnpkg.com/@prisma/generator-helper/-/generator-helper-3.8.1.tgz#eb1dcc8382faa17c784a9d0e0d79fd207a222aa4"
@@ -5250,21 +5129,6 @@
dependencies:
"@babel/runtime" "^7.13.10"
-"@radix-ui/react-accordion@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.0.1.tgz#d956e3adb9ed32c629d0ebe4c771a80843903916"
- integrity sha512-Ka7BQoyRRPwsOb0YEv0fQU8V8aCXCxAzNVI5BRN7WmPG2E1zQKKxmb86NVDqIj6uSnaahJ1E5S6bX5Lk9hTK+g==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/primitive" "1.0.0"
- "@radix-ui/react-collapsible" "1.0.1"
- "@radix-ui/react-collection" "1.0.1"
- "@radix-ui/react-compose-refs" "1.0.0"
- "@radix-ui/react-context" "1.0.0"
- "@radix-ui/react-id" "1.0.0"
- "@radix-ui/react-primitive" "1.0.1"
- "@radix-ui/react-use-controllable-state" "1.0.0"
-
"@radix-ui/react-arrow@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.0.tgz#c461f4c2cab3317e3d42a1ae62910a4cbb0192a1"
@@ -5292,21 +5156,6 @@
"@radix-ui/react-use-callback-ref" "1.0.0"
"@radix-ui/react-use-layout-effect" "1.0.0"
-"@radix-ui/react-collapsible@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.0.1.tgz#7184312ce18e703628b9ef75cdc44b896d6f06b1"
- integrity sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/primitive" "1.0.0"
- "@radix-ui/react-compose-refs" "1.0.0"
- "@radix-ui/react-context" "1.0.0"
- "@radix-ui/react-id" "1.0.0"
- "@radix-ui/react-presence" "1.0.0"
- "@radix-ui/react-primitive" "1.0.1"
- "@radix-ui/react-use-controllable-state" "1.0.0"
- "@radix-ui/react-use-layout-effect" "1.0.0"
-
"@radix-ui/react-collapsible@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.0.0.tgz#0d94fc847c2d4bee1ab646d15c87bd3be6448873"
@@ -5344,17 +5193,6 @@
"@radix-ui/react-primitive" "1.0.0"
"@radix-ui/react-slot" "1.0.0"
-"@radix-ui/react-collection@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.1.tgz#259506f97c6703b36291826768d3c1337edd1de5"
- integrity sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/react-compose-refs" "1.0.0"
- "@radix-ui/react-context" "1.0.0"
- "@radix-ui/react-primitive" "1.0.1"
- "@radix-ui/react-slot" "1.0.1"
-
"@radix-ui/react-compose-refs@0.1.0":
version "0.1.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-0.1.0.tgz#cff6e780a0f73778b976acff2c2a5b6551caab95"
@@ -5562,27 +5400,6 @@
aria-hidden "^1.1.1"
react-remove-scroll "2.5.4"
-"@radix-ui/react-navigation-menu@^1.0.0":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.1.tgz#84f24d90e6448a0c83d3431c6eefbea73dc7522e"
- integrity sha512-Khgf+LwqYfUpbFAHcFPDMj6ZrWxnwCgC96liLYwE48x9YJbXGlutOWzZaSzrgl82xS+PwoPLQunfDe/i4ZITRA==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/primitive" "1.0.0"
- "@radix-ui/react-collection" "1.0.1"
- "@radix-ui/react-compose-refs" "1.0.0"
- "@radix-ui/react-context" "1.0.0"
- "@radix-ui/react-direction" "1.0.0"
- "@radix-ui/react-dismissable-layer" "1.0.2"
- "@radix-ui/react-id" "1.0.0"
- "@radix-ui/react-presence" "1.0.0"
- "@radix-ui/react-primitive" "1.0.1"
- "@radix-ui/react-use-callback-ref" "1.0.0"
- "@radix-ui/react-use-controllable-state" "1.0.0"
- "@radix-ui/react-use-layout-effect" "1.0.0"
- "@radix-ui/react-use-previous" "1.0.0"
- "@radix-ui/react-visually-hidden" "1.0.1"
-
"@radix-ui/react-popover@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.0.tgz#5ee72013089fdf9038417fc1eb98a749c17457fd"
@@ -5751,22 +5568,6 @@
"@radix-ui/react-use-callback-ref" "1.0.0"
"@radix-ui/react-use-controllable-state" "1.0.0"
-"@radix-ui/react-roving-focus@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz#475621f63aee43faa183a5270f35d49e530de3d7"
- integrity sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/primitive" "1.0.0"
- "@radix-ui/react-collection" "1.0.1"
- "@radix-ui/react-compose-refs" "1.0.0"
- "@radix-ui/react-context" "1.0.0"
- "@radix-ui/react-direction" "1.0.0"
- "@radix-ui/react-id" "1.0.0"
- "@radix-ui/react-primitive" "1.0.1"
- "@radix-ui/react-use-callback-ref" "1.0.0"
- "@radix-ui/react-use-controllable-state" "1.0.0"
-
"@radix-ui/react-select@^0.1.1":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-0.1.1.tgz#ceedea6856a37e4079492e1c69601797cedd2c85"
@@ -5849,21 +5650,6 @@
"@radix-ui/react-use-previous" "1.0.0"
"@radix-ui/react-use-size" "1.0.0"
-"@radix-ui/react-tabs@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.1.tgz#8fcfd6f70fe3026ff8a839b120f4e87f8d985e05"
- integrity sha512-mVNEwHwgjy2G9F7b39f9VY+jF0QUZykTm0Sdv+Uz6KC4KOEIa4HLDiHU8MeEZluRtZE3aqGYDhl93O7QbJDwhg==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/primitive" "1.0.0"
- "@radix-ui/react-context" "1.0.0"
- "@radix-ui/react-direction" "1.0.0"
- "@radix-ui/react-id" "1.0.0"
- "@radix-ui/react-presence" "1.0.0"
- "@radix-ui/react-primitive" "1.0.1"
- "@radix-ui/react-roving-focus" "1.0.1"
- "@radix-ui/react-use-controllable-state" "1.0.0"
-
"@radix-ui/react-toggle-group@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.0.tgz#6e78ffb13e0b4c1f789828930330638f4ba9c06d"
@@ -6029,14 +5815,6 @@
"@babel/runtime" "^7.13.10"
"@radix-ui/react-primitive" "1.0.0"
-"@radix-ui/react-visually-hidden@1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz#9a4ac4fc97ae8d72a10e727f16b3121b5f0aa469"
- integrity sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==
- dependencies:
- "@babel/runtime" "^7.13.10"
- "@radix-ui/react-primitive" "1.0.1"
-
"@radix-ui/rect@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.0.tgz#0dc8e6a829ea2828d53cbc94b81793ba6383bf3c"
@@ -6398,21 +6176,11 @@
resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20"
integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==
-"@stablelib/base64@^1.0.0", "@stablelib/base64@^1.0.1":
+"@stablelib/base64@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@stablelib/base64/-/base64-1.0.1.tgz#bdfc1c6d3a62d7a3b7bbc65b6cce1bb4561641be"
integrity sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==
-"@stablelib/hex@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@stablelib/hex/-/hex-1.0.1.tgz#564bd46d896941c93131d1e1869eabc17cf9bab5"
- integrity sha512-PQOEChVBjhYGgAD+ehO2ow1gSj1slre3jW4oMD4kV8VrhYhzmtsQDWDZej3BQO8qkVezdczDvISxVSF24PuYNA==
-
-"@stablelib/utf8@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@stablelib/utf8/-/utf8-1.0.1.tgz#fd5e7ad353b7e3cd1ce85e49099360e57693cfd1"
- integrity sha512-FrYD1xadah/TtAP6VJ04lDD5h9rdDj/d8wH/jMYTtHqZBv9z2btdvEU8vTxdjdkFmo1b/BH+t3R1wi/mYhCCNg==
-
"@storybook/addon-actions@6.5.13", "@storybook/addon-actions@^6.5.13":
version "6.5.13"
resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.5.13.tgz#84535dda78c7fe15fc61f19a23ed1440952f3c76"
@@ -7862,19 +7630,6 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
-"@typeform/embed-react@^1.2.4":
- version "1.21.0"
- resolved "https://registry.yarnpkg.com/@typeform/embed-react/-/embed-react-1.21.0.tgz#2e7148ebe614f68a15d8a78b581b0bc82e1c5e0d"
- integrity sha512-nZi7OD5mxZUKQjkzxAll05JU6QNWuHuCE+L/S1Vagy7fgb/rdx4iEIfvqFogTcrVw61bCS6TaAJ+ateD7vR7sw==
- dependencies:
- "@typeform/embed" "1.38.0"
- fast-deep-equal "^3.1.3"
-
-"@typeform/embed@1.38.0":
- version "1.38.0"
- resolved "https://registry.yarnpkg.com/@typeform/embed/-/embed-1.38.0.tgz#c9f95faddc8eb7a6602bafcf9a22c21b8c79349e"
- integrity sha512-qYxtwckEcRt++F1sUeILb/qmUFQ3PwcUxKedCBSseC8lFo1ukD1wmsBf+Il8YSRPKPqhTrGUG5WPaJg83n1xuw==
-
"@types/accept-language-parser@1.5.2":
version "1.5.2"
resolved "https://registry.yarnpkg.com/@types/accept-language-parser/-/accept-language-parser-1.5.2.tgz#ea48ed07a3dc9d2ba6666d45c018ad1b5e59d665"
@@ -7986,11 +7741,6 @@
dependencies:
"@types/node" "*"
-"@types/debounce@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.2.1.tgz#79b65710bc8b6d44094d286aecf38e44f9627852"
- integrity sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==
-
"@types/debug@4.1.7", "@types/debug@^4.0.0":
version "4.1.7"
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
@@ -8114,11 +7864,6 @@
dependencies:
"@types/node" "*"
-"@types/gtag.js@^0.0.10":
- version "0.0.10"
- resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.10.tgz#ac90d9b79c00daac447725a4b78ec1c398796760"
- integrity sha512-98Hy7woUb3jMAMXkZQwfIOYNyfxmI0+U4m0PpCGdnd/FHk0tDpQFCqgXdNkdEoXsKkcGya/2Gew1cAJjKJspVw==
-
"@types/hast@^2.0.0":
version "2.3.4"
resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc"
@@ -8212,7 +7957,7 @@
resolved "https://registry.yarnpkg.com/@types/json-logic-js/-/json-logic-js-1.2.1.tgz#064e777b77b0fcb77f00c2c50fec1387cb33eb47"
integrity sha512-g/g+wj/7sgazpiCHiyAtndoNiy/LodLkNG4I9MILAl0UinKKwv3GiPKbtvcE1hIoezQqgDamXfx8Lht62/hHqw==
-"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
@@ -8326,7 +8071,7 @@
dependencies:
"@types/node" "*"
-"@types/node@*", "@types/node@16.9.1", "@types/node@18.11.15", "@types/node@>=4.0", "@types/node@>=8.1.0", "@types/node@^12.12.54", "@types/node@^12.12.6", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0":
+"@types/node@*", "@types/node@16.9.1", "@types/node@>=4.0", "@types/node@>=8.1.0", "@types/node@^12.12.54", "@types/node@^12.12.6", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0":
version "16.9.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708"
integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==
@@ -8358,7 +8103,7 @@
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109"
integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==
-"@types/parse5@^6.0.0", "@types/parse5@^6.0.3":
+"@types/parse5@^6.0.3":
version "6.0.3"
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb"
integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
@@ -8409,18 +8154,13 @@
dependencies:
"@types/react" "*"
-"@types/react-dom@18.0.9", "@types/react-dom@^18.0.0", "@types/react-dom@^18.0.6":
+"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.6":
version "18.0.8"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.8.tgz#d2606d855186cd42cc1b11e63a71c39525441685"
integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==
dependencies:
"@types/react" "*"
-"@types/react-gtm-module@^2.0.1":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@types/react-gtm-module/-/react-gtm-module-2.0.1.tgz#b2c6cd14ec251d6ae7fa576edf1d43825908a378"
- integrity sha512-T/DN9gAbCYk5wJ1nxf4pSwmXz4d1iVjM++OoG+mwMfz9STMAotGjSb65gJHOS5bPvl6vLSsJnuC+y/43OQrltg==
-
"@types/react-phone-number-input@^3.0.14":
version "3.0.14"
resolved "https://registry.yarnpkg.com/@types/react-phone-number-input/-/react-phone-number-input-3.0.14.tgz#6bcccf61110bc6f445061b36b0b817c283f2fd21"
@@ -8459,7 +8199,7 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@18.0.26", "@types/react@^18.0.17":
+"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@^18.0.17":
version "18.0.17"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4"
integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==
@@ -8801,11 +8541,6 @@
resolved "https://registry.yarnpkg.com/@vanilla-extract/sprinkles/-/sprinkles-1.4.1.tgz#8c8703ddedaac355c1187db909119816c0fc771c"
integrity sha512-aW6CfMMToX4a+baLuVxwcT0FSACjX3xrNt8wdi/3LLRlLAfhyue8OK7kJxhcYNZfydBeWTP59aRy8p5FUTIeew==
-"@vercel/analytics@^0.1.6":
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-0.1.8.tgz#71f1f8c7bb98ac0c5c47eb3fb8ccbe8141b9fe47"
- integrity sha512-PQrOI8BJ9qUiVJuQfnKiJd15eDjDJH9TBKsNeMrtelT4NAk7d9mBVz1CoZkvoFnHQ0OW7Xnqmr1F2nScfAnznQ==
-
"@vercel/edge-functions-ui@^0.2.1":
version "0.2.1"
resolved "https://registry.yarnpkg.com/@vercel/edge-functions-ui/-/edge-functions-ui-0.2.1.tgz#8af0a5d8d4d544364fa79c4d075564e3a5bd972e"
@@ -9410,7 +9145,7 @@ accept-language-parser@^1.5.0:
resolved "https://registry.yarnpkg.com/accept-language-parser/-/accept-language-parser-1.5.0.tgz#8877c54040a8dcb59e0a07d9c1fde42298334791"
integrity sha1-iHfFQECo3LWeCgfZwf3kIpgzR5E=
-accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.8:
+accepts@~1.3.5, accepts@~1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
@@ -9833,11 +9568,6 @@ array-flatten@1.1.1:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
-array-flatten@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541"
- integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==
-
array-includes@^3.0.3, array-includes@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb"
@@ -10399,7 +10129,7 @@ base-x@^3.0.2, base-x@^3.0.8:
dependencies:
safe-buffer "^5.0.1"
-base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1:
+base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -10678,13 +10408,6 @@ brorand@^1.0.1, brorand@^1.1.0:
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
-brotli@^1.3.2:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48"
- integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==
- dependencies:
- base64-js "^1.1.2"
-
browser-assert@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200"
@@ -11325,11 +11048,6 @@ charenc@0.0.2:
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
-chart.js@^3.7.1:
- version "3.9.1"
- resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.9.1.tgz#3abf2c775169c4c71217a107163ac708515924b8"
- integrity sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==
-
chokidar@^2.1.8:
version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@@ -11428,10 +11146,10 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
-class-variance-authority@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.3.0.tgz#40c824bfbe5c604ecb3e337a2353b4b86278888e"
- integrity sha512-TFO+pzY9Gedqv8crPhprd647wxhvfpKevPPjiMcteEWsnkHX9yZrD1xMY3ZhRZnLwHUHCCP0LYO6KZIVag/5wQ==
+class-variance-authority@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.4.0.tgz#2ff1b5a836a68ce7a2dac0cc12f6fdc50e47f666"
+ integrity sha512-74enNN8O9ZNieycac/y8FxqgyzZhZbxmCitAtAeUrLPlxjSd5zA7LfpprmxEcOmQBnaGs5hYhiSGnJ0mqrtBLQ==
classnames@^2.2.6, classnames@^2.3.1:
version "2.3.1"
@@ -11457,14 +11175,6 @@ clean-stack@^2.0.0:
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-cleye@1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/cleye/-/cleye-1.2.1.tgz#d43c47a8cdc740ce4e38aea7ff2ef9ccb96b8eb5"
- integrity sha512-DjoWA/dFn1rQypY4juFH4IvjVxXxld4o92bmkGPR+uZNqBMpvDXx1VUmL93p2R5CBwSWt83eEe/SLPqtQahZNg==
- dependencies:
- terminal-columns "^1.4.1"
- type-flag "^2.1.0"
-
cli-boxes@^2.2.0, cli-boxes@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
@@ -11524,7 +11234,7 @@ cli-width@^3.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
-client-only@0.0.1, client-only@^0.0.1:
+client-only@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
@@ -11622,13 +11332,6 @@ co@^4.6.0:
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
-cobe@^0.4.1:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/cobe/-/cobe-0.4.2.tgz#c3787f961a30d6adfbaf6cb446c891f45a516bdf"
- integrity sha512-EHHCAWUom+dm1p5l/uy8pUiKnxzKyHXVWr4ky3Qk0Fav6Z0iW4iPMf7+nblF6uDYnd9Lk/ghbjDhwPc6b6EteA==
- dependencies:
- phenomenon "^1.6.0"
-
code-block-writer@^11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-11.0.0.tgz#5956fb186617f6740e2c3257757fea79315dd7d4"
@@ -11732,17 +11435,12 @@ command-score@^0.1.2:
resolved "https://registry.yarnpkg.com/command-score/-/command-score-0.1.2.tgz#b986ad7e8c0beba17552a56636c44ae38363d381"
integrity sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==
-commander@6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75"
- integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==
-
commander@9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.1.0.tgz#a6b263b2327f2e188c6402c42623327909f2dbec"
integrity sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==
-commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@^2.7.1, commander@^2.8.1, commander@^2.9.0:
+commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@^2.8.1, commander@^2.9.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -11858,7 +11556,7 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==
-content-disposition@0.5.4, content-disposition@^0.5.2, content-disposition@^0.5.3:
+content-disposition@0.5.4, content-disposition@^0.5.2:
version "0.5.4"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
@@ -12111,13 +11809,6 @@ cron-parser@^3.5.0:
is-nan "^1.3.2"
luxon "^1.26.0"
-cross-env@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
- integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
- dependencies:
- cross-spawn "^7.0.1"
-
cross-fetch@3.1.5, cross-fetch@^3.1.4, cross-fetch@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
@@ -12125,7 +11816,7 @@ cross-fetch@3.1.5, cross-fetch@^3.1.4, cross-fetch@^3.1.5:
dependencies:
node-fetch "2.6.7"
-cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -12363,33 +12054,6 @@ date-fns@^2.28.0:
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
-datocms-listen@^0.1.9:
- version "0.1.14"
- resolved "https://registry.yarnpkg.com/datocms-listen/-/datocms-listen-0.1.14.tgz#1cb362543b54861f5fbc3282eb9077e06626c42f"
- integrity sha512-Ijd5fzQ1Y1EUiSwduvaPRN7a6Edh//c500/2MjDhgaKd+N+zGEy7rpJ/SVXX0TdYDhX0ssoC4FDms6sbR7k+eA==
-
-datocms-structured-text-generic-html-renderer@^2.0.1, datocms-structured-text-generic-html-renderer@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/datocms-structured-text-generic-html-renderer/-/datocms-structured-text-generic-html-renderer-2.0.4.tgz#df50488b486a20f45583c2e685998873c843c1dc"
- integrity sha512-Rv5Y1eC9NZXNSz3FHvHGFvGnKEEbvG1kQWlylpCSoeDBZPBwSWAFD/ixIAOfa8Yk1EVpmoQd3KQd725WKYJwRQ==
- dependencies:
- datocms-structured-text-utils "^2.0.4"
-
-datocms-structured-text-to-plain-text@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/datocms-structured-text-to-plain-text/-/datocms-structured-text-to-plain-text-2.0.4.tgz#9798c5ea06417e7da4b4b14d1ed3dd9c0d550944"
- integrity sha512-/0VQNo6xZXiGdnHCTIoEmdnwD1JZVMMsyEfSy2SNF7QW4YAOz8bKtWSwCT4cYRKrhA/jZWCq7G4u0kPmiy1FWg==
- dependencies:
- datocms-structured-text-generic-html-renderer "^2.0.4"
- datocms-structured-text-utils "^2.0.4"
-
-datocms-structured-text-utils@^2.0.1, datocms-structured-text-utils@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/datocms-structured-text-utils/-/datocms-structured-text-utils-2.0.4.tgz#c429e6b74b90fbac228e1d28b8919f9af2c4bfff"
- integrity sha512-JxDdJaipm3FePOli9s82MRrBDnlPP9GYhqajQJaYEu4V1jwUSZzbVkYVKMfVHUfP0Gh0VSCxPHjAGGAN1nWMJg==
- dependencies:
- array-flatten "^3.0.0"
-
dayjs-business-days2@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/dayjs-business-days2/-/dayjs-business-days2-1.1.0.tgz#1e84b11f4bb7799316d208da84787e727038274d"
@@ -12407,11 +12071,6 @@ dayjs@^1.8.29:
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.4.tgz#3b3c10ca378140d8917e06ebc13a4922af4f433e"
integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==
-debounce@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
- integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
-
debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -12658,7 +12317,7 @@ depd@2.0.0:
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-depd@^1.1.0, depd@~1.1.2:
+depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
@@ -12668,11 +12327,6 @@ dequal@^2.0.0:
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d"
integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==
-dequal@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
- integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
-
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
@@ -12795,13 +12449,6 @@ dlv@^1.1.3:
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
-doctrine@3.0.0, doctrine@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
- integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
- dependencies:
- esutils "^2.0.2"
-
doctrine@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
@@ -12809,6 +12456,13 @@ doctrine@^2.1.0:
dependencies:
esutils "^2.0.2"
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
dom-accessibility-api@^0.5.9:
version "0.5.14"
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56"
@@ -12940,11 +12594,6 @@ dotenv-expand@^8.0.1:
resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz#29016757455bcc748469c83a19b36aaf2b83dd6e"
integrity sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==
-dotenv@^10.0.0:
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
- integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
-
dotenv@^16.0.0, dotenv@^16.0.1:
version "16.0.1"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d"
@@ -14608,11 +14257,6 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-fathom-client@^3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/fathom-client/-/fathom-client-3.5.0.tgz#47bf3e67fa789ec415fe6efdc0ec02b9187b4b0d"
- integrity sha512-BiRDS9Q9a8Zma0H717FWC5cvf545K/CsxBpxKT22TcSl1EbRhhlHWIJgrdeiQUfdorBK2ppy09TwMOhRsbos/A==
-
fault@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
@@ -15056,7 +14700,7 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
-fresh@0.5.2, fresh@^0.5.2:
+fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
@@ -15097,15 +14741,6 @@ fs-extra@^4.0.2:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^8.0.1:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
- integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
fs-extra@^9.0.0, fs-extra@^9.0.1:
version "9.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
@@ -15388,11 +15023,6 @@ gifwrap@^0.9.2:
image-q "^4.0.0"
omggif "^1.0.10"
-github-buttons@^2.22.0:
- version "2.22.2"
- resolved "https://registry.yarnpkg.com/github-buttons/-/github-buttons-2.22.2.tgz#09eb78d56a7d5038730f24147532473fa02b069f"
- integrity sha512-5oBDfkizyehPc0pfa07uttIvl9QlrdwruMv18ccD/T2/tlZPMDVFxv8MOxH0Rt/gxi/756/btaKwTAlfRB69Ew==
-
github-slugger@^1.0.0, github-slugger@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e"
@@ -15731,11 +15361,6 @@ gray-matter@^4.0.3:
section-matter "^1.0.0"
strip-bom-string "^1.0.0"
-gsap@^3.11.0:
- version "3.11.4"
- resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.11.4.tgz#e6d972d3509a7431b86d81d6fc3bbeb6862e5ff1"
- integrity sha512-McHhEguHyExMMnjqKA8G+7TvxmlKQGMbjgwAilnFe1e4id7V/tFveRQ2YMZhTYu0oxHGWvbPltdVYQOu3z1SCA==
-
gtoken@^5.0.4:
version "5.3.2"
resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.3.2.tgz#deb7dc876abe002178e0515e383382ea9446d58f"
@@ -15912,19 +15537,6 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
-hast-to-hyperscript@^10.0.0:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-10.0.1.tgz#3decd7cb4654bca8883f6fcbd4fb3695628c4296"
- integrity sha512-dhIVGoKCQVewFi+vz3Vt567E4ejMppS1haBRL6TEmeLeJVB1i/FJIIg/e6s1Bwn0g5qtYojHEKvyGA+OZuyifw==
- dependencies:
- "@types/unist" "^2.0.0"
- comma-separated-tokens "^2.0.0"
- property-information "^6.0.0"
- space-separated-tokens "^2.0.0"
- style-to-object "^0.3.0"
- unist-util-is "^5.0.0"
- web-namespaces "^2.0.0"
-
hast-to-hyperscript@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d"
@@ -15950,32 +15562,11 @@ hast-util-from-parse5@^6.0.0:
vfile-location "^3.2.0"
web-namespaces "^1.0.0"
-hast-util-from-parse5@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz#c129dd3a24dd8a867ab8a029ca47e27aa54864b7"
- integrity sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==
- dependencies:
- "@types/hast" "^2.0.0"
- "@types/parse5" "^6.0.0"
- "@types/unist" "^2.0.0"
- hastscript "^7.0.0"
- property-information "^6.0.0"
- vfile "^5.0.0"
- vfile-location "^4.0.0"
- web-namespaces "^2.0.0"
-
hast-util-parse-selector@^2.0.0:
version "2.2.5"
resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a"
integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==
-hast-util-parse-selector@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2"
- integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==
- dependencies:
- "@types/hast" "^2.0.0"
-
hast-util-raw@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977"
@@ -15992,30 +15583,6 @@ hast-util-raw@6.0.1:
xtend "^4.0.0"
zwitch "^1.0.0"
-hast-util-raw@^7.0.0:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99"
- integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==
- dependencies:
- "@types/hast" "^2.0.0"
- "@types/parse5" "^6.0.0"
- hast-util-from-parse5 "^7.0.0"
- hast-util-to-parse5 "^7.0.0"
- html-void-elements "^2.0.0"
- parse5 "^6.0.0"
- unist-util-position "^4.0.0"
- unist-util-visit "^4.0.0"
- vfile "^5.0.0"
- web-namespaces "^2.0.0"
- zwitch "^2.0.0"
-
-hast-util-sanitize@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz#d90f8521f5083547095c5c63a7e03150303e0286"
- integrity sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw==
- dependencies:
- "@types/hast" "^2.0.0"
-
hast-util-to-estree@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.0.2.tgz#79c5bf588915610b3f0d47ca83a74dc0269c7dc2"
@@ -16036,23 +15603,6 @@ hast-util-to-estree@^2.0.0:
unist-util-position "^4.0.0"
zwitch "^2.0.0"
-hast-util-to-html@^8.0.0:
- version "8.0.4"
- resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc"
- integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==
- dependencies:
- "@types/hast" "^2.0.0"
- "@types/unist" "^2.0.0"
- ccount "^2.0.0"
- comma-separated-tokens "^2.0.0"
- hast-util-raw "^7.0.0"
- hast-util-whitespace "^2.0.0"
- html-void-elements "^2.0.0"
- property-information "^6.0.0"
- space-separated-tokens "^2.0.0"
- stringify-entities "^4.0.0"
- zwitch "^2.0.4"
-
hast-util-to-parse5@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479"
@@ -16064,18 +15614,6 @@ hast-util-to-parse5@^6.0.0:
xtend "^4.0.0"
zwitch "^1.0.0"
-hast-util-to-parse5@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.0.0.tgz#a39808e69005d10afeed1866029a1fb137df3f7c"
- integrity sha512-YHiS6aTaZ3N0Q3nxaY/Tj98D6kM8QX5Q8xqgg8G45zR7PvWnPGPP0vcKCgb/moIydEJ/QWczVrX0JODCVeoV7A==
- dependencies:
- "@types/hast" "^2.0.0"
- "@types/parse5" "^6.0.0"
- hast-to-hyperscript "^10.0.0"
- property-information "^6.0.0"
- web-namespaces "^2.0.0"
- zwitch "^2.0.0"
-
hast-util-whitespace@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c"
@@ -16092,17 +15630,6 @@ hastscript@^6.0.0:
property-information "^5.0.0"
space-separated-tokens "^1.0.0"
-hastscript@^7.0.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b"
- integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==
- dependencies:
- "@types/hast" "^2.0.0"
- comma-separated-tokens "^2.0.0"
- hast-util-parse-selector "^3.0.0"
- property-information "^6.0.0"
- space-separated-tokens "^2.0.0"
-
he@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
@@ -16211,11 +15738,6 @@ html-void-elements@^1.0.0:
resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483"
integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==
-html-void-elements@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
- integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
-
html-webpack-plugin@^4.0.0:
version "4.5.2"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12"
@@ -16498,11 +16020,6 @@ immediate@~3.0.5:
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
-immer@^9.0.15:
- version "9.0.17"
- resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.17.tgz#7cfe8fbb8b461096444e9da7a5ec4a67c6c4adf4"
- integrity sha512-+hBruaLSQvkPfxRiTLK/mi4vLH+/VQS6z2KJahdoxlleFOI8ARqzOF17uy12eFDlqWmPoygwc5evgwcp+dlHhg==
-
immutable@^3.8.2, immutable@^3.x.x:
version "3.8.2"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
@@ -17903,16 +17420,16 @@ jose@4.10.4:
resolved "https://registry.yarnpkg.com/jose/-/jose-4.10.4.tgz#5f934b2fcf2995776e8f671f7523c6ac52c138f7"
integrity sha512-eBH77Xs9Yc/oTDvukhAEDVMijhekPuNktXJL4tUlB22jqKP1k48v5nmsUmc8feoJPsxB3HsfEt2LbVSoz+1mng==
-jose@4.11.1, jose@^4.9.3:
- version "4.11.1"
- resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.1.tgz#8f7443549befe5bddcf4bae664a9cbc1a62da4fa"
- integrity sha512-YRv4Tk/Wlug8qicwqFNFVEZSdbROCHRAC6qu/i0dyNKr5JQdoa2pIGoS04lLO/jXQX7Z9omoNewYIVIxqZBd9Q==
-
jose@^4.10.0:
version "4.11.0"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.0.tgz#1c7f5c7806383d3e836434e8f49da531cb046a9d"
integrity sha512-wLe+lJHeG8Xt6uEubS4x0LVjS/3kXXu9dGoj9BNnlhYq7Kts0Pbb2pvv5KiI0yaKH/eaiR0LUOBhOVo9ktd05A==
+jose@^4.9.3:
+ version "4.11.1"
+ resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.1.tgz#8f7443549befe5bddcf4bae664a9cbc1a62da4fa"
+ integrity sha512-YRv4Tk/Wlug8qicwqFNFVEZSdbROCHRAC6qu/i0dyNKr5JQdoa2pIGoS04lLO/jXQX7Z9omoNewYIVIxqZBd9Q==
+
jpeg-js@0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.2.tgz#8b345b1ae4abde64c2da2fe67ea216a114ac279d"
@@ -18153,15 +17670,6 @@ jsonfile@^4.0.0:
optionalDependencies:
graceful-fs "^4.1.6"
-jsonfile@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-5.0.0.tgz#e6b718f73da420d612823996fdf14a03f6ff6922"
- integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==
- dependencies:
- universalify "^0.1.2"
- optionalDependencies:
- graceful-fs "^4.1.6"
-
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
@@ -18290,11 +17798,6 @@ keccak@^3.0.0, keccak@^3.0.1:
node-gyp-build "^4.2.0"
readable-stream "^3.6.0"
-keen-slider@^6.8.0:
- version "6.8.5"
- resolved "https://registry.yarnpkg.com/keen-slider/-/keen-slider-6.8.5.tgz#1d96ff3ab77f195fc6cacd2e5aecc35d8ceb9702"
- integrity sha512-9yoosfffgTCrkmbX8kCUMWsn9KDgPSkxBof5/0yXde001D1xao7i9ppfxQCCK0MLnoCa+Rdssby0jFbTTUM4rw==
-
keypress@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77"
@@ -18680,11 +18183,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.mergewith@^4.6.2:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
- integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
-
lodash.once@^4.0.0, lodash.once@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
@@ -19180,21 +18678,6 @@ mdast-util-to-hast@10.0.1:
unist-util-position "^3.0.0"
unist-util-visit "^2.0.0"
-mdast-util-to-hast@^11.0.0:
- version "11.3.0"
- resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-11.3.0.tgz#ea9220617a710e80aa5cc3ac7cc9d4bb0440ae7a"
- integrity sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw==
- dependencies:
- "@types/hast" "^2.0.0"
- "@types/mdast" "^3.0.0"
- "@types/mdurl" "^1.0.0"
- mdast-util-definitions "^5.0.0"
- mdurl "^1.0.0"
- unist-builder "^3.0.0"
- unist-util-generated "^2.0.0"
- unist-util-position "^4.0.0"
- unist-util-visit "^4.0.0"
-
mdast-util-to-hast@^12.1.0:
version "12.1.1"
resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca"
@@ -19365,7 +18848,7 @@ merge-class-names@^1.1.1:
resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835"
integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw==
-merge-descriptors@1.0.1, merge-descriptors@^1.0.1:
+merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
@@ -19975,13 +19458,6 @@ mockdate@^3.0.5:
resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb"
integrity sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==
-modify-response-middleware@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/modify-response-middleware/-/modify-response-middleware-1.1.0.tgz#8713182390a7c7ec32dfc79b9bc626d14060d4ce"
- integrity sha512-oAyioDzMvyYwbq8tH7DvahHtGzQvDwZlN2CxL2fZQdUZNz8JJvC3PYaagiMGN58sM45Veo1GA8g/aJI7Hogpxw==
- dependencies:
- brotli "^1.3.2"
-
module-alias@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0"
@@ -20250,13 +19726,6 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0:
resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5"
integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==
-next-api-middleware@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/next-api-middleware/-/next-api-middleware-1.0.1.tgz#8dd76abeace9e10c6be29c9c9486a84cb649cc12"
- integrity sha512-t8UbZ9UUPFB7nklrHdAusn7MfoVSHtnWlRV1R0hirvLRHPDnzidTnw1Mu99Kqvc1bVC0rQSUX5kf0j/4nmEtfA==
- dependencies:
- debug "^4.3.2"
-
next-auth@^4.10.3:
version "4.17.0"
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.17.0.tgz#776d2a0999d4e2eb56968cad282c1ecd37516a2c"
@@ -20272,21 +19741,6 @@ next-auth@^4.10.3:
preact-render-to-string "^5.1.19"
uuid "^8.3.2"
-next-auth@^4.18.8:
- version "4.18.8"
- resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.18.8.tgz#34012ac107702b27779647e8787715cea948812a"
- integrity sha512-USP8ihmvB7iCGtkS0+toe2QPrzdbZfkydQZX56JOI9Ft5n/BardOXh3D4wQ2An+vpq/jDKojGlgfv21wVElW7A==
- dependencies:
- "@babel/runtime" "^7.16.3"
- "@panva/hkdf" "^1.0.1"
- cookie "^0.5.0"
- jose "^4.9.3"
- oauth "^0.9.15"
- openid-client "^5.1.0"
- preact "^10.6.3"
- preact-render-to-string "^5.1.19"
- uuid "^8.3.2"
-
next-axiom@^0.16.0:
version "0.16.0"
resolved "https://registry.yarnpkg.com/next-axiom/-/next-axiom-0.16.0.tgz#0bdde740cf51ba9f3bff0e68061c488c9a150094"
@@ -20319,15 +19773,6 @@ next-seo@^4.26.0:
resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-4.29.0.tgz#d281e95ba47914117cc99e9e468599f0547d9b9b"
integrity sha512-xmwzcz4uHaYJ8glbuhs6FSBQ7z3irmdPYdJJ5saWm72Uy3o+mPKGaPCXQetTCE6/xxVnpoDV4yFtFlEjUcljSg==
-next-swagger-doc@^0.3.4:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/next-swagger-doc/-/next-swagger-doc-0.3.6.tgz#2afc327822faf3c8e5f71f1eef6a59c730520517"
- integrity sha512-cfnWixZqBcOjitahkheK3+NVlpe+kSYh01SQlEuWJmRrj+2zeQrp9xOm4i50Ty0TGDZ95OLE2u8knyGpavX/BQ==
- dependencies:
- cleye "1.2.1"
- isarray "2.0.5"
- swagger-jsdoc "6.2.5"
-
next-themes@^0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.0.8.tgz#2a1748317085afbc2509e2c32bd04af4f0f6cb7d"
@@ -20358,11 +19803,6 @@ next-transpile-modules@^8.0.0:
enhanced-resolve "^5.7.0"
escalade "^3.1.1"
-next-validations@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/next-validations/-/next-validations-0.2.1.tgz#68010c9b017ba48eec4f404fd42eb9b0c7324737"
- integrity sha512-92pR14MPTTx0ynlvYH2TwMf7WiGiznNL/l0dtZyKPw3x48rcMhwEZrP1ZmsMJwzp5D+U+sY2deexeLWC8rlNtQ==
-
next@^13.1.1:
version "13.1.1"
resolved "https://registry.yarnpkg.com/next/-/next-13.1.1.tgz#42b825f650410649aff1017d203a088d77c80b5b"
@@ -20508,22 +19948,6 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"
-node-mocks-http@^1.11.0:
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/node-mocks-http/-/node-mocks-http-1.12.1.tgz#838e176019daf177caff6bb8534e3a32646e7531"
- integrity sha512-jrA7Sn3qI6GsHgWtUW3gMj0vO6Yz0nJjzg3jRZYjcfj4tzi8oWPauDK1qHVJoAxTbwuDHF1JiM9GISZ/ocI/ig==
- dependencies:
- accepts "^1.3.7"
- content-disposition "^0.5.3"
- depd "^1.1.0"
- fresh "^0.5.2"
- merge-descriptors "^1.0.1"
- methods "^1.1.2"
- mime "^1.3.4"
- parseurl "^1.3.3"
- range-parser "^1.2.0"
- type-is "^1.6.18"
-
node-releases@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
@@ -20688,11 +20112,6 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-oauth4webapi@2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-2.0.5.tgz#03e4ac9c29ec45423f07e47cd238cf179e0af6f8"
- integrity sha512-KmoR3KxCwmr9KvL/c/6UVzQnc4CUjo+j8NSgD3bWYlZXpUmyOVw97nDVb0BKZhCcUtGsbll16v8vsnR5JbTZ9A==
-
oauth@^0.9.15:
version "0.9.15"
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
@@ -20737,11 +20156,6 @@ object-keys@^1.0.12, object-keys@^1.1.1:
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-object-path@^0.11.8:
- version "0.11.8"
- resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742"
- integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==
-
object-visit@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
@@ -21359,7 +20773,7 @@ parse5@^5.1.1:
resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
-parseurl@^1.3.3, parseurl@~1.3.2, parseurl@~1.3.3:
+parseurl@~1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
@@ -21567,11 +20981,6 @@ pgpass@1.x:
dependencies:
split2 "^4.1.0"
-phenomenon@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/phenomenon/-/phenomenon-1.6.0.tgz#7b5b7647d0b48152cc0846994da3d92e8f6da677"
- integrity sha512-7h9/fjPD3qNlgggzm88cY58l9sudZ6Ey+UmZsizfhtawO6E3srZQXywaNm2lBwT72TbpHYRPy7ytIHeBUD/G0A==
-
phin@^2.9.1:
version "2.9.3"
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
@@ -21903,13 +21312,6 @@ postgres-interval@^1.1.0:
dependencies:
xtend "^4.0.0"
-preact-render-to-string@5.2.3:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz#23d17376182af720b1060d5a4099843c7fe92fe4"
- integrity sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==
- dependencies:
- pretty-format "^3.8.0"
-
preact-render-to-string@^5.1.19:
version "5.2.6"
resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604"
@@ -21917,11 +21319,6 @@ preact-render-to-string@^5.1.19:
dependencies:
pretty-format "^3.8.0"
-preact@10.11.3, preact@^10.6.3:
- version "10.11.3"
- resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
- integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
-
preact@10.4.1:
version "10.4.1"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431"
@@ -21932,6 +21329,11 @@ preact@^10.5.9:
resolved "https://registry.yarnpkg.com/preact/-/preact-10.10.6.tgz#1fe62aecf93974b64e6a42e09ba1f00f93207d14"
integrity sha512-w0mCL5vICUAZrh1DuHEdOWBjxdO62lvcO++jbzr8UhhYcTbFkpegLH9XX+7MadjTl/y0feoqwQ/zAnzkc/EGog==
+preact@^10.6.3:
+ version "10.11.3"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
+ integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -22029,23 +21431,6 @@ prism-react-renderer@^1.1.1:
resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz#88fc9d0df6bed06ca2b9097421349f8c2f24e30d"
integrity sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==
-prism-react-renderer@^1.3.5:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085"
- integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==
-
-prisma-field-encryption@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/prisma-field-encryption/-/prisma-field-encryption-1.4.0.tgz#fb644cf98b782c81e443f022e27b0108fe31c7ed"
- integrity sha512-ZJLIZL4IzdkZSmeVnpvW7E4/P74txf2OLZWzzfHQlkLcDJOddfIcXPytCxwHiPZX12aXfsVt0bA2T11mdA/lMw==
- dependencies:
- "@47ng/cloak" "^1.1.0"
- "@prisma/generator-helper" "^4.0.0"
- debug "^4.3.4"
- immer "^9.0.15"
- object-path "^0.11.8"
- zod "^3.17.3"
-
prisma@^4.8.1:
version "4.8.1"
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.8.1.tgz#ef93cd908809b7d02e9f4bead5eea7733ba50c68"
@@ -22394,7 +21779,7 @@ randomfill@^1.0.3:
randombytes "^2.0.5"
safe-buffer "^5.1.0"
-range-parser@^1.2.0, range-parser@^1.2.1, range-parser@~1.2.1:
+range-parser@^1.2.1, range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
@@ -22464,23 +21849,11 @@ react-calendar@^3.3.1:
merge-class-names "^1.1.1"
prop-types "^15.6.0"
-react-chartjs-2@^4.0.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-4.3.1.tgz#9941e7397fb963f28bb557addb401e9ff96c6681"
- integrity sha512-5i3mjP6tU7QSn0jvb8I4hudTzHJqS8l00ORJnVwI2sYu0ihpj83Lv2YzfxunfxTZkscKvZu2F2w9LkwNBhj6xA==
-
react-colorful@^5.6.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.0.tgz#1394165de401265d36a809a7ac87c910fad36837"
integrity sha512-2/sW7msvdPWYc6uKFteTOztlX8ujoKImv6k2TVSlqbGNbR3bsQMfTyHcca+kk8dDUe/bsfVkI3M2WOl1bKL+Lg==
-react-confetti@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/react-confetti/-/react-confetti-6.1.0.tgz#03dc4340d955acd10b174dbf301f374a06e29ce6"
- integrity sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==
- dependencies:
- tween-functions "^1.2.0"
-
react-copy-to-clipboard@5.0.4:
version "5.0.4"
resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz#42ec519b03eb9413b118af92d1780c403a5f19bf"
@@ -22505,19 +21878,6 @@ react-date-picker@^8.3.6, react-date-picker@^8.4.0:
react-fit "^1.4.0"
update-input-width "^1.2.2"
-react-datocms@^3.1.0:
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/react-datocms/-/react-datocms-3.1.4.tgz#6326ee4bf0babbff4be61609a3b56e45cea61745"
- integrity sha512-L+esZt3id1b/shQkjPmIUU+CEjwuz1ZRTMU+LylMC3uPUat3iuads/V625Bnz6blyrRxpPlcd14Uit9LxnHfcg==
- dependencies:
- datocms-listen "^0.1.9"
- datocms-structured-text-generic-html-renderer "^2.0.1"
- datocms-structured-text-utils "^2.0.1"
- react-intersection-observer "^8.33.1"
- react-string-replace "^1.1.0"
- universal-base64 "^2.1.0"
- use-deep-compare-effect "^1.6.1"
-
react-debounce-input@=3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/react-debounce-input/-/react-debounce-input-3.2.4.tgz#8204373a6498776536a2fcc7e467d054c3b729d4"
@@ -22526,13 +21886,6 @@ react-debounce-input@=3.2.4:
lodash.debounce "^4"
prop-types "^15.7.2"
-react-device-detect@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-2.2.2.tgz#dbabbce798ec359c83f574c3edb24cf1cca641a5"
- integrity sha512-zSN1gIAztUekp5qUT/ybHwQ9fmOqVT1psxpSlTn1pe0CO+fnJHKRLOWWac5nKxOxvOpD/w84hk1I+EydrJp7SA==
- dependencies:
- ua-parser-js "^1.0.2"
-
react-devtools-core@^4.19.1:
version "4.24.6"
resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.6.tgz#3262114f483465179c97a49b7ada845048f4f97e"
@@ -22583,7 +21936,7 @@ react-docgen@^6.0.0-alpha.0:
resolve "^1.17.0"
strip-indent "^3.0.0"
-react-dom@18.2.0, react-dom@^18.2.0:
+react-dom@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
@@ -22608,11 +21961,6 @@ react-element-to-jsx-string@^14.3.4:
is-plain-object "5.0.0"
react-is "17.0.2"
-react-fast-marquee@^1.3.5:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/react-fast-marquee/-/react-fast-marquee-1.3.5.tgz#e53995027102fbec92da90606d7ca89703db9903"
- integrity sha512-eOqLoz4iVVBvi2wN/web8hd2XX9y2Z6CYR7g++7nTVHlTOXBtqyARQJ9rYNpbp179hAzloMx0yBFAo8LpNYmKQ==
-
react-feather@^2.0.10:
version "2.0.10"
resolved "https://registry.yarnpkg.com/react-feather/-/react-feather-2.0.10.tgz#0e9abf05a66754f7b7bb71757ac4da7fb6be3b68"
@@ -22629,13 +21977,6 @@ react-fit@^1.4.0:
prop-types "^15.6.0"
tiny-warning "^1.0.0"
-react-github-btn@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/react-github-btn/-/react-github-btn-1.4.0.tgz#92654107e92658e60dd977c7a92b212f806da78d"
- integrity sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==
- dependencies:
- github-buttons "^2.22.0"
-
react-hook-form@^7.34.2:
version "7.34.2"
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.34.2.tgz#9ac6d1a309a7c4aaa369d1269357a70e9e9bf4de"
@@ -22687,11 +22028,6 @@ react-inspector@^5.1.0, react-inspector@^5.1.1:
is-dom "^1.0.0"
prop-types "^15.0.0"
-react-intersection-observer@^8.33.1:
- version "8.34.0"
- resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz#6f6e67831c52e6233f6b6cc7eb55814820137c42"
- integrity sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw==
-
react-intl@^5.25.1:
version "5.25.1"
resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.25.1.tgz#68a73aefc485c9bf70062381ae7f6f4791680879"
@@ -22728,7 +22064,7 @@ react-live-chat-loader@^2.7.3:
resolved "https://registry.yarnpkg.com/react-live-chat-loader/-/react-live-chat-loader-2.7.3.tgz#a66a7d64eacdf0a680570b4e9a99639a88bffaae"
integrity sha512-VviVqnF3PYDBJ77JiPZv4cpulx806L22WfsIQxvlxlEWmzKNp/0lEs57uP6EJcE+d1jQwGcR9DIsj5qouE6OkA==
-react-merge-refs@1.1.0, react-merge-refs@^1.0.0:
+react-merge-refs@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06"
integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==
@@ -22877,11 +22213,6 @@ react-ssr-prepass@^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-string-replace@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/react-string-replace/-/react-string-replace-1.1.0.tgz#a3f7b458e697e77d70b0ea663caf38ab38f7cc17"
- integrity sha512-N6RalSDFGbOHs0IJi1H611WbZsvk3ZT47Jl2JEXFbiS3kTwsdCYij70Keo/tWtLy7sfhDsYm7CwNM/WmjXIaMw==
-
react-style-singleton@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.1.tgz#ce7f90b67618be2b6b94902a30aaea152ce52e66"
@@ -22930,27 +22261,11 @@ react-transition-group@^4.3.0:
loose-envify "^1.4.0"
prop-types "^15.6.2"
-react-twemoji@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/react-twemoji/-/react-twemoji-0.3.0.tgz#8c8d5aedec8dda5cc0538043639073bcdd44c3a8"
- integrity sha512-y2ZQD3KvpZklETxz9c1NycRdUVF5nKsJ0bPNW3SaRJT+ReK36sMcneYwRPfv9EK2p3s9ph/NczDglnB8wbMJ0g==
- dependencies:
- lodash.isequal "^4.5.0"
- prop-types "^15.7.2"
- twemoji "^13.0.1"
-
react-use-intercom@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/react-use-intercom/-/react-use-intercom-1.5.1.tgz#94567a80ce3b56692962d712a54489c55fb4c54e"
integrity sha512-rsSiW3j6yv0bBWCaX+VOCK/ndh/VzntlYjxHLHhV++iQtFurFhcRD249rF07ZaLH8ZP5SR6FzP3Alqdi3usBQg==
-react-use-measure@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba"
- integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==
- dependencies:
- debounce "^1.2.1"
-
react-virtual@^2.8.2:
version "2.10.4"
resolved "https://registry.yarnpkg.com/react-virtual/-/react-virtual-2.10.4.tgz#08712f0acd79d7d6f7c4726f05651a13b24d8704"
@@ -22971,7 +22286,7 @@ react-window@^1.8.7:
"@babel/runtime" "^7.0.0"
memoize-one ">=3.1.1 <6"
-react@18.2.0, react@^18.2.0:
+react@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
@@ -23241,17 +22556,6 @@ remark-gfm@^1.0.0:
mdast-util-gfm "^0.1.0"
micromark-extension-gfm "^0.3.0"
-remark-html@^14.0.1:
- version "14.0.1"
- resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-14.0.1.tgz#2118516604c1a6c2ea9d5914a526942554e04e30"
- integrity sha512-a/x5bTlFrkwYkz43zuJIk0m0IuS5Rx8zLztGwdzmAdUj0Hsi4C4nkJ8gTQRNXY/ET/gMrqQORMMI0arRItq/aQ==
- dependencies:
- "@types/mdast" "^3.0.0"
- hast-util-sanitize "^4.0.0"
- hast-util-to-html "^8.0.0"
- mdast-util-to-hast "^11.0.0"
- unified "^10.0.0"
-
remark-mdx@1.6.22:
version "1.6.22"
resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd"
@@ -23338,15 +22642,6 @@ remark-squeeze-paragraphs@4.0.0:
dependencies:
mdast-squeeze-paragraphs "^4.0.0"
-remark-stringify@^10.0.0:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.2.tgz#50414a6983f5008eb9e72eed05f980582d1f69d7"
- integrity sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==
- dependencies:
- "@types/mdast" "^3.0.0"
- mdast-util-to-markdown "^1.0.0"
- unified "^10.0.0"
-
remark-stringify@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894"
@@ -23363,16 +22658,6 @@ remark@^13.0.0:
remark-stringify "^9.0.0"
unified "^9.1.0"
-remark@^14.0.1:
- version "14.0.2"
- resolved "https://registry.yarnpkg.com/remark/-/remark-14.0.2.tgz#4a1833f7441a5c29e44b37bb1843fb820797b40f"
- integrity sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA==
- dependencies:
- "@types/mdast" "^3.0.0"
- remark-parse "^10.0.0"
- remark-stringify "^10.0.0"
- unified "^10.0.0"
-
remarkable@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-2.0.1.tgz#280ae6627384dfb13d98ee3995627ca550a12f31"
@@ -23720,11 +23005,6 @@ rxjs@^7.5.5:
dependencies:
tslib "^2.1.0"
-s-ago@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/s-ago/-/s-ago-2.2.0.tgz#4143a9d0176b3100dcf649c78e8a1ec8a59b1312"
- integrity sha512-t6Q/aFCCJSBf5UUkR/WH0mDHX8EGm2IBQ7nQLobVLsdxOlkryYMbOlwu2D4Cf7jPUp0v1LhfPgvIZNoi9k8lUA==
-
sade@^1.7.3:
version "1.8.1"
resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701"
@@ -25149,25 +24429,6 @@ swagger-client@^3.18.5:
traverse "~0.6.6"
url "~0.11.0"
-swagger-jsdoc@6.2.5:
- version "6.2.5"
- resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-6.2.5.tgz#65bffa142276436b2b131255f59a6b55384a0e8e"
- integrity sha512-l+cdsKS2y+QDhrH1TJSUiE0y9XKuf5xaGSatjf0hR/wjTlMpO8WfubBK9d/nASdbHPMtj9iJZLBH2ogBEhL7Sw==
- dependencies:
- commander "6.2.0"
- doctrine "3.0.0"
- glob "7.1.6"
- lodash.mergewith "^4.6.2"
- swagger-parser "10.0.2"
- yaml "2.0.0-1"
-
-swagger-parser@10.0.2:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-10.0.2.tgz#d7f18faa09c9c145e938977c9bd6c3435998b667"
- integrity sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw==
- dependencies:
- "@apidevtools/swagger-parser" "10.0.2"
-
swagger-ui-react@4.11.1:
version "4.11.1"
resolved "https://registry.yarnpkg.com/swagger-ui-react/-/swagger-ui-react-4.11.1.tgz#1de7feea2f99aa292d52cfa3d31edf665eaa6181"
@@ -25232,11 +24493,6 @@ swarm-js@^0.1.40:
tar "^4.0.2"
xhr-request "^1.0.1"
-swr@^1.2.2:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/swr/-/swr-1.3.0.tgz#c6531866a35b4db37b38b72c45a63171faf9f4e8"
- integrity sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==
-
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
@@ -25389,11 +24645,6 @@ telejson@^6.0.8:
lodash "^4.17.21"
memoizerific "^1.11.3"
-terminal-columns@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/terminal-columns/-/terminal-columns-1.4.1.tgz#f669dd878afaad0c404d4b7aa01855fb6f24f1a4"
- integrity sha512-IKVL/itiMy947XWVv4IHV7a0KQXvKjj4ptbi7Ew9MPMcOLzkiQeyx3Gyvh62hKrfJ0RZc4M1nbhzjNM39Kyujw==
-
terminal-link@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
@@ -26029,11 +25280,6 @@ turbo@^1.4.3:
turbo-windows-64 "1.4.3"
turbo-windows-arm64 "1.4.3"
-tween-functions@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/tween-functions/-/tween-functions-1.2.0.tgz#1ae3a50e7c60bb3def774eac707acbca73bbc3ff"
- integrity sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==
-
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
@@ -26044,21 +25290,6 @@ tweetnacl@^1.0.3:
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
-twemoji-parser@13.1.0:
- version "13.1.0"
- resolved "https://registry.yarnpkg.com/twemoji-parser/-/twemoji-parser-13.1.0.tgz#65e7e449c59258791b22ac0b37077349127e3ea4"
- integrity sha512-AQOzLJpYlpWMy8n+0ATyKKZzWlZBJN+G0C+5lhX7Ftc2PeEVdUU/7ns2Pn2vVje26AIZ/OHwFoUbdv6YYD/wGg==
-
-twemoji@^13.0.1:
- version "13.1.1"
- resolved "https://registry.yarnpkg.com/twemoji/-/twemoji-13.1.1.tgz#6e31409908bb5383cdb1d09c9c8e7856aa6e2e3b"
- integrity sha512-IIIoq+n1lk1M1+evBKZD3DO0ud02fDQ4ssbgAv8rp3YBWUeNmskjlisFUPPDacQ50XS3bhrd4Kq9Q2gqhxb0dg==
- dependencies:
- fs-extra "^8.0.1"
- jsonfile "^5.0.0"
- twemoji-parser "13.1.0"
- universalify "^0.1.2"
-
twilio@^3.80.1:
version "3.80.1"
resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.80.1.tgz#4d9ad8221c86c4b70acd81ca1e60c245988a6449"
@@ -26135,12 +25366,7 @@ type-fest@^1.0.2, type-fest@^1.2.2:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
-type-flag@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/type-flag/-/type-flag-2.2.0.tgz#56ed3a79a3011bafba3ceb9d1a5acb633ade7884"
- integrity sha512-zumH8ohtlidBe1aqRY99OxaUY1SCdtyQlCxiXlnAyPMby6GtMem4Y7+geySt/k3MFs0pnNzQpI/nSki4yJp5Jg==
-
-type-is@^1.6.18, type-is@~1.6.18:
+type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -26193,26 +25419,11 @@ typeorm@0.3.10:
xml2js "^0.4.23"
yargs "^17.3.1"
-typescript@4.9.4:
- version "4.9.4"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
- integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==
-
typescript@^4.7.4:
version "4.7.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
-tzdata@^1.0.30:
- version "1.0.36"
- resolved "https://registry.yarnpkg.com/tzdata/-/tzdata-1.0.36.tgz#e5f3998d5e95e0e65dee417ae917a16314df69e9"
- integrity sha512-QxRODDsXS8UVxlPazCZXplqVuD6mCe7tSyDE5SCSHXv1nmrfflXxNH4pD+fjU8KJwePhWqhp6n+FpygQeGLv7w==
-
-ua-parser-js@^1.0.2:
- version "1.0.32"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.32.tgz#786bf17df97de159d5b1c9d5e8e9e89806f8a030"
- integrity sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA==
-
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
@@ -26491,11 +25702,6 @@ unist-util-visit@^4.0.0:
unist-util-is "^5.0.0"
unist-util-visit-parents "^5.0.0"
-universal-base64@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/universal-base64/-/universal-base64-2.1.0.tgz#511af92b3a07340fc2647036045aadb3bedcc320"
- integrity sha512-WeOkACVnIXJZr/qlv7++Rl1zuZOHN96v2yS5oleUuv8eJOs5j9M5U3xQEIoWqn1OzIuIcgw0fswxWnUVGDfW6g==
-
universalify@^0.1.0, universalify@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -26655,14 +25861,6 @@ use-callback-ref@^1.3.0:
dependencies:
tslib "^2.0.0"
-use-deep-compare-effect@^1.6.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz#ef0ce3b3271edb801da1ec23bf0754ef4189d0c6"
- integrity sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==
- dependencies:
- "@babel/runtime" "^7.12.5"
- dequal "^2.0.2"
-
use-isomorphic-layout-effect@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
@@ -26819,11 +26017,6 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-validator@^13.6.0:
- version "13.7.0"
- resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
- integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==
-
varint@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"
@@ -26848,14 +26041,6 @@ vfile-location@^3.0.0, vfile-location@^3.2.0:
resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c"
integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==
-vfile-location@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.0.1.tgz#06f2b9244a3565bef91f099359486a08b10d3a95"
- integrity sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==
- dependencies:
- "@types/unist" "^2.0.0"
- vfile "^5.0.0"
-
vfile-message@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
@@ -26998,11 +26183,6 @@ web-namespaces@^1.0.0:
resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec"
integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==
-web-namespaces@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
- integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==
-
web-streams-polyfill@4.0.0-beta.1:
version "4.0.0-beta.1"
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95"
@@ -27829,11 +27009,6 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-yaml@2.0.0-1:
- version "2.0.0-1"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.0-1.tgz#8c3029b3ee2028306d5bcf396980623115ff8d18"
- integrity sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==
-
yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
@@ -27972,17 +27147,6 @@ yup@^0.32.9:
property-expr "^2.0.4"
toposort "^2.0.2"
-z-schema@^4.2.3:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-4.2.4.tgz#73102a49512179b12a8ec50b1daa676b984da6e4"
- integrity sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==
- dependencies:
- lodash.get "^4.4.2"
- lodash.isequal "^4.5.0"
- validator "^13.6.0"
- optionalDependencies:
- commander "^2.7.1"
-
zenscroll@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/zenscroll/-/zenscroll-4.0.2.tgz#e8d5774d1c0738a47bcfa8729f3712e2deddeb25"
@@ -27997,7 +27161,7 @@ zod-prisma@^0.5.4:
parenthesis "^3.1.8"
ts-morph "^13.0.2"
-zod@^3.17.3, zod@^3.20.2:
+zod@^3.20.2:
version "3.20.2"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807"
integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==
@@ -28025,8 +27189,3 @@ zwitch@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1"
integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==
-
-zwitch@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7"
- integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==