From 9cc1fc9961e4aedf4fe59419b9034e603b51a9a9 Mon Sep 17 00:00:00 2001 From: Hariom Date: Wed, 11 Sep 2024 14:48:34 +0530 Subject: [PATCH 01/61] Add endpoints for testing the flow --- domain-wide-delegation.md | 44 +++++++++++ packages/app-store/googlecalendar/.gitignore | 1 + .../app-store/googlecalendar/api/index.ts | 2 + .../api/testDomainWideDelegation.ts | 73 +++++++++++++++++++ .../api/testWorkloadIdentityFederation.ts | 58 +++++++++++++++ 5 files changed, 178 insertions(+) create mode 100644 domain-wide-delegation.md create mode 100644 packages/app-store/googlecalendar/.gitignore create mode 100644 packages/app-store/googlecalendar/api/testDomainWideDelegation.ts create mode 100644 packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts diff --git a/domain-wide-delegation.md b/domain-wide-delegation.md new file mode 100644 index 00000000000000..243fb4b2209fcc --- /dev/null +++ b/domain-wide-delegation.md @@ -0,0 +1,44 @@ +# Setting up Domain-Wide Delegation for Google Calendar API + +Step 1: Create a Google Cloud Project + +Before you can create a service account, you'll need to set up a Google Cloud project. + + 1. Create a Google Cloud Project: + - Go to the Google Cloud Console + - Select Create Project + - Give your project a name and select your billing account (if applicable) + - Click Create + 2. Enable the Google Calendar API: + 1. Go to the Google Cloud Console + 2. Select API & Services → Library + 3. Search for "Google Calendar API" + 4. Click Enable + +Step 2: Create a Service Account + +A service account is needed to act on behalf of users + + 1. Navigate to the Service Accounts page: + - In the Google Cloud Console, go to IAM & Admin → Service Accounts + 2. Create a New Service Account: + - Click on Create Service Account + - Give your service account a name and description + - Click Create and Continue + +Step 3: Connecting Deployment Environment To Google Cloud Project using Workload Identity Federation + Vercel: Follow this guide: https://vercel.com/docs/security/secure-backend-access/oidc/gcp + First setup Google Cloud using the above guide and then paste the environment variables to your Vercel project. + GCP_PROJECT_ID=domain-wide-delegation-testing + GCP_PROJECT_NUMBER=777450754675 + GCP_SERVICE_ACCOUNT_EMAIL=vercel-cal-staging@domain-wide-delegation-testing.iam.gserviceaccount.com + GCP_WORKLOAD_IDENTITY_POOL_ID=vercel + GCP_WORKLOAD_IDENTITY_POOL_PROVIDER_ID=vercel + +Last Step (To Be Taken By Cal.com organization Owner/Admin): Assign Specific API Permissions via OAuth Scopes: + - Go to your Google Admin Console (admin-google-com) + - Navigate to Security → API Controls → Manage Domain-Wide Delegation + - Here, you'll authorize the service account's client ID(Unique ID) to access the Google Calendar API + - Add the necessary API scopes for Google Calendar(Full access to Google Calendar) + https://www.googleapis.com/auth/calendar + diff --git a/packages/app-store/googlecalendar/.gitignore b/packages/app-store/googlecalendar/.gitignore new file mode 100644 index 00000000000000..a34fccebd3114a --- /dev/null +++ b/packages/app-store/googlecalendar/.gitignore @@ -0,0 +1 @@ +service-account-key.json \ No newline at end of file diff --git a/packages/app-store/googlecalendar/api/index.ts b/packages/app-store/googlecalendar/api/index.ts index eb12c1b4ed2c4f..104741a7d304cb 100644 --- a/packages/app-store/googlecalendar/api/index.ts +++ b/packages/app-store/googlecalendar/api/index.ts @@ -1,2 +1,4 @@ export { default as add } from "./add"; export { default as callback } from "./callback"; +export { default as testDomainWideDelegation } from "./testDomainWideDelegation"; +export { default as testWorkloadIdentityFederation } from "./testWorkloadIdentityFederation"; diff --git a/packages/app-store/googlecalendar/api/testDomainWideDelegation.ts b/packages/app-store/googlecalendar/api/testDomainWideDelegation.ts new file mode 100644 index 00000000000000..89762ec5b0629c --- /dev/null +++ b/packages/app-store/googlecalendar/api/testDomainWideDelegation.ts @@ -0,0 +1,73 @@ +import fs from "fs"; +import { JWT } from "google-auth-library"; +import { google } from "googleapis"; +import type { NextApiRequest, NextApiResponse } from "next"; +import path from "path"; + +import { defaultHandler, defaultResponder } from "@calcom/lib/server"; + +const calendar = google.calendar("v3"); +const scopes = ["https://www.googleapis.com/auth/calendar"]; + +function getKey() { + const keyPath = path.join( + process.cwd(), + "../../packages/app-store/googlecalendar/api/service-account-key.json" + ); + console.log("keyPath", keyPath); + return JSON.parse(fs.readFileSync(keyPath, "utf8")); +} + +async function createCalendarEvent({ userToImpersonate }: { userToImpersonate: string }) { + try { + const key = getKey(); + + const authClient = new JWT({ + email: key.client_email, + key: key.private_key, + scopes: scopes, + subject: userToImpersonate, + }); + + await authClient.authorize(); + + const event = { + summary: "Test Meeting - Domain-Wide Delegation", + description: "Discuss project updates and plans.", + start: { + dateTime: new Date().toISOString(), + timeZone: "America/Los_Angeles", + }, + end: { + dateTime: new Date(new Date().getTime() + 1 * 60 * 60 * 1000).toISOString(), + timeZone: "America/Los_Angeles", + }, + attendees: [{ email: "attendee1@domain.com" }, { email: "attendee2@domain.com" }], + }; + + const response = await calendar.events.insert({ + auth: authClient, + calendarId: "primary", + requestBody: event, + }); + + console.log(`Event created: ${response.data.htmlLink}`); + return response.data.htmlLink; + } catch (error) { + console.error("Error creating calendar event:", error); + throw error; + } +} + +async function getHandler(req: NextApiRequest, res: NextApiResponse) { + const userToImpersonate = req.query.userToImpersonate as string | undefined; + if (!userToImpersonate) { + return res.status(400).json({ error: "userToImpersonate query parameter is required" }); + } + const link = await createCalendarEvent({ userToImpersonate }); + return res.json({ link }); +} + +export default defaultHandler({ + GET: Promise.resolve({ default: defaultResponder(getHandler) }), +}); diff --git a/packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts b/packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts new file mode 100644 index 00000000000000..317e69685f6b45 --- /dev/null +++ b/packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts @@ -0,0 +1,58 @@ +import { GoogleAuth } from "google-auth-library"; +import { google } from "googleapis"; +import type { NextApiRequest, NextApiResponse } from "next"; + +import { defaultHandler, defaultResponder } from "@calcom/lib/server"; + +const scopes = ["https://www.googleapis.com/auth/calendar"]; + +async function createCalendarEvent({ userToImpersonate }: { userToImpersonate: string }) { + const calendar = google.calendar("v3"); + try { + const auth = new GoogleAuth({ + scopes, + // eslint-disable-next-line turbo/no-undeclared-env-vars + projectId: process.env.GCP_PROJECT_ID, + clientOptions: { + subject: userToImpersonate, + }, + }); + + const authClient = await auth.getClient(); + + const event = { + summary: "Test Meeting - Workload Identity Federation", + description: "Discuss project updates and plans.", + start: { + dateTime: new Date().toISOString(), + timeZone: "America/Los_Angeles", + }, + end: { + dateTime: new Date(new Date().getTime() + 1 * 60 * 60 * 1000).toISOString(), + timeZone: "America/Los_Angeles", + }, + attendees: [{ email: "attendee1@domain.com" }, { email: "attendee2@domain.com" }], + }; + + const response = await calendar.events.insert({ + auth: authClient, + calendarId: "primary", + requestBody: event, + }); + console.log(`Event created: ${response.data.htmlLink}`); + return response.data.htmlLink; + } catch (error) { + console.error("Error creating calendar event:", error); + throw error; + } +} + +async function getHandler(req: NextApiRequest, res: NextApiResponse) { + const userToImpersonate = req.query.userToImpersonate as string; + const link = await createCalendarEvent({ userToImpersonate }); + return res.json({ link }); +} + +export default defaultHandler({ + GET: Promise.resolve({ default: defaultResponder(getHandler) }), +}); From cf74351f6f5d5ca387b6b244c55640df7669b8af Mon Sep 17 00:00:00 2001 From: Hariom Date: Fri, 13 Sep 2024 11:56:15 +0530 Subject: [PATCH 02/61] Add MVP --- TODO.md | 3 + apps/web/components/apps/AppPage.tsx | 22 +- .../settings/admin/domainWideDelegation.tsx | 287 + apps/web/tsconfig.json | 3 +- domain-wide-delegation.md | 12 +- packages/app-store/_utils/installation.ts | 18 +- .../app-store/_utils/useAddAppMutation.ts | 7 +- packages/app-store/around/api/_getAdd.ts | 2 +- packages/app-store/closecom/api/_getAdd.ts | 2 +- packages/app-store/googlecalendar/.gitignore | 1 - packages/app-store/googlecalendar/api/add.ts | 41 +- .../app-store/googlecalendar/api/index.ts | 2 - .../api/testDomainWideDelegation.ts | 73 - .../api/testWorkloadIdentityFederation.ts | 58 - .../googlecalendar/lib/CalendarService.ts | 55 + .../app-store/googlecalendar/package.json | 1 + packages/app-store/ping/api/_getAdd.ts | 2 +- packages/app-store/riverside/api/_getAdd.ts | 2 +- packages/app-store/sendgrid/api/_getAdd.ts | 2 +- packages/app-store/tsconfig.json | 2 +- packages/app-store/whereby/api/_getAdd.ts | 2 +- packages/core/CalendarManager.ts | 3 +- packages/lib/server/repository/credential.ts | 8 + .../server/repository/domainWideDelegation.ts | 90 + .../lib/server/repository/organization.ts | 52 + .../migration.sql | 19 + .../migration.sql | 5 + packages/prisma/schema.prisma | 21 + .../server/routers/viewer/admin/_router.ts | 52 + .../admin/domainWideDelegation.handler.ts | 147 + packages/trpc/server/trpc.ts | 13 +- yarn.lock | 5754 +---------------- 32 files changed, 920 insertions(+), 5841 deletions(-) create mode 100644 TODO.md create mode 100644 apps/web/pages/settings/admin/domainWideDelegation.tsx delete mode 100644 packages/app-store/googlecalendar/.gitignore delete mode 100644 packages/app-store/googlecalendar/api/testDomainWideDelegation.ts delete mode 100644 packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts create mode 100644 packages/lib/server/repository/domainWideDelegation.ts create mode 100644 packages/prisma/migrations/20240912093050_add_domain_delegation_table/migration.sql create mode 100644 packages/prisma/migrations/20240913062323_add_delegated_to_field_to_credential/migration.sql create mode 100644 packages/trpc/server/routers/viewer/admin/domainWideDelegation.handler.ts diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000000000..8b39a3600e0db4 --- /dev/null +++ b/TODO.md @@ -0,0 +1,3 @@ +- TODO + - Google Meet App to handle Domain wide delegation + - Disable multiple installations of Google Calendar app if Domain wide delegation is enabled(If Domain wide delegation is enabled, should we disable multiple installations of Google Calendar app?) \ No newline at end of file diff --git a/apps/web/components/apps/AppPage.tsx b/apps/web/components/apps/AppPage.tsx index ac556f7045ca92..43cda33797b00a 100644 --- a/apps/web/components/apps/AppPage.tsx +++ b/apps/web/components/apps/AppPage.tsx @@ -19,6 +19,19 @@ import { Badge, Button, Icon, SkeletonButton, SkeletonText, showToast } from "@c import { InstallAppButtonChild } from "./InstallAppButtonChild"; +function isAllowedMultipleInstalls({ + categories, + variant, +}: { + categories: string[]; + variant: string; +}): boolean { + // TODO: We could disable it for Domain-wide delegation cases here but for now backend does it when someone tries to install the app + const isCalendarApp = categories.includes("calendar"); + const isOtherVariant = variant === "other"; + return isCalendarApp && !isOtherVariant; +} + export type AppPageProps = { name: string; description: AppType["description"]; @@ -79,12 +92,14 @@ export const AppPage = ({ const searchParams = useCompatSearchParams(); const hasDescriptionItems = descriptionItems && descriptionItems.length > 0; + const utils = trpc.useUtils(); const mutation = useAddAppMutation(null, { - onSuccess: (data) => { + onSuccess: async (data) => { if (data?.setupPending) return; setIsLoading(false); - showToast(t("app_successfully_installed"), "success"); + showToast(data?.message || t("app_successfully_installed"), "success"); + await utils.viewer.appCredentialsByType.invalidate({ appType: type }); }, onError: (error) => { if (error instanceof Error) showToast(error.message || t("app_could_not_be_installed"), "error"); @@ -161,7 +176,8 @@ export const AppPage = ({ // variant not other allows, an app to be shown in calendar category without requiring an actual calendar connection e.g. vimcal // Such apps, can only be installed once. - const allowedMultipleInstalls = categories.indexOf("calendar") > -1 && variant !== "other"; + + const allowedMultipleInstalls = isAllowedMultipleInstalls({ categories, variant }); useEffect(() => { if (searchParams?.get("defaultInstall") === "true") { mutation.mutate({ type, variant, slug, defaultInstall: true }); diff --git a/apps/web/pages/settings/admin/domainWideDelegation.tsx b/apps/web/pages/settings/admin/domainWideDelegation.tsx new file mode 100644 index 00000000000000..d414878c8a036c --- /dev/null +++ b/apps/web/pages/settings/admin/domainWideDelegation.tsx @@ -0,0 +1,287 @@ +"use client"; + +import { useState } from "react"; +import { useForm, Controller } from "react-hook-form"; + +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { trpc } from "@calcom/trpc/react"; +import { + Button, + Form, + Meta, + Switch, + showToast, + Dialog, + DialogContent, + DialogFooter, + DialogClose, + List, + TextField, + SelectField, + TextAreaField, +} from "@calcom/ui"; + +import PageWrapper from "@components/PageWrapper"; +import { getLayout } from "@components/auth/layouts/AdminLayout"; + +const DomainWideDelegationPage = () => { + const { t } = useLocale(); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [editingDelegation, setEditingDelegation] = useState(null); + + const { + data: domainWideDelegations, + isLoading, + error, + } = trpc.viewer.admin.domainWideDelegation.list.useQuery(); + + if (error) { + return ; + } + if (isLoading) return ; + const defaultValues = !editingDelegation + ? { + workspacePlatform: "GOOGLE", + serviceAccountKey: "", + organizationId: null, + enabled: true, + } + : editingDelegation; + return ( + <> + + + + + ); + + function handleAdd() { + setEditingDelegation(null); + setIsDialogOpen(true); + } + + function handleEdit(delegation) { + setEditingDelegation(delegation); + setIsDialogOpen(true); + } + + function handleToggle(delegation, checked) { + updateMutation.mutate({ ...delegation, enabled: checked }); + } +}; + +function LoadingState() { + return
Loading...
; +} + +function ErrorState() { + return
Some error occurred
; +} + +function PageContent({ domainWideDelegations, onAdd, onEdit, onToggle }) { + const { t } = useLocale(); + return ( +
+
+

{t("domain_wide_delegation")}

+

{t("domain_wide_delegation_description")}

+
+ {domainWideDelegations.length === 0 ? ( + + ) : ( + + )} +
+ ); +} + +function EmptyState({ onAdd }) { + const { t } = useLocale(); + + return ( +
+

{t("no_domain_wide_delegations")}

+ +
+ ); +} + +function DelegationList({ delegations, onEdit, onToggle, onAdd }) { + const { t } = useLocale(); + + return ( + <> + + {delegations.map((delegation) => ( + + ))} + +
+ +
+ + ); +} + +function DelegationListItem({ delegation, onEdit, onToggle }) { + const { t } = useLocale(); + const utils = trpc.useContext(); + const deleteMutation = trpc.viewer.admin.domainWideDelegation.delete.useMutation({ + onSuccess: () => { + showToast(t("domain_wide_delegation_deleted_successfully"), "success"); + utils.viewer.admin.domainWideDelegation.list.invalidate(); + }, + onError: (error) => { + showToast(error.message, "error"); + }, + }); + + const handleDelete = () => { + if (window.confirm(t("confirm_delete_domain_wide_delegation"))) { + deleteMutation.mutate({ id: delegation.id }); + } + }; + + return ( +
  • +
    +

    {delegation.organizationId}

    +

    {delegation.workspacePlatform}

    +
    +
    + onToggle(delegation, checked)} /> + + +
    +
  • + ); +} + +function CreateUpdateDelegationDialog({ isOpen, onOpenChange, editingDelegation, defaultValues }) { + const { t } = useLocale(); + const form = useForm({ + defaultValues, + }); + + const utils = trpc.useContext(); + + const updateMutation = trpc.viewer.admin.domainWideDelegation.update.useMutation({ + onSuccess: handleMutationSuccess, + onError: handleMutationError, + }); + + const addMutation = trpc.viewer.admin.domainWideDelegation.add.useMutation({ + onSuccess: handleMutationSuccess, + onError: handleMutationError, + }); + + function onSubmit(values) { + if (editingDelegation) { + updateMutation.mutate({ ...values, id: editingDelegation.id }); + } else { + addMutation.mutate(values); + } + } + + function handleMutationSuccess() { + showToast(t("domain_wide_delegation_updated_successfully"), "success"); + onOpenChange(false); + utils.viewer.admin.domainWideDelegation.list.invalidate(); + } + + function handleMutationError(error) { + showToast(error.message, "error"); + } + + return ( + + +
    +
    + + ( + { + onChange(option?.value); + }} + value={[ + { value: "GOOGLE", label: "Google" }, + { value: "MICROSOFT", label: "Microsoft" }, + ].find((opt) => opt.value === value)} + options={[ + { value: "GOOGLE", label: "Google" }, + { value: "MICROSOFT", label: "Microsoft" }, + ]} + /> + )} + /> + {!editingDelegation && ( + + )} + ( + + )} + /> +
    + + + + +
    +
    +
    + ); +} + +DomainWideDelegationPage.getLayout = getLayout; +DomainWideDelegationPage.PageWrapper = PageWrapper; + +export default DomainWideDelegationPage; diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index f9ca9f15ff11ac..ee7275489bb3f0 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -8,7 +8,8 @@ "@pages/*": ["pages/*"], "@lib/*": ["lib/*"], "@server/*": ["server/*"], - "@prisma/client/*": ["@calcom/prisma/client/*"] + "@prisma/client/*": ["@calcom/prisma/client/*"], + "@calcom/repository/*": ["@calcom/lib/server/repository/*"] }, "plugins": [ { diff --git a/domain-wide-delegation.md b/domain-wide-delegation.md index 243fb4b2209fcc..ac848fccc3c3f0 100644 --- a/domain-wide-delegation.md +++ b/domain-wide-delegation.md @@ -26,19 +26,9 @@ A service account is needed to act on behalf of users - Give your service account a name and description - Click Create and Continue -Step 3: Connecting Deployment Environment To Google Cloud Project using Workload Identity Federation - Vercel: Follow this guide: https://vercel.com/docs/security/secure-backend-access/oidc/gcp - First setup Google Cloud using the above guide and then paste the environment variables to your Vercel project. - GCP_PROJECT_ID=domain-wide-delegation-testing - GCP_PROJECT_NUMBER=777450754675 - GCP_SERVICE_ACCOUNT_EMAIL=vercel-cal-staging@domain-wide-delegation-testing.iam.gserviceaccount.com - GCP_WORKLOAD_IDENTITY_POOL_ID=vercel - GCP_WORKLOAD_IDENTITY_POOL_PROVIDER_ID=vercel - Last Step (To Be Taken By Cal.com organization Owner/Admin): Assign Specific API Permissions via OAuth Scopes: - Go to your Google Admin Console (admin-google-com) - Navigate to Security → API Controls → Manage Domain-Wide Delegation - Here, you'll authorize the service account's client ID(Unique ID) to access the Google Calendar API - Add the necessary API scopes for Google Calendar(Full access to Google Calendar) - https://www.googleapis.com/auth/calendar - + https://www.googleapis.com/auth/calendar \ No newline at end of file diff --git a/packages/app-store/_utils/installation.ts b/packages/app-store/_utils/installation.ts index 16d45bed7ff02b..6d8575266bd452 100644 --- a/packages/app-store/_utils/installation.ts +++ b/packages/app-store/_utils/installation.ts @@ -1,21 +1,22 @@ import type { Prisma } from "@prisma/client"; import { HttpError } from "@calcom/lib/http-error"; +import { CredentialRepository } from "@calcom/lib/server/repository/credential"; import prisma from "@calcom/prisma"; import type { UserProfile } from "@calcom/types/UserProfile"; -export async function checkInstalled(slug: string, userId: number) { - const alreadyInstalled = await prisma.credential.findFirst({ - where: { - appId: slug, - userId: userId, - }, - }); +export async function assertInstalled(slug: string, userId: number) { + const alreadyInstalled = await CredentialRepository.findByAppIdAndUserId({ appId: slug, userId }); if (alreadyInstalled) { throw new HttpError({ statusCode: 422, message: "Already installed" }); } } +export async function isAppInstalled({ appId, userId }: { appId: string; userId: number }) { + const alreadyInstalled = await CredentialRepository.findByAppIdAndUserId({ appId, userId }); + return !!alreadyInstalled; +} + type InstallationArgs = { appType: string; user: { @@ -28,6 +29,7 @@ type InstallationArgs = { subscriptionId?: string | null; paymentStatus?: string | null; billingCycleStart?: number | null; + delegatedToId?: string; }; export async function createDefaultInstallation({ @@ -39,6 +41,7 @@ export async function createDefaultInstallation({ billingCycleStart, paymentStatus, subscriptionId, + delegatedToId, }: InstallationArgs) { const installation = await prisma.credential.create({ data: { @@ -49,6 +52,7 @@ export async function createDefaultInstallation({ subscriptionId, paymentStatus, billingCycleStart, + delegatedToId, }, }); if (!installation) { diff --git a/packages/app-store/_utils/useAddAppMutation.ts b/packages/app-store/_utils/useAddAppMutation.ts index 98c4e632cb903a..a929d53a0e4518 100644 --- a/packages/app-store/_utils/useAddAppMutation.ts +++ b/packages/app-store/_utils/useAddAppMutation.ts @@ -94,18 +94,19 @@ function useAddAppMutation(_type: App["type"] | null, options?: UseAddAppMutatio if (externalUrl) { // TODO: For Omni installation to authenticate and come back to the page where installation was initiated, some changes need to be done in all apps' add callbacks gotoUrl(json.url, json.newTab); - return { setupPending: !json.newTab }; + return { setupPending: !json.newTab, message: json.message }; } else if (json.url) { gotoUrl(json.url, json.newTab); return { setupPending: json?.url?.endsWith("/setup") || json?.url?.includes("/apps/installation/event-types"), + message: json.message, }; } else if (returnTo) { gotoUrl(returnTo, false); - return { setupPending: true }; + return { setupPending: true, message: json.message }; } else { - return { setupPending: false }; + return { setupPending: false, message: json.message }; } }, }); diff --git a/packages/app-store/around/api/_getAdd.ts b/packages/app-store/around/api/_getAdd.ts index 17b7933dcf6bc4..69ae895dba66b2 100644 --- a/packages/app-store/around/api/_getAdd.ts +++ b/packages/app-store/around/api/_getAdd.ts @@ -15,7 +15,7 @@ export async function getHandler(req: NextApiRequest) { const teamId = req.query.teamId ? Number(req.query.teamId) : undefined; const returnTo = req.query?.returnTo; - await checkInstalled(slug, session.user.id); + await assertInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/app-store/closecom/api/_getAdd.ts b/packages/app-store/closecom/api/_getAdd.ts index 2701c40ce213ed..556f8c13209255 100644 --- a/packages/app-store/closecom/api/_getAdd.ts +++ b/packages/app-store/closecom/api/_getAdd.ts @@ -5,7 +5,7 @@ import { checkInstalled } from "../../_utils/installation"; export default async function handler(req: NextApiRequest, res: NextApiResponse) { const session = checkSession(req); - await checkInstalled("closecom", session.user?.id); + await assertInstalled("closecom", session.user?.id); const returnTo = req.query.returnTo; diff --git a/packages/app-store/googlecalendar/.gitignore b/packages/app-store/googlecalendar/.gitignore deleted file mode 100644 index a34fccebd3114a..00000000000000 --- a/packages/app-store/googlecalendar/.gitignore +++ /dev/null @@ -1 +0,0 @@ -service-account-key.json \ No newline at end of file diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index e4e841f19bf902..2e0610e8d5a59f 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -1,15 +1,54 @@ import { google } from "googleapis"; import type { NextApiRequest, NextApiResponse } from "next"; +import { createDefaultInstallation, isAppInstalled } from "@calcom/app-store/_utils/installation"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; +import { HttpError } from "@calcom/lib/http-error"; +import logger from "@calcom/lib/logger"; import { defaultHandler, defaultResponder } from "@calcom/lib/server"; +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; import { encodeOAuthState } from "../../_utils/oauth/encodeOAuthState"; +import { metadata } from "../_metadata"; import { SCOPES } from "../lib/constants"; import { getGoogleAppKeys } from "../lib/getGoogleAppKeys"; async function getHandler(req: NextApiRequest, res: NextApiResponse) { - // Get token from Google Calendar API + if (!req.session?.user) { + throw new HttpError({ statusCode: 401, message: "You must be logged in to do this" }); + } + + const loggedInUser = req.session.user; + const domainWideDelegation = await DomainWideDelegationRepository.findByOrganizationMemberEmail({ + email: loggedInUser.email, + workspacePlatform: "GOOGLE", + }); + + if (domainWideDelegation && domainWideDelegation.enabled) { + logger.debug("Domain-wide delegation is enabled"); + // FIXME: How about if the app is installed for a team? Is that possible? I think not. + // We should figure it out and add appropriate comment here. + if (await isAppInstalled({ appId: metadata.slug, userId: loggedInUser.id })) { + throw new HttpError({ + statusCode: 422, + message: "Domain-wide delegation restricts adding more than one installation", + }); + } + + await createDefaultInstallation({ + appType: metadata.type, + user: loggedInUser, + slug: metadata.slug, + delegatedToId: domainWideDelegation.id, + key: { + // FIXME: zod validation somewhere requires access_token, when infact it isn't needed for domain-wide delegation + access_token: "NOT_A_TOKEN", + }, + }); + res.status(200).json({ message: "App successfully installed and is using delegated credentials" }); + return; + } + const { client_id, client_secret } = await getGoogleAppKeys(); const redirect_uri = `${WEBAPP_URL_FOR_OAUTH}/api/integrations/googlecalendar/callback`; const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uri); diff --git a/packages/app-store/googlecalendar/api/index.ts b/packages/app-store/googlecalendar/api/index.ts index 104741a7d304cb..eb12c1b4ed2c4f 100644 --- a/packages/app-store/googlecalendar/api/index.ts +++ b/packages/app-store/googlecalendar/api/index.ts @@ -1,4 +1,2 @@ export { default as add } from "./add"; export { default as callback } from "./callback"; -export { default as testDomainWideDelegation } from "./testDomainWideDelegation"; -export { default as testWorkloadIdentityFederation } from "./testWorkloadIdentityFederation"; diff --git a/packages/app-store/googlecalendar/api/testDomainWideDelegation.ts b/packages/app-store/googlecalendar/api/testDomainWideDelegation.ts deleted file mode 100644 index 89762ec5b0629c..00000000000000 --- a/packages/app-store/googlecalendar/api/testDomainWideDelegation.ts +++ /dev/null @@ -1,73 +0,0 @@ -import fs from "fs"; -import { JWT } from "google-auth-library"; -import { google } from "googleapis"; -import type { NextApiRequest, NextApiResponse } from "next"; -import path from "path"; - -import { defaultHandler, defaultResponder } from "@calcom/lib/server"; - -const calendar = google.calendar("v3"); -const scopes = ["https://www.googleapis.com/auth/calendar"]; - -function getKey() { - const keyPath = path.join( - process.cwd(), - "../../packages/app-store/googlecalendar/api/service-account-key.json" - ); - console.log("keyPath", keyPath); - return JSON.parse(fs.readFileSync(keyPath, "utf8")); -} - -async function createCalendarEvent({ userToImpersonate }: { userToImpersonate: string }) { - try { - const key = getKey(); - - const authClient = new JWT({ - email: key.client_email, - key: key.private_key, - scopes: scopes, - subject: userToImpersonate, - }); - - await authClient.authorize(); - - const event = { - summary: "Test Meeting - Domain-Wide Delegation", - description: "Discuss project updates and plans.", - start: { - dateTime: new Date().toISOString(), - timeZone: "America/Los_Angeles", - }, - end: { - dateTime: new Date(new Date().getTime() + 1 * 60 * 60 * 1000).toISOString(), - timeZone: "America/Los_Angeles", - }, - attendees: [{ email: "attendee1@domain.com" }, { email: "attendee2@domain.com" }], - }; - - const response = await calendar.events.insert({ - auth: authClient, - calendarId: "primary", - requestBody: event, - }); - - console.log(`Event created: ${response.data.htmlLink}`); - return response.data.htmlLink; - } catch (error) { - console.error("Error creating calendar event:", error); - throw error; - } -} - -async function getHandler(req: NextApiRequest, res: NextApiResponse) { - const userToImpersonate = req.query.userToImpersonate as string | undefined; - if (!userToImpersonate) { - return res.status(400).json({ error: "userToImpersonate query parameter is required" }); - } - const link = await createCalendarEvent({ userToImpersonate }); - return res.json({ link }); -} - -export default defaultHandler({ - GET: Promise.resolve({ default: defaultResponder(getHandler) }), -}); diff --git a/packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts b/packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts deleted file mode 100644 index 317e69685f6b45..00000000000000 --- a/packages/app-store/googlecalendar/api/testWorkloadIdentityFederation.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { GoogleAuth } from "google-auth-library"; -import { google } from "googleapis"; -import type { NextApiRequest, NextApiResponse } from "next"; - -import { defaultHandler, defaultResponder } from "@calcom/lib/server"; - -const scopes = ["https://www.googleapis.com/auth/calendar"]; - -async function createCalendarEvent({ userToImpersonate }: { userToImpersonate: string }) { - const calendar = google.calendar("v3"); - try { - const auth = new GoogleAuth({ - scopes, - // eslint-disable-next-line turbo/no-undeclared-env-vars - projectId: process.env.GCP_PROJECT_ID, - clientOptions: { - subject: userToImpersonate, - }, - }); - - const authClient = await auth.getClient(); - - const event = { - summary: "Test Meeting - Workload Identity Federation", - description: "Discuss project updates and plans.", - start: { - dateTime: new Date().toISOString(), - timeZone: "America/Los_Angeles", - }, - end: { - dateTime: new Date(new Date().getTime() + 1 * 60 * 60 * 1000).toISOString(), - timeZone: "America/Los_Angeles", - }, - attendees: [{ email: "attendee1@domain.com" }, { email: "attendee2@domain.com" }], - }; - - const response = await calendar.events.insert({ - auth: authClient, - calendarId: "primary", - requestBody: event, - }); - console.log(`Event created: ${response.data.htmlLink}`); - return response.data.htmlLink; - } catch (error) { - console.error("Error creating calendar event:", error); - throw error; - } -} - -async function getHandler(req: NextApiRequest, res: NextApiResponse) { - const userToImpersonate = req.query.userToImpersonate as string; - const link = await createCalendarEvent({ userToImpersonate }); - return res.json({ link }); -} - -export default defaultHandler({ - GET: Promise.resolve({ default: defaultResponder(getHandler) }), -}); diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index e8d6ddf5cc552a..bf28ed10ae5bf7 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { Prisma } from "@prisma/client"; +import { JWT } from "google-auth-library"; import type { calendar_v3 } from "googleapis"; import { google } from "googleapis"; import { RRule } from "rrule"; @@ -18,6 +19,7 @@ import { import { formatCalEvent } from "@calcom/lib/formatCalendarEvent"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; import prisma from "@calcom/prisma"; import type { Calendar, @@ -181,7 +183,60 @@ export default class GoogleCalendarService implements Calendar { }; }; + private getAuthedCalendarFromDomainWideDelegation = async () => { + //TODO: Compute it once and save it + const domainWideDelegation = await DomainWideDelegationRepository.findByCredential({ + credential: this.credential, + workspacePlatform: "GOOGLE", + }); + + if (domainWideDelegation && domainWideDelegation.enabled && domainWideDelegation.serviceAccountKey) { + const emailToImpersonate = this.credential.user?.email; + if (!emailToImpersonate) { + this.log.error("No email to impersonate found for domain wide delegation"); + return null; + } + this.log.debug( + "Using domain wide delegation with service account email", + safeStringify({ + serviceAccountEmail: domainWideDelegation.serviceAccountKey.client_email, + emailToImpersonate, + }) + ); + const authClient = new JWT({ + email: domainWideDelegation.serviceAccountKey.client_email, + key: domainWideDelegation.serviceAccountKey.private_key, + scopes: ["https://www.googleapis.com/auth/calendar"], + subject: emailToImpersonate, + }); + await authClient.authorize(); + return google.calendar({ + version: "v3", + auth: authClient, + }); + } + this.log.debug( + "Not using domain wide delegation, using default OAuth2 client for Google Calendar", + safeStringify({ + domainWideDelegation: { + enabled: domainWideDelegation?.enabled, + }, + serviceAccountKeyIsSet: !!domainWideDelegation?.serviceAccountKey, + credential: { + userId: this.credential.userId, + teamId: this.credential.teamId, + }, + }) + ); + return null; + }; + public authedCalendar = async () => { + const authedCalendarFromDomainWideDelegation = await this.getAuthedCalendarFromDomainWideDelegation(); + if (authedCalendarFromDomainWideDelegation) { + return authedCalendarFromDomainWideDelegation; + } + const myGoogleAuth = await this.auth.getMyGoogleAuthWithRefreshedToken(); const calendar = google.calendar({ version: "v3", diff --git a/packages/app-store/googlecalendar/package.json b/packages/app-store/googlecalendar/package.json index c8fe2c97a71c53..64b7cd5339af4c 100644 --- a/packages/app-store/googlecalendar/package.json +++ b/packages/app-store/googlecalendar/package.json @@ -7,6 +7,7 @@ "description": "Google Calendar is a time management and scheduling service developed by Google. Allows users to create and edit events, with options available for type and time. Available to anyone that has a Gmail account on both mobile and web versions.", "dependencies": { "@calcom/prisma": "*", + "@vercel/functions": "^1.4.1", "googleapis": "^84.0.0" }, "devDependencies": { diff --git a/packages/app-store/ping/api/_getAdd.ts b/packages/app-store/ping/api/_getAdd.ts index fd686045cca3d8..191a888bafbf50 100644 --- a/packages/app-store/ping/api/_getAdd.ts +++ b/packages/app-store/ping/api/_getAdd.ts @@ -13,7 +13,7 @@ export async function getHandler(req: NextApiRequest) { const appType = appConfig.type; const returnTo = req.query?.returnTo; - await checkInstalled(slug, session.user.id); + await assertInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/app-store/riverside/api/_getAdd.ts b/packages/app-store/riverside/api/_getAdd.ts index c8582bb6d6d78c..c5300fa9abab6d 100644 --- a/packages/app-store/riverside/api/_getAdd.ts +++ b/packages/app-store/riverside/api/_getAdd.ts @@ -13,7 +13,7 @@ export async function getHandler(req: NextApiRequest) { const appType = appConfig.type; const returnTo = req.query?.returnTo; - await checkInstalled(slug, session.user.id); + await assertInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/app-store/sendgrid/api/_getAdd.ts b/packages/app-store/sendgrid/api/_getAdd.ts index 2b7ae8c5355dee..a4152252cb5fbf 100644 --- a/packages/app-store/sendgrid/api/_getAdd.ts +++ b/packages/app-store/sendgrid/api/_getAdd.ts @@ -7,7 +7,7 @@ import { checkInstalled } from "../../_utils/installation"; export async function getHandler(req: NextApiRequest) { const session = checkSession(req); - await checkInstalled("sendgrid", session.user?.id); + await assertInstalled("sendgrid", session.user?.id); return { url: "/apps/sendgrid/setup" }; } diff --git a/packages/app-store/tsconfig.json b/packages/app-store/tsconfig.json index 8e9faeb56eb3a5..8c2e0fb50a97be 100644 --- a/packages/app-store/tsconfig.json +++ b/packages/app-store/tsconfig.json @@ -8,7 +8,7 @@ "@components/*": ["../../apps/web/components/*"], /* A `package` should never import from `apps` ↓ */ "@lib/*": ["../../apps/web/lib/*"], - "@prisma/client/*": ["@calcom/prisma/client/*"] + "@prisma/client/*": ["@calcom/prisma/client/*"], }, "resolveJsonModule": true, "experimentalDecorators": true diff --git a/packages/app-store/whereby/api/_getAdd.ts b/packages/app-store/whereby/api/_getAdd.ts index 177f1a9c6820e2..2aa3a5bc18b98a 100644 --- a/packages/app-store/whereby/api/_getAdd.ts +++ b/packages/app-store/whereby/api/_getAdd.ts @@ -13,7 +13,7 @@ export async function getHandler(req: NextApiRequest) { const appType = appConfig.type; const returnTo = req.query?.returnTo; - await checkInstalled(slug, session.user.id); + await assertInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index 6e7c2f567dbf87..3fbdcd2a87ceea 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -258,7 +258,8 @@ export const createEvent = async ( } log.error( "createEvent failed", - safeStringify({ error, calEvent: getPiiFreeCalendarEvent(calEvent) }) + safeStringify(error), + safeStringify({ calEvent: getPiiFreeCalendarEvent(calEvent) }) ); // @TODO: This code will be off till we can investigate an error with it //https://github.com/calcom/cal.com/issues/3949 diff --git a/packages/lib/server/repository/credential.ts b/packages/lib/server/repository/credential.ts index b5a81f36a3d4f9..48a0118911dbe3 100644 --- a/packages/lib/server/repository/credential.ts +++ b/packages/lib/server/repository/credential.ts @@ -6,4 +6,12 @@ export class CredentialRepository { static async create(data: Prisma.CredentialCreateInput) { return await prisma.credential.create({ data }); } + static async findByAppIdAndUserId({ appId, userId }: { appId: string; userId: number }) { + return await prisma.credential.findFirst({ + where: { + appId, + userId, + }, + }); + } } diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts new file mode 100644 index 00000000000000..de2a29020963d5 --- /dev/null +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -0,0 +1,90 @@ +import type { Prisma } from "@prisma/client"; +import z from "zod"; + +import logger from "@calcom/lib/logger"; +import { safeStringify } from "@calcom/lib/safeStringify"; +import { prisma } from "@calcom/prisma"; +import type { WorkspacePlatform } from "@calcom/prisma/enums"; + +import { OrganizationRepository } from "./organization"; + +const serviceAccountKeySchema = z + .object({ + client_email: z.string(), + private_key: z.string(), + }) + .passthrough(); + +const repositoryLogger = logger.getSubLogger({ prefix: ["DomainWideDelegationRepository"] }); + +export class DomainWideDelegationRepository { + private static parsed(domainWideDelegation: T) { + if (!domainWideDelegation) { + return domainWideDelegation; + } + return { + ...domainWideDelegation, + serviceAccountKey: serviceAccountKeySchema.parse(domainWideDelegation.serviceAccountKey), + }; + } + + static async findByOrganizationMemberEmail({ + email, + workspacePlatform, + }: { + email: string; + workspacePlatform: WorkspacePlatform; + }) { + const log = repositoryLogger.getSubLogger({ prefix: ["findByOrganizationMemberEmail"] }); + const organization = await OrganizationRepository.findByMemberEmail({ email }); + if (!organization) { + log.debug("Email not found in any organization:", email); + return null; + } + + const domainWideDelegation = await prisma.domainWideDelegation.findUnique({ + where: { + organizationId_workspacePlatform: { + organizationId: organization.id, + workspacePlatform, + }, + }, + }); + + return DomainWideDelegationRepository.parsed(domainWideDelegation); + } + + static async findByCredential({ + credential, + workspacePlatform, + }: { + credential: { + userId?: string | null; + teamId?: string | null; + }; + workspacePlatform: WorkspacePlatform; + }) { + const log = repositoryLogger.getSubLogger({ prefix: ["findByCredential"] }); + log.debug("called with", { safeCredential: credential, workspacePlatform }); + const organization = await OrganizationRepository.findByCredentialOfMember({ + userId: credential.userId, + teamId: credential.teamId, + }); + if (!organization) { + log.debug("Credential isn't found for any organization:", credential); + return null; + } + + log.debug("organization found", safeStringify({ organizationId: organization.id })); + const domainWideDelegation = await prisma.domainWideDelegation.findUnique({ + where: { + organizationId_workspacePlatform: { + organizationId: organization.id, + workspacePlatform, + }, + }, + }); + + return DomainWideDelegationRepository.parsed(domainWideDelegation); + } +} diff --git a/packages/lib/server/repository/organization.ts b/packages/lib/server/repository/organization.ts index ffedd7db4f561c..46e0cc18358c74 100644 --- a/packages/lib/server/repository/organization.ts +++ b/packages/lib/server/repository/organization.ts @@ -298,4 +298,56 @@ export class OrganizationRepository { } return { ...org, metadata: parsedMetadata }; } + + static async findByMemberEmail({ email }: { email: string }) { + const organization = await prisma.team.findFirst({ + where: { + isOrganization: true, + members: { + some: { + user: { email }, + }, + }, + }, + }); + return organization ?? null; + } + + static async findByCredentialOfMember({ + userId, + teamId, + }: { + userId?: number | null; + teamId?: number | null; + }) { + const log = logger.getSubLogger({ prefix: "findByCredentialOfMember" }); + if (userId) { + const organization = await prisma.team.findFirst({ + where: { + isOrganization: true, + members: { + some: { + userId, + }, + }, + }, + }); + return organization; + } + + if (teamId) { + const organization = await prisma.team.findUnique({ + where: { + id: teamId, + }, + select: { + parent: true, + }, + }); + return organization?.parent ?? null; + } + + log.error("No userId or teamId in credential"); + return null; + } } diff --git a/packages/prisma/migrations/20240912093050_add_domain_delegation_table/migration.sql b/packages/prisma/migrations/20240912093050_add_domain_delegation_table/migration.sql new file mode 100644 index 00000000000000..d132b0970bce65 --- /dev/null +++ b/packages/prisma/migrations/20240912093050_add_domain_delegation_table/migration.sql @@ -0,0 +1,19 @@ +-- CreateEnum +CREATE TYPE "WorkspacePlatform" AS ENUM ('google', 'microsoft'); + +-- CreateTable +CREATE TABLE "DomainWideDelegation" ( + "id" TEXT NOT NULL, + "workspacePlatform" "WorkspacePlatform" NOT NULL, + "serviceAccountKey" JSONB NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT false, + "organizationId" INTEGER NOT NULL, + + CONSTRAINT "DomainWideDelegation_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "DomainWideDelegation_organizationId_workspacePlatform_key" ON "DomainWideDelegation"("organizationId", "workspacePlatform"); + +-- AddForeignKey +ALTER TABLE "DomainWideDelegation" ADD CONSTRAINT "DomainWideDelegation_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/migrations/20240913062323_add_delegated_to_field_to_credential/migration.sql b/packages/prisma/migrations/20240913062323_add_delegated_to_field_to_credential/migration.sql new file mode 100644 index 00000000000000..3e860c0ed03e2d --- /dev/null +++ b/packages/prisma/migrations/20240913062323_add_delegated_to_field_to_credential/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Credential" ADD COLUMN "delegatedToId" TEXT; + +-- AddForeignKey +ALTER TABLE "Credential" ADD CONSTRAINT "Credential_delegatedToId_fkey" FOREIGN KEY ("delegatedToId") REFERENCES "DomainWideDelegation"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 7c48c344c0fb31..3b58ea87b4831e 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -183,6 +183,9 @@ model Credential { selectedCalendars SelectedCalendar[] invalid Boolean? @default(false) CalendarCache CalendarCache[] + + delegatedTo DomainWideDelegation? @relation(fields: [delegatedToId], references: [id], onDelete: Cascade) + delegatedToId String? @@index([userId]) @@index([appId]) @@ -436,6 +439,7 @@ model Team { activeOrgWorkflows WorkflowsOnTeams[] attributes Attribute[] smsLockReviewedByAdmin Boolean @default(false) + domainWideDelegations DomainWideDelegation[] @@unique([slug, parentId]) @@index([parentId]) @@ -1508,3 +1512,20 @@ model AttributeToUser { @@unique([memberId, attributeOptionId]) } + +enum WorkspacePlatform { + GOOGLE @map("google") + MICROSOFT @map("microsoft") +} + +model DomainWideDelegation { + id String @id @default(uuid()) + workspacePlatform WorkspacePlatform + serviceAccountKey Json + enabled Boolean @default(false) + organizationId Int + organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade) + Credential Credential[] + + @@unique([organizationId, workspacePlatform]) +} diff --git a/packages/trpc/server/routers/viewer/admin/_router.ts b/packages/trpc/server/routers/viewer/admin/_router.ts index a99df03afb11e0..28829c72b9d038 100644 --- a/packages/trpc/server/routers/viewer/admin/_router.ts +++ b/packages/trpc/server/routers/viewer/admin/_router.ts @@ -72,4 +72,56 @@ export const adminRouter = router({ ); return handler(opts); }), + domainWideDelegation: router({ + update: authedAdminProcedure + .input( + z.object({ + id: z.string(), + workspacePlatform: z.enum(["GOOGLE", "MICROSOFT"]), + enabled: z.boolean(), + organizationId: z.number(), + }) + ) + .mutation(async (opts) => { + const handler = await importHandler( + namespaced("updateDomainWideDelegationHandler"), + () => import("./domainWideDelegation.handler"), + "updateDomainWideDelegationHandler" + ); + return handler(opts); + }), + list: authedAdminProcedure.query(async (opts) => { + const handler = await importHandler( + namespaced("listDomainWideDelegationsHandler"), + () => import("./domainWideDelegation.handler"), + "listDomainWideDelegationsHandler" + ); + return handler(opts); + }), + add: authedAdminProcedure + .input( + z.object({ + workspacePlatform: z.enum(["GOOGLE", "MICROSOFT"]), + serviceAccountKey: z.string(), + enabled: z.boolean(), + organizationId: z.number(), + }) + ) + .mutation(async (opts) => { + const handler = await importHandler( + namespaced("addDomainWideDelegationHandler"), + () => import("./domainWideDelegation.handler"), + "addDomainWideDelegationHandler" + ); + return handler(opts); + }), + delete: authedAdminProcedure.input(z.object({ id: z.string() })).mutation(async (opts) => { + const handler = await importHandler( + namespaced("deleteDomainWideDelegationHandler"), + () => import("./domainWideDelegation.handler"), + "deleteDomainWideDelegationHandler" + ); + return handler(opts); + }), + }), }); diff --git a/packages/trpc/server/routers/viewer/admin/domainWideDelegation.handler.ts b/packages/trpc/server/routers/viewer/admin/domainWideDelegation.handler.ts new file mode 100644 index 00000000000000..1496aa0608f181 --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/domainWideDelegation.handler.ts @@ -0,0 +1,147 @@ +import type { PrismaClient } from "@prisma/client"; +import type { WorkspacePlatform } from "@prisma/client"; + +import { TRPCError } from "@trpc/server"; + +interface DomainWideDelegationInput { + workspacePlatform: WorkspacePlatform; + serviceAccountKey: string; + enabled: boolean; + organizationId: number; + id?: string; +} + +class InvalidServiceAccountKeyError extends Error { + constructor(message: string) { + super(message); + this.name = "InvalidServiceAccountKeyError"; + } +} + +const domainWideDelegationSafeSelect = { + id: true, + workspacePlatform: true, + enabled: true, + organizationId: true, +}; + +function parseServiceAccountKey(serviceAccountKey?: string) { + if (!serviceAccountKey) { + return null; + } + + const trimmedServiceAccountKey = serviceAccountKey.trim(); + + let parsedServiceAccountKey; + try { + parsedServiceAccountKey = JSON.parse(trimmedServiceAccountKey); + } catch (error) { + console.error("Error parsing service account key:", error); + throw new InvalidServiceAccountKeyError("Service account key is not valid JSON"); + } + + if (!parsedServiceAccountKey.private_key || !parsedServiceAccountKey.client_email) { + throw new InvalidServiceAccountKeyError("Service account key must contain private_key and client_email"); + } + + return parsedServiceAccountKey; +} + +const upsertDomainWideDelegationHandler = async ({ + input, + ctx, +}: { + input: DomainWideDelegationInput; + ctx: { prisma: PrismaClient; user: { id: number } }; +}) => { + const { workspacePlatform, serviceAccountKey, enabled, organizationId } = input; + const { prisma } = ctx; + try { + const parsedServiceAccountKey = parseServiceAccountKey(serviceAccountKey); + + const updatedDelegation = await prisma.domainWideDelegation.upsert({ + where: { id: input.id ?? "" }, + create: { + workspacePlatform, + serviceAccountKey: parsedServiceAccountKey, + enabled, + organizationId, + }, + update: { + workspacePlatform, + enabled, + organizationId, + }, + }); + + return { + ...updatedDelegation, + // Don't send the actual key back to the client + serviceAccountKey: undefined, + }; + } catch (error) { + if (error instanceof InvalidServiceAccountKeyError) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: error.message, + }); + } + + console.error("Error updating domain-wide delegation:", error); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "An error occurred while updating domain-wide delegation settings.", + }); + } +}; + +export const updateDomainWideDelegationHandler = async ({ + input, + ctx, +}: { + input: DomainWideDelegationInput; + ctx: { prisma: PrismaClient; user: { id: number } }; +}) => { + return upsertDomainWideDelegationHandler({ input, ctx }); +}; + +export const addDomainWideDelegationHandler = async ({ + input, + ctx, +}: { + input: DomainWideDelegationInput; + ctx: { prisma: PrismaClient; user: { id: number } }; +}) => { + return upsertDomainWideDelegationHandler({ input, ctx }); +}; + +export const listDomainWideDelegationsHandler = async ({ + ctx, +}: { + ctx: { prisma: PrismaClient; user: { id: number } }; +}) => { + const { prisma } = ctx; + + const domainWideDelegations = await prisma.domainWideDelegation.findMany({ + select: domainWideDelegationSafeSelect, + }); + + return domainWideDelegations; +}; + +export const deleteDomainWideDelegationHandler = async ({ + input, + ctx, +}: { + input: { id: string }; + ctx: { prisma: PrismaClient; user: { id: number } }; +}) => { + const { id } = input; + const { prisma } = ctx; + + await prisma.domainWideDelegation.delete({ + where: { id }, + }); + + return { id }; +}; diff --git a/packages/trpc/server/trpc.ts b/packages/trpc/server/trpc.ts index 3f2709e3ea8cb5..0a0c178c0bbe08 100644 --- a/packages/trpc/server/trpc.ts +++ b/packages/trpc/server/trpc.ts @@ -34,22 +34,25 @@ return handler({ ctx, input }); export const importHandler = async < T extends { // eslint-disable-next-line @typescript-eslint/ban-types - default: Function; + [key: string]: Function; } >( /** * The name of the handler in cache. It has to be unique across all routes */ name: string, - importer: () => Promise + importer: () => Promise, + exportName = "default" ) => { const nameInCache = name as keyof typeof UNSTABLE_HANDLER_CACHE; if (!UNSTABLE_HANDLER_CACHE[nameInCache]) { const importedModule = await importer(); - UNSTABLE_HANDLER_CACHE[nameInCache] = importedModule.default; - return importedModule.default as T["default"]; + UNSTABLE_HANDLER_CACHE[nameInCache] = importedModule[exportName]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return importedModule[exportName] as unknown as (...args: any[]) => any; } - return UNSTABLE_HANDLER_CACHE[nameInCache] as unknown as T["default"]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return UNSTABLE_HANDLER_CACHE[nameInCache] as unknown as (...args: any[]) => any; }; diff --git a/yarn.lock b/yarn.lock index ad6cc5f89b0b1b..20327d42618401 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,46 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@0no-co/graphql.web@npm:^1.0.1": - version: 1.0.8 - resolution: "@0no-co/graphql.web@npm:1.0.8" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - peerDependenciesMeta: - graphql: - optional: true - checksum: 5bd3ac2a55401c6d47e8af479170e1ae3b38c80847203d5b445f281f36e68ac11e6a6400e43e90b382d38f704721dd46acaab1088239362b9290b536a9e7d707 - languageName: node - linkType: hard - -"@47ng/cloak@npm:^1.1.0": - version: 1.1.0 - resolution: "@47ng/cloak@npm:1.1.0" - 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 - bin: - cloak: dist/cli.js - checksum: 7d72c66ff7837368e9ca8f5ba402d72041427eb47c53c340b4640e3352f2956d8673a4a8e97591fb2b9dfe27f3d2765bcd925617273ef2488df2565c77c78299 - languageName: node - linkType: hard - -"@47ng/codec@npm:^1.0.1": - version: 1.1.0 - resolution: "@47ng/codec@npm:1.1.0" - dependencies: - "@stablelib/base64": ^1.0.1 - "@stablelib/hex": ^1.0.1 - checksum: 4f780c4413fe78bbedbaff4135340c0e5f5a30df88f5cffbec51349eb0a1c909728e6c2bbda52506ff8c12653bf39b78c67b78bbe9501b0b9741da0cdaeec6ff - languageName: node - linkType: hard - "@aashutoshrathi/word-wrap@npm:^1.2.3": version: 1.2.6 resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" @@ -59,17 +19,6 @@ __metadata: languageName: node linkType: hard -"@algora/sdk@npm:^0.1.2": - version: 0.1.3 - resolution: "@algora/sdk@npm:0.1.3" - dependencies: - "@trpc/client": ^10.0.0 - "@trpc/server": ^10.0.0 - superjson: ^1.9.1 - checksum: 1b99e0f155181beefe12b625969166f4ecfa42d334706224d0a9a4e9ad72e2cda7335712c47290df7aeeeb003a9773ff5babce7cbee8fb8d1c5ded4ad81c80c1 - languageName: node - linkType: hard - "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -214,44 +163,6 @@ __metadata: languageName: node linkType: hard -"@ardatan/relay-compiler@npm:12.0.0": - version: 12.0.0 - resolution: "@ardatan/relay-compiler@npm:12.0.0" - dependencies: - "@babel/core": ^7.14.0 - "@babel/generator": ^7.14.0 - "@babel/parser": ^7.14.0 - "@babel/runtime": ^7.0.0 - "@babel/traverse": ^7.14.0 - "@babel/types": ^7.0.0 - babel-preset-fbjs: ^3.4.0 - chalk: ^4.0.0 - fb-watchman: ^2.0.0 - fbjs: ^3.0.0 - glob: ^7.1.1 - immutable: ~3.7.6 - invariant: ^2.2.4 - nullthrows: ^1.1.1 - relay-runtime: 12.0.0 - signedsource: ^1.0.0 - yargs: ^15.3.1 - peerDependencies: - graphql: "*" - bin: - relay-compiler: bin/relay-compiler - checksum: f0cec120d02961ee8652e0dde72d9e425bc97cad5d0f767d8764cfd30952294eb2838432f33e4da8bb6999d0c13dcd1df128280666bfea373294d98aa8033ae7 - languageName: node - linkType: hard - -"@ardatan/sync-fetch@npm:^0.0.1": - version: 0.0.1 - resolution: "@ardatan/sync-fetch@npm:0.0.1" - dependencies: - node-fetch: ^2.6.1 - checksum: af39bdfb4c2b35bd2c6acc540a5e302730dae17e73d3a18cd1a4aa50c1c741cb1869dffdef1379c491da5ad2e3cfa2bf3a8064e6046c12b46c6a97f54f100a8d - languageName: node - linkType: hard - "@aw-web-design/x-default-browser@npm:1.4.126": version: 1.4.126 resolution: "@aw-web-design/x-default-browser@npm:1.4.126" @@ -1166,13 +1077,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.25.2": - version: 7.25.4 - resolution: "@babel/compat-data@npm:7.25.4" - checksum: b12a91d27c3731a4b0bdc9312a50b1911f41f7f728aaf0d4b32486e2257fd2cb2d3ea1a295e98449600c48f2c7883a3196ca77cda1cef7d97a10c2e83d037974 - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.22.9 resolution: "@babel/compat-data@npm:7.22.9" @@ -1240,29 +1144,6 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.14.0, @babel/core@npm:^7.22.9": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" - dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.24.7 - "@babel/generator": ^7.25.0 - "@babel/helper-compilation-targets": ^7.25.2 - "@babel/helper-module-transforms": ^7.25.2 - "@babel/helpers": ^7.25.0 - "@babel/parser": ^7.25.0 - "@babel/template": ^7.25.0 - "@babel/traverse": ^7.25.2 - "@babel/types": ^7.25.2 - convert-source-map: ^2.0.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.3 - semver: ^6.3.1 - checksum: 9a1ef604a7eb62195f70f9370cec45472a08114e3934e3eaaedee8fd754edf0730e62347c7b4b5e67d743ce57b5bb8cf3b92459482ca94d06e06246ef021390a - languageName: node - linkType: hard - "@babel/core@npm:^7.18.5": version: 7.24.7 resolution: "@babel/core@npm:7.24.7" @@ -1320,18 +1201,6 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" - dependencies: - "@babel/types": ^7.25.6 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 - jsesc: ^2.5.1 - checksum: b55975cd664f5602304d868bb34f4ee3bed6f5c7ce8132cd92ff27a46a53a119def28a182d91992e86f75db904f63094a81247703c4dc96e4db0c03fd04bcd68 - languageName: node - linkType: hard - "@babel/generator@npm:^7.17.3, @babel/generator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/generator@npm:7.22.10" @@ -1392,15 +1261,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e - languageName: node - linkType: hard - "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -1419,19 +1279,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" - dependencies: - "@babel/compat-data": ^7.25.2 - "@babel/helper-validator-option": ^7.24.8 - browserslist: ^4.23.1 - lru-cache: ^5.1.1 - semver: ^6.3.1 - checksum: aed33c5496cb9db4b5e2d44e26bf8bc474074cc7f7bb5ebe1d4a20fdeb362cb3ba9e1596ca18c7484bcd6e5c3a155ab975e420d520c0ae60df81f9de04d0fd16 - languageName: node - linkType: hard - "@babel/helper-compilation-targets@npm:^7.22.10, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.10 resolution: "@babel/helper-compilation-targets@npm:7.22.10" @@ -1484,23 +1331,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0": - version: 7.25.4 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-member-expression-to-functions": ^7.24.8 - "@babel/helper-optimise-call-expression": ^7.24.7 - "@babel/helper-replace-supers": ^7.25.0 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - "@babel/traverse": ^7.25.4 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 4544ebda4516eb25efdebd47ca024bd7bdb1eb6e7cc3ad89688c8ef8e889734c2f4411ed78981899c641394f013f246f2af63d92a0e9270f6c453309b4cb89ba - languageName: node - linkType: hard - "@babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" @@ -1669,16 +1499,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" - dependencies: - "@babel/traverse": ^7.24.8 - "@babel/types": ^7.24.8 - checksum: bf923d05d81b06857f4ca4fe9c528c9c447a58db5ea39595bb559eae2fce01a8266173db0fd6a2ec129d7bbbb9bb22f4e90008252f7c66b422c76630a878a4bc - languageName: node - linkType: hard - "@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-module-imports@npm:7.22.5" @@ -1752,20 +1572,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" - dependencies: - "@babel/helper-module-imports": ^7.24.7 - "@babel/helper-simple-access": ^7.24.7 - "@babel/helper-validator-identifier": ^7.24.7 - "@babel/traverse": ^7.25.2 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 282d4e3308df6746289e46e9c39a0870819630af5f84d632559171e4fae6045684d771a65f62df3d569e88ccf81dc2def78b8338a449ae3a94bb421aa14fc367 - languageName: node - linkType: hard - "@babel/helper-optimise-call-expression@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" @@ -1775,15 +1581,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" - dependencies: - "@babel/types": ^7.24.7 - checksum: 280654eaf90e92bf383d7eed49019573fb35a98c9e992668f701ad099957246721044be2068cf6840cb2299e0ad393705a1981c88c23a1048096a8d59e5f79a3 - languageName: node - linkType: hard - "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.22.5 resolution: "@babel/helper-plugin-utils@npm:7.22.5" @@ -1791,13 +1588,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a - languageName: node - linkType: hard - "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -1837,19 +1627,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-replace-supers@npm:7.25.0" - dependencies: - "@babel/helper-member-expression-to-functions": ^7.24.8 - "@babel/helper-optimise-call-expression": ^7.24.7 - "@babel/traverse": ^7.25.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: f669fc2487c22d40b808f94b9c3ee41129484d5ef0ba689bdd70f216ff91e10b6b021d2f8cd37e7bdd700235a2a6ae6622526344f064528190383bf661ac65f8 - languageName: node - linkType: hard - "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -1878,16 +1655,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" - dependencies: - "@babel/traverse": ^7.24.7 - "@babel/types": ^7.24.7 - checksum: 11b28fe534ce2b1a67c4d8e51a7b5711a2a0a0cae802f74614eee54cca58c744d9a62f6f60103c41759e81c537d270bfd665bf368a6bea214c6052f2094f8407 - languageName: node - linkType: hard - "@babel/helper-split-export-declaration@npm:^7.16.7, @babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" @@ -1927,13 +1694,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce - languageName: node - linkType: hard - "@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-identifier@npm:7.22.5" @@ -1983,13 +1743,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c - languageName: node - linkType: hard - "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -2044,16 +1797,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/helpers@npm:7.25.6" - dependencies: - "@babel/template": ^7.25.0 - "@babel/types": ^7.25.6 - checksum: 5a548999db82049a5f7ac6de57576b4ed0d386ce07d058151698836ed411eae6230db12535487caeebb68a2ffc964491e8aead62364a5132ab0ae20e8b68e19f - languageName: node - linkType: hard - "@babel/highlight@npm:^7.22.13": version: 7.22.13 resolution: "@babel/highlight@npm:7.22.13" @@ -2097,17 +1840,6 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" - dependencies: - "@babel/types": ^7.25.6 - bin: - parser: ./bin/babel-parser.js - checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e - languageName: node - linkType: hard - "@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.22.11, @babel/parser@npm:^7.22.5": version: 7.22.14 resolution: "@babel/parser@npm:7.22.14" @@ -2180,33 +1912,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.0.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 49a78a2773ec0db56e915d9797e44fd079ab8a9b2e1716e0df07c92532f2c65d76aeda9543883916b8e0ff13606afeffa67c5b93d05b607bc87653ad18a91422 - languageName: node - linkType: hard - -"@babel/plugin-proposal-object-rest-spread@npm:^7.0.0": - version: 7.20.7 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" - dependencies: - "@babel/compat-data": ^7.20.5 - "@babel/helper-compilation-targets": ^7.20.7 - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.20.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1329db17009964bc644484c660eab717cb3ca63ac0ab0f67c651a028d1bc2ead51dc4064caea283e46994f1b7221670a35cbc0b4beb6273f55e915494b5aa0b2 - languageName: node - linkType: hard - "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -2216,20 +1921,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.21.11": - version: 7.21.11 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" - dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-create-class-features-plugin": ^7.21.0 - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1b880543bc5f525b360b53d97dd30807302bb82615cd42bf931968f59003cac75629563d6b104868db50abd22235b3271fdf679fea5db59a267181a99cc0c265 - languageName: node - linkType: hard - "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -2252,7 +1943,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -2296,17 +1987,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-flow@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 43b78b5fcdedb2a6d80c3d02a1a564fbfde86b73b442d616a8f318f673caa6ce0151513af5a00fcae42a512f144e70ef259d368b9537ee35d40336a6c895a7d4 - languageName: node - linkType: hard - "@babel/plugin-syntax-flow@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-syntax-flow@npm:7.23.3" @@ -2318,17 +1998,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.20.0": - version: 7.25.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b3b251ace9f184c2d6369cde686ff01581050cb0796f2ff00ff4021f31cf86270b347df09579f2c0996e999e37e1dddafacec42ed1ef6aae21a265aff947e792 - languageName: node - linkType: hard - "@babel/plugin-syntax-import-assertions@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" @@ -2384,17 +2053,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965 - languageName: node - linkType: hard - "@babel/plugin-syntax-jsx@npm:^7.12.13, @babel/plugin-syntax-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" @@ -2450,7 +2108,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:^7.0.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: @@ -2528,17 +2186,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 707c209b5331c7dc79bd326128c6a6640dbd62a78da1653c844db20c4f36bf7b68454f1bc4d2d051b3fde9136fa291f276ec03a071bb00ee653069ff82f91010 - languageName: node - linkType: hard - "@babel/plugin-transform-arrow-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" @@ -2577,17 +2224,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 249cdcbff4e778b177245f9652b014ea4f3cd245d83297f10a7bf6d97790074089aa62bcde8c08eb299c5e68f2faed346b587d3ebac44d625ba9a83a4ee27028 - languageName: node - linkType: hard - "@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" @@ -2599,17 +2235,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.0.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b1a8f932f69ad2a47ae3e02b4cedd2a876bfc2ac9cf72a503fd706cdc87272646fe9eed81e068c0fc639647033de29f7fa0c21cddd1da0026f83dbaac97316a8 - languageName: node - linkType: hard - "@babel/plugin-transform-block-scoping@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" @@ -2658,22 +2283,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0": - version: 7.25.4 - resolution: "@babel/plugin-transform-classes@npm:7.25.4" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-compilation-targets": ^7.25.2 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-replace-supers": ^7.25.0 - "@babel/traverse": ^7.25.4 - globals: ^11.1.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0bf20e46eeb691bd60cee5d1b01950fc37accec88018ecace25099f7c8d8509c1ac54d11b8caf9f2157c6945969520642a3bc421159c1a14e80224dc9a7611de - languageName: node - linkType: hard - "@babel/plugin-transform-classes@npm:^7.23.5": version: 7.23.5 resolution: "@babel/plugin-transform-classes@npm:7.23.5" @@ -2693,18 +2302,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/template": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0cf8c1b1e4ea57dec8d4612460d84fd4cdbf71a7499bb61ee34632cf89018a59eee818ffca88a8d99ee7057c20a4257044d7d463fda6daef9bf1db9fa81563cb - languageName: node - linkType: hard - "@babel/plugin-transform-computed-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" @@ -2717,17 +2314,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.0.0": - version: 7.24.8 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0b4bd3d608979a1e5bd97d9d42acd5ad405c7fffa61efac4c7afd8e86ea6c2d91ab2d94b6a98d63919571363fe76e0b03c4ff161f0f60241b895842596e4a999 - languageName: node - linkType: hard - "@babel/plugin-transform-destructuring@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" @@ -2810,18 +2396,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.0.0": - version: 7.25.2 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.2" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/plugin-syntax-flow": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9f7b96cbd374077eaf04b59e468976d2e89ec353807d7ac28f129f686945447df92aeb5b60acf906f3ec0f9ebef5d9f88735c7aa39af97033a6ab96c79c9a909 - languageName: node - linkType: hard - "@babel/plugin-transform-flow-strip-types@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.23.3" @@ -2834,18 +2408,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-for-of@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a53b42dc93ab4b7d1ebd3c695b52be22b3d592f6a3dbdb3dc2fea2c8e0a7e1508fe919864c455cde552aec44ce7518625fccbb70c7063373ca228d884f4f49ea - languageName: node - linkType: hard - "@babel/plugin-transform-for-of@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-for-of@npm:7.23.3" @@ -2857,19 +2419,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.0.0": - version: 7.25.1 - resolution: "@babel/plugin-transform-function-name@npm:7.25.1" - dependencies: - "@babel/helper-compilation-targets": ^7.24.8 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/traverse": ^7.25.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 743f3ea03bbc5a90944849d5a880b6bd9243dddbde581a46952da76e53a0b74c1e2424133fe8129d7a152c1f8c872bcd27e0b6728d7caadabd1afa7bb892e1e0 - languageName: node - linkType: hard - "@babel/plugin-transform-function-name@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-function-name@npm:7.23.3" @@ -2895,17 +2444,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.0.0": - version: 7.25.2 - resolution: "@babel/plugin-transform-literals@npm:7.25.2" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 70c9bb40e377a306bd8f500899fb72127e527517914466e95dc6bb53fa7a0f51479db244a54a771b5780fc1eab488fedd706669bf11097b81a23c81ab7423eb1 - languageName: node - linkType: hard - "@babel/plugin-transform-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-literals@npm:7.23.3" @@ -2929,17 +2467,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2720c57aa3bf70576146ba7d6ea03227f4611852122d76d237924f7b008dafc952e6ae61a19e5024f26c665f44384bbd378466f01b6bd1305b3564a3b7fb1a5d - languageName: node - linkType: hard - "@babel/plugin-transform-member-expression-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" @@ -2963,19 +2490,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.0.0": - version: 7.24.8 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" - dependencies: - "@babel/helper-module-transforms": ^7.24.8 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-simple-access": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a4cf95b1639c33382064b44558f73ee5fac023f2a94d16e549d2bb55ceebd5cbc10fcddd505d08cd5bc97f5a64af9fd155512358b7dcf7b1a0082e8945cf21c5 - languageName: node - linkType: hard - "@babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" @@ -3101,18 +2615,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-super@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-replace-supers": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f71e607a830ee50a22fa1a2686524d3339440cf9dea63032f6efbd865cfe4e35000e1e3f3492459e5c986f7c0c07dc36938bf3ce61fc9ba5f8ab732d0b64ab37 - languageName: node - linkType: hard - "@babel/plugin-transform-object-super@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-object-super@npm:7.23.3" @@ -3150,17 +2652,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-parameters@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ab534b03ac2eff94bc79342b8f39a4584666f5305a6c63c1964afda0b1b004e6b861e49d1683548030defe248e3590d3ff6338ee0552cb90c064f7e1479968c3 - languageName: node - linkType: hard - "@babel/plugin-transform-parameters@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-parameters@npm:7.23.3" @@ -3210,17 +2701,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9aeefc3aab6c6bf9d1fae1cf3a2d38c7d886fd3c6c81b7c608c477f5758aee2e7abf52f32724310fe861da61af934ee2508b78a5b5f234b9740c9134e1c14437 - languageName: node - linkType: hard - "@babel/plugin-transform-property-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" @@ -3232,17 +2712,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a05bf83bf5e7b31f7a3b56da1bf8e2eeec76ef52ae44435ceff66363a1717fcda45b7b4b931a2c115982175f481fc3f2d0fab23f0a43c44e6d983afc396858f0 - languageName: node - linkType: hard - "@babel/plugin-transform-react-display-name@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" @@ -3309,21 +2778,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.0.0": - version: 7.25.2 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": ^7.24.7 - "@babel/helper-module-imports": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/plugin-syntax-jsx": ^7.24.7 - "@babel/types": ^7.25.2 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 44fbde046385916de19a88d77fed9121c6cc6e25b9cdc38a43d8e514a9b18cf391ed3de25e7d6a8996d3fe4c298e395edf856ee20efffaab3b70f8ce225fffa4 - languageName: node - linkType: hard - "@babel/plugin-transform-react-jsx@npm:^7.19.0, @babel/plugin-transform-react-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" @@ -3405,17 +2859,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7b524245814607188212b8eb86d8c850e5974203328455a30881b4a92c364b93353fae14bc2af5b614ef16300b75b8c1d3b8f3a08355985b4794a7feb240adc3 - languageName: node - linkType: hard - "@babel/plugin-transform-shorthand-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" @@ -3427,18 +2870,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-spread@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4c4254c8b9cceb1a8f975fa9b92257ddb08380a35c0a3721b8f4b9e13a3d82e403af2e0fba577b9f2452dd8f06bc3dea71cc53b1e2c6af595af5db52a13429d6 - languageName: node - linkType: hard - "@babel/plugin-transform-spread@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-spread@npm:7.23.3" @@ -3462,17 +2893,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.0.0": - version: 7.24.7 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": ^7.24.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ad44e5826f5a98c1575832dbdbd033adfe683cdff195e178528ead62507564bf02f479b282976cfd3caebad8b06d5fd7349c1cdb880dec3c56daea4f1f179619 - languageName: node - linkType: hard - "@babel/plugin-transform-template-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" @@ -3744,15 +3164,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.21.0": - version: 7.25.6 - resolution: "@babel/runtime@npm:7.25.6" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 - languageName: node - linkType: hard - "@babel/runtime@npm:^7.23.2": version: 7.23.5 resolution: "@babel/runtime@npm:7.23.5" @@ -3771,17 +3182,6 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" - dependencies: - "@babel/code-frame": ^7.24.7 - "@babel/parser": ^7.25.0 - "@babel/types": ^7.25.0 - checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b - languageName: node - linkType: hard - "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -3844,21 +3244,6 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.4": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" - dependencies: - "@babel/code-frame": ^7.24.7 - "@babel/generator": ^7.25.6 - "@babel/parser": ^7.25.6 - "@babel/template": ^7.25.0 - "@babel/types": ^7.25.6 - debug: ^4.3.1 - globals: ^11.1.0 - checksum: 11ee47269aa4356f2d6633a05b9af73405b5ed72c09378daf644289b686ef852035a6ac9aa410f601991993c6bbf72006795b5478283b78eb1ca77874ada7737 - languageName: node - linkType: hard - "@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.5": version: 7.23.5 resolution: "@babel/traverse@npm:7.23.5" @@ -3952,17 +3337,6 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" - dependencies: - "@babel/helper-string-parser": ^7.24.8 - "@babel/helper-validator-identifier": ^7.24.7 - to-fast-properties: ^2.0.0 - checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 - languageName: node - linkType: hard - "@babel/types@npm:^7.17.0, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.22.11 resolution: "@babel/types@npm:7.22.11" @@ -4134,7 +3508,7 @@ __metadata: dependencies: "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.31" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.33" "@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" @@ -4455,43 +3829,6 @@ __metadata: languageName: unknown linkType: soft -"@calcom/console@workspace:apps/console": - version: 0.0.0-use.local - resolution: "@calcom/console@workspace:apps/console" - dependencies: - "@calcom/dayjs": "*" - "@calcom/features": "*" - "@calcom/lib": "*" - "@calcom/tsconfig": "*" - "@calcom/ui": "*" - "@headlessui/react": ^1.5.0 - "@heroicons/react": ^1.0.6 - "@prisma/client": ^5.4.2 - "@tailwindcss/forms": ^0.5.2 - "@types/node": 16.9.1 - "@types/react": 18.0.26 - autoprefixer: ^10.4.12 - chart.js: ^3.7.1 - client-only: ^0.0.1 - eslint: ^8.34.0 - next: ^13.5.4 - next-auth: ^4.22.1 - next-i18next: ^13.2.2 - postcss: ^8.4.18 - prisma: ^5.4.2 - prisma-field-encryption: ^1.4.0 - react: ^18.2.0 - react-chartjs-2: ^4.0.1 - react-dom: ^18.2.0 - react-hook-form: ^7.43.3 - react-live-chat-loader: ^2.8.1 - swr: ^1.2.2 - tailwindcss: ^3.3.3 - typescript: ^4.9.4 - zod: ^3.22.4 - languageName: unknown - linkType: soft - "@calcom/core@*, @calcom/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@calcom/core@workspace:packages/core" @@ -4633,7 +3970,7 @@ __metadata: languageName: unknown linkType: soft -"@calcom/embed-react@workspace:*, @calcom/embed-react@workspace:^, @calcom/embed-react@workspace:packages/embeds/embed-react": +"@calcom/embed-react@workspace:*, @calcom/embed-react@workspace:packages/embeds/embed-react": version: 0.0.0-use.local resolution: "@calcom/embed-react@workspace:packages/embeds/embed-react" dependencies: @@ -4831,6 +4168,7 @@ __metadata: dependencies: "@calcom/prisma": "*" "@calcom/types": "*" + "@vercel/functions": ^1.4.1 googleapis: ^84.0.0 languageName: unknown linkType: soft @@ -5119,14 +4457,14 @@ __metadata: languageName: node linkType: hard -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.31": - version: 0.0.31 - resolution: "@calcom/platform-libraries@npm:0.0.31" +"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.33": + version: 0.0.33 + resolution: "@calcom/platform-libraries@npm:0.0.33" dependencies: "@calcom/core": "*" "@calcom/features": "*" "@calcom/lib": "*" - checksum: 45c46b46898b1abe36a33db4626de0cfe71ba45741bd09f3cd5619c1636282b0742d04abf1cefc5984e315d731213f197e24f014cd5e9efb4ba096c5337771d3 + checksum: 75d78e298b380fbf72568ecd7fe70b8a1decc4c5a644d7e5032a5c493645967baf6645a27149754e0b173a3e36f4f83d9600129d858b4160fba77004daf59997 languageName: node linkType: hard @@ -5153,6 +4491,7 @@ __metadata: "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" "@types/express": ^4.17.21 + class-transformer: ^0.5.1 class-validator: ^0.14.0 languageName: unknown linkType: soft @@ -5765,118 +5104,6 @@ __metadata: languageName: unknown linkType: soft -"@calcom/website@workspace:apps/website": - version: 0.0.0-use.local - resolution: "@calcom/website@workspace:apps/website" - dependencies: - "@algora/sdk": ^0.1.2 - "@calcom/app-store": "*" - "@calcom/config": "*" - "@calcom/dayjs": "*" - "@calcom/embed-react": "workspace:^" - "@calcom/features": "*" - "@calcom/lib": "*" - "@calcom/prisma": "*" - "@calcom/tsconfig": "*" - "@calcom/ui": "*" - "@datocms/cma-client-node": ^2.0.0 - "@floating-ui/react-dom": ^1.0.0 - "@flodlc/nebula": ^1.0.56 - "@graphql-codegen/cli": ^5.0.0 - "@graphql-codegen/typed-document-node": ^5.0.1 - "@graphql-codegen/typescript": ^4.0.1 - "@graphql-codegen/typescript-operations": ^4.0.1 - "@graphql-typed-document-node/core": ^3.2.0 - "@headlessui/react": ^1.5.0 - "@heroicons/react": ^1.0.6 - "@hookform/resolvers": ^2.9.7 - "@juggle/resize-observer": ^3.4.0 - "@next/bundle-analyzer": ^13.1.6 - "@radix-ui/react-accordion": ^1.0.0 - "@radix-ui/react-avatar": ^1.0.4 - "@radix-ui/react-dropdown-menu": ^2.0.5 - "@radix-ui/react-navigation-menu": ^1.0.0 - "@radix-ui/react-portal": ^1.0.0 - "@radix-ui/react-slider": ^1.0.0 - "@radix-ui/react-tabs": ^1.0.0 - "@radix-ui/react-tooltip": ^1.0.0 - "@stripe/stripe-js": ^1.35.0 - "@tanstack/react-query": ^4.3.9 - "@typeform/embed-react": ^1.2.4 - "@types/bcryptjs": ^2.4.2 - "@types/debounce": ^1.2.1 - "@types/gtag.js": ^0.0.10 - "@types/micro": 7.3.7 - "@types/node": 16.9.1 - "@types/react": 18.0.26 - "@types/react-gtm-module": ^2.0.1 - "@types/xml2js": ^0.4.11 - "@vercel/analytics": ^0.1.6 - "@vercel/edge-functions-ui": ^0.2.1 - "@vercel/og": ^0.5.0 - autoprefixer: ^10.4.12 - bcryptjs: ^2.4.3 - clsx: ^1.2.1 - cobe: ^0.4.1 - concurrently: ^7.6.0 - cross-env: ^7.0.3 - datocms-structured-text-to-plain-text: ^2.0.4 - datocms-structured-text-utils: ^2.0.4 - debounce: ^1.2.1 - dotenv: ^16.3.1 - enquirer: ^2.4.1 - env-cmd: ^10.1.0 - eslint: ^8.34.0 - fathom-client: ^3.5.0 - globby: ^13.1.3 - graphql: ^16.8.0 - graphql-codegen: ^0.4.0 - graphql-request: ^6.1.0 - gray-matter: ^4.0.3 - gsap: ^3.11.0 - i18n-unused: ^0.13.0 - iframe-resizer-react: ^1.1.0 - keen-slider: ^6.8.0 - lucide-react: ^0.171.0 - micro: ^10.0.1 - next: ^14.1.3 - next-auth: ^4.22.1 - next-axiom: ^0.17.0 - next-i18next: ^13.2.2 - next-seo: ^6.0.0 - playwright-core: ^1.38.1 - postcss: ^8.4.18 - prism-react-renderer: ^1.3.5 - react: ^18.2.0 - react-confetti: ^6.0.1 - react-datocms: ^3.1.0 - react-device-detect: ^2.2.2 - react-dom: ^18.2.0 - react-fast-marquee: ^1.6.4 - react-github-btn: ^1.4.0 - react-hook-form: ^7.43.3 - react-hot-toast: ^2.3.0 - react-live-chat-loader: ^2.8.1 - react-markdown: ^9.0.1 - react-merge-refs: 1.1.0 - react-resize-detector: ^9.1.0 - react-twemoji: ^0.3.0 - react-use-measure: ^2.1.1 - react-wrap-balancer: ^1.0.0 - remark: ^14.0.2 - remark-html: ^14.0.1 - remeda: ^1.24.1 - stripe: ^9.16.0 - tailwind-merge: ^1.13.2 - tailwindcss: ^3.3.3 - ts-node: ^10.9.1 - typescript: ^4.9.4 - wait-on: ^7.0.1 - xml2js: ^0.6.0 - zod: ^3.22.2 - languageName: unknown - linkType: soft - "@calcom/whatsapp@workspace:packages/app-store/whatsapp": version: 0.0.0-use.local resolution: "@calcom/whatsapp@workspace:packages/app-store/whatsapp" @@ -6303,38 +5530,6 @@ __metadata: languageName: node linkType: hard -"@datocms/cma-client-node@npm:^2.0.0": - version: 2.2.6 - resolution: "@datocms/cma-client-node@npm:2.2.6" - dependencies: - "@datocms/cma-client": ^2.2.6 - "@datocms/rest-client-utils": ^1.3.3 - got: ^11.8.5 - mime-types: ^2.1.35 - tmp-promise: ^3.0.3 - checksum: d18b568f5a4538abbd824091722f7df95c99cb5e550560bcae701654924e7933559b27d176fc7772056afe214516c99e8bb383319d4e492b053d20d3732df929 - languageName: node - linkType: hard - -"@datocms/cma-client@npm:^2.2.6": - version: 2.2.6 - resolution: "@datocms/cma-client@npm:2.2.6" - dependencies: - "@datocms/rest-client-utils": ^1.3.3 - checksum: 52e65ab5cdc6b09859f6b07f87a5e8700ba2b2f0579894b7f3c6735c1360f83e41941783dfab78bd18d3f9e12bbd50436b953663a332c50fbcd12b167c567ed6 - languageName: node - linkType: hard - -"@datocms/rest-client-utils@npm:^1.3.3": - version: 1.3.3 - resolution: "@datocms/rest-client-utils@npm:1.3.3" - dependencies: - "@whatwg-node/fetch": ^0.5.3 - async-scheduler: ^1.4.4 - checksum: eb746ce41b0c38b0ebef42238046ce8ff2734330580b7198cc11bf7182de394af9de4df021e967419592eb62729feae533c7126d5629ec97e7cc8b3aa30e9eb2 - languageName: node - linkType: hard - "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -6963,7 +6158,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^1.0.0, @floating-ui/react-dom@npm:^1.3.0": +"@floating-ui/react-dom@npm:^1.3.0": version: 1.3.0 resolution: "@floating-ui/react-dom@npm:1.3.0" dependencies: @@ -7001,13 +6196,6 @@ __metadata: languageName: node linkType: hard -"@flodlc/nebula@npm:^1.0.56": - version: 1.0.56 - resolution: "@flodlc/nebula@npm:1.0.56" - checksum: 044058423bc8a2c6ea60a0636400593a0912c142fbb6f50cc03288c702ae9c2029f84eb4fbac7e701a7ee1c2a5e33cc1af1b8d94af419c1197f74066b7867d21 - languageName: node - linkType: hard - "@formatjs/ecma402-abstract@npm:1.11.4": version: 1.11.4 resolution: "@formatjs/ecma402-abstract@npm:1.11.4" @@ -7171,596 +6359,6 @@ __metadata: languageName: node linkType: hard -"@graphql-codegen/add@npm:^5.0.3": - version: 5.0.3 - resolution: "@graphql-codegen/add@npm:5.0.3" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.3 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 5196b6c64907f03dc1adc0ac4f98ed5fe69abe0eb87027a55dfc14b178cc1fee2bc47f68c8f5a68ce7aa4bc5a4f970f983d1d85b6d7a20489e50657baccd2ad0 - languageName: node - linkType: hard - -"@graphql-codegen/cli@npm:^5.0.0": - version: 5.0.2 - resolution: "@graphql-codegen/cli@npm:5.0.2" - dependencies: - "@babel/generator": ^7.18.13 - "@babel/template": ^7.18.10 - "@babel/types": ^7.18.13 - "@graphql-codegen/client-preset": ^4.2.2 - "@graphql-codegen/core": ^4.0.2 - "@graphql-codegen/plugin-helpers": ^5.0.3 - "@graphql-tools/apollo-engine-loader": ^8.0.0 - "@graphql-tools/code-file-loader": ^8.0.0 - "@graphql-tools/git-loader": ^8.0.0 - "@graphql-tools/github-loader": ^8.0.0 - "@graphql-tools/graphql-file-loader": ^8.0.0 - "@graphql-tools/json-file-loader": ^8.0.0 - "@graphql-tools/load": ^8.0.0 - "@graphql-tools/prisma-loader": ^8.0.0 - "@graphql-tools/url-loader": ^8.0.0 - "@graphql-tools/utils": ^10.0.0 - "@whatwg-node/fetch": ^0.8.0 - chalk: ^4.1.0 - cosmiconfig: ^8.1.3 - debounce: ^1.2.0 - detect-indent: ^6.0.0 - graphql-config: ^5.0.2 - inquirer: ^8.0.0 - is-glob: ^4.0.1 - jiti: ^1.17.1 - json-to-pretty-yaml: ^1.2.2 - listr2: ^4.0.5 - log-symbols: ^4.0.0 - micromatch: ^4.0.5 - shell-quote: ^1.7.3 - string-env-interpolation: ^1.0.1 - ts-log: ^2.2.3 - tslib: ^2.4.0 - yaml: ^2.3.1 - yargs: ^17.0.0 - peerDependencies: - "@parcel/watcher": ^2.1.0 - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - peerDependenciesMeta: - "@parcel/watcher": - optional: true - bin: - gql-gen: cjs/bin.js - graphql-code-generator: cjs/bin.js - graphql-codegen: cjs/bin.js - graphql-codegen-esm: esm/bin.js - checksum: 82c9a26ffeeee620d6e6863280efb6302d6ac4bdccfd80e27bf811677e58bbf4ece7767e43a999194b0b8922f32226eb7a3c21e0a8e2bebc04a3abc64a981786 - languageName: node - linkType: hard - -"@graphql-codegen/client-preset@npm:^4.2.2": - version: 4.3.3 - resolution: "@graphql-codegen/client-preset@npm:4.3.3" - dependencies: - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/template": ^7.20.7 - "@graphql-codegen/add": ^5.0.3 - "@graphql-codegen/gql-tag-operations": 4.0.9 - "@graphql-codegen/plugin-helpers": ^5.0.4 - "@graphql-codegen/typed-document-node": ^5.0.9 - "@graphql-codegen/typescript": ^4.0.9 - "@graphql-codegen/typescript-operations": ^4.2.3 - "@graphql-codegen/visitor-plugin-common": ^5.3.1 - "@graphql-tools/documents": ^1.0.0 - "@graphql-tools/utils": ^10.0.0 - "@graphql-typed-document-node/core": 3.2.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: c18409c1337fff57daf555d15b887d1632e49b3093f23726dfc6afaa5e31f0977f3aea267a380f1947555d514827ba63ae0144ec0b756681bd557e8f9531ef30 - languageName: node - linkType: hard - -"@graphql-codegen/core@npm:^4.0.2": - version: 4.0.2 - resolution: "@graphql-codegen/core@npm:4.0.2" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.3 - "@graphql-tools/schema": ^10.0.0 - "@graphql-tools/utils": ^10.0.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 5fda4e843174aacd4a481b73b4d259fa2df7ffe4200bd06e95ecd4b3f43aa5969deeaeb51f6cf15a542e99ee5756c3e02a29d9d2ff9891af40e234a8f68ead4d - languageName: node - linkType: hard - -"@graphql-codegen/gql-tag-operations@npm:4.0.9": - version: 4.0.9 - resolution: "@graphql-codegen/gql-tag-operations@npm:4.0.9" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.4 - "@graphql-codegen/visitor-plugin-common": 5.3.1 - "@graphql-tools/utils": ^10.0.0 - auto-bind: ~4.0.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: d269d1c1026afd073efee2ff7511ad55b29ea4ea4c5d34647377087af18dbcb1716e233cc64cb1cdeea73935e85cb1fd8b553ea4e0ab3525a2687ca2565c6a5d - languageName: node - linkType: hard - -"@graphql-codegen/plugin-helpers@npm:^5.0.3, @graphql-codegen/plugin-helpers@npm:^5.0.4": - version: 5.0.4 - resolution: "@graphql-codegen/plugin-helpers@npm:5.0.4" - dependencies: - "@graphql-tools/utils": ^10.0.0 - change-case-all: 1.0.15 - common-tags: 1.8.2 - import-from: 4.0.0 - lodash: ~4.17.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 0f0272afbbc79e665fb23bb823721587470e12f77aba39426e2524386ccbb6dec8d42c0ccaf8e0b95fcda030c83cb4e6302bce3c3f7b2c1ed50c33a40619fcd0 - languageName: node - linkType: hard - -"@graphql-codegen/schema-ast@npm:^4.0.2": - version: 4.1.0 - resolution: "@graphql-codegen/schema-ast@npm:4.1.0" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.3 - "@graphql-tools/utils": ^10.0.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: cddec7723d708990ac8e33eb8935e72545b60ed7b772452ba45b60e577af950d23503de83f0919d1730f7d52dcb970900d3587d9a54202032164ba3c246d4c10 - languageName: node - linkType: hard - -"@graphql-codegen/typed-document-node@npm:^5.0.1, @graphql-codegen/typed-document-node@npm:^5.0.9": - version: 5.0.9 - resolution: "@graphql-codegen/typed-document-node@npm:5.0.9" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.4 - "@graphql-codegen/visitor-plugin-common": 5.3.1 - auto-bind: ~4.0.0 - change-case-all: 1.0.15 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: ee2b68cc0fbbd435e920e55cdeb3b251ff655d85a62ad5a9257664178e597d97096eb34db233dc29e2bcf6b1efb88a48643e7a7933a6f7477694fbb4bec35dc7 - languageName: node - linkType: hard - -"@graphql-codegen/typescript-operations@npm:^4.0.1, @graphql-codegen/typescript-operations@npm:^4.2.3": - version: 4.2.3 - resolution: "@graphql-codegen/typescript-operations@npm:4.2.3" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.4 - "@graphql-codegen/typescript": ^4.0.9 - "@graphql-codegen/visitor-plugin-common": 5.3.1 - auto-bind: ~4.0.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: d7e445e52f1354c504bd46742c6508b013c956826d7a3c7abeae38caa9f57626784b1114b9763254f5f506c081478ca309338d31f8bd03c772c2fb6affed6b0b - languageName: node - linkType: hard - -"@graphql-codegen/typescript@npm:^4.0.1, @graphql-codegen/typescript@npm:^4.0.9": - version: 4.0.9 - resolution: "@graphql-codegen/typescript@npm:4.0.9" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.4 - "@graphql-codegen/schema-ast": ^4.0.2 - "@graphql-codegen/visitor-plugin-common": 5.3.1 - auto-bind: ~4.0.0 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 843081bc484d209658158fcc5eabf5b4d2e2edc860686d656d16ddd76bf585a7d060438cf5ae4c9f69bf75c6be641c1a822095b0d5e9fc77cd94a9b11e517939 - languageName: node - linkType: hard - -"@graphql-codegen/visitor-plugin-common@npm:5.3.1, @graphql-codegen/visitor-plugin-common@npm:^5.3.1": - version: 5.3.1 - resolution: "@graphql-codegen/visitor-plugin-common@npm:5.3.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^5.0.4 - "@graphql-tools/optimize": ^2.0.0 - "@graphql-tools/relay-operation-optimizer": ^7.0.0 - "@graphql-tools/utils": ^10.0.0 - auto-bind: ~4.0.0 - change-case-all: 1.0.15 - dependency-graph: ^0.11.0 - graphql-tag: ^2.11.0 - parse-filepath: ^1.0.2 - tslib: ~2.6.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 273f99a91233b0f68988185498f9170a0b46a311d65b57029e0e2bd03d72d7c90bb3b1f5e49233fee459a770119f7d0674dd01306b2cc1ddb27d30f940fb1f98 - languageName: node - linkType: hard - -"@graphql-tools/apollo-engine-loader@npm:^8.0.0": - version: 8.0.1 - resolution: "@graphql-tools/apollo-engine-loader@npm:8.0.1" - dependencies: - "@ardatan/sync-fetch": ^0.0.1 - "@graphql-tools/utils": ^10.0.13 - "@whatwg-node/fetch": ^0.9.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 4baef5a8fd85787568188f852446e4f2453a21026c60b9391641093bff0a88172df8beb8bbfe2b134e177acad90eeb613387a1185699d1e7718e1dfa701c6fd7 - languageName: node - linkType: hard - -"@graphql-tools/batch-execute@npm:^9.0.4": - version: 9.0.4 - resolution: "@graphql-tools/batch-execute@npm:9.0.4" - dependencies: - "@graphql-tools/utils": ^10.0.13 - dataloader: ^2.2.2 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: d547da2ca888a1ebd8552f1be1c353e88bdbcb85c745de3d869e22da7f1981b4621f950a22ce719c645cc6435bc683c77253d8f19a0baaf7d4058625f4ce8891 - languageName: node - linkType: hard - -"@graphql-tools/code-file-loader@npm:^8.0.0": - version: 8.1.3 - resolution: "@graphql-tools/code-file-loader@npm:8.1.3" - dependencies: - "@graphql-tools/graphql-tag-pluck": 8.3.2 - "@graphql-tools/utils": ^10.0.13 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 3a8694b713dda9282466139893ab064976ec1ce11c91af02b37e71e6bdd84d64700bd058d13a1bc4b1396ce6950b1c1835b774fe37a8c5c47b1bfe44600a74d7 - languageName: node - linkType: hard - -"@graphql-tools/delegate@npm:^10.0.4": - version: 10.0.21 - resolution: "@graphql-tools/delegate@npm:10.0.21" - dependencies: - "@graphql-tools/batch-execute": ^9.0.4 - "@graphql-tools/executor": ^1.3.1 - "@graphql-tools/schema": ^10.0.4 - "@graphql-tools/utils": ^10.3.4 - "@repeaterjs/repeater": ^3.0.6 - dataloader: ^2.2.2 - tslib: ^2.5.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 72b0f90c02f6cc8bd7c247364c06bc0e783626eb9c5c2297dd791557c0c21762a8af25c73f8acfc76199c644ba6418a97af2d5e31c707691f47eda47ebf8dd2e - languageName: node - linkType: hard - -"@graphql-tools/documents@npm:^1.0.0": - version: 1.0.1 - resolution: "@graphql-tools/documents@npm:1.0.1" - dependencies: - lodash.sortby: ^4.7.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: c6ff859d2673dbf884f19d6319735afacc6bff2df6f8ea3dbf56839d01568f61210f256f0905156f123428cc24962ada26b37903263699fc8cd7efb8849a6508 - languageName: node - linkType: hard - -"@graphql-tools/executor-graphql-ws@npm:^1.1.2": - version: 1.2.0 - resolution: "@graphql-tools/executor-graphql-ws@npm:1.2.0" - dependencies: - "@graphql-tools/utils": ^10.3.0 - "@types/ws": ^8.0.0 - graphql-ws: ^5.14.0 - isomorphic-ws: ^5.0.0 - tslib: ^2.4.0 - ws: ^8.17.1 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 501824d3608c17109ab3505639215ed46b416a53329352b60ef63e39611be2e33d19f3ad882eb427ca27c9c65330d94a477cd1fd45f1098957b51d221d0a57b2 - languageName: node - linkType: hard - -"@graphql-tools/executor-http@npm:^1.0.9": - version: 1.1.6 - resolution: "@graphql-tools/executor-http@npm:1.1.6" - dependencies: - "@graphql-tools/utils": ^10.3.2 - "@repeaterjs/repeater": ^3.0.4 - "@whatwg-node/fetch": ^0.9.0 - extract-files: ^11.0.0 - meros: ^1.2.1 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: a19b58b542bb70c799a5d0be2d5152fbfed7ac6f225885193e826a46bae4c800d2b27aa671a090272bc8d1be66ad2c2b69cb93c6c363036477544e07d83d2cdd - languageName: node - linkType: hard - -"@graphql-tools/executor-legacy-ws@npm:^1.0.6": - version: 1.1.0 - resolution: "@graphql-tools/executor-legacy-ws@npm:1.1.0" - dependencies: - "@graphql-tools/utils": ^10.3.0 - "@types/ws": ^8.0.0 - isomorphic-ws: ^5.0.0 - tslib: ^2.4.0 - ws: ^8.17.1 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: eb4acf16cf4b99f3b5fa8fc0b431e82ee7c5c424a6df4d89b73840bdbb7dcee8bff9652df986a08abecdcbec107892f3fe26c6a7adc6d447af8c6683b08b66a6 - languageName: node - linkType: hard - -"@graphql-tools/executor@npm:^1.3.1": - version: 1.3.1 - resolution: "@graphql-tools/executor@npm:1.3.1" - dependencies: - "@graphql-tools/utils": ^10.3.4 - "@graphql-typed-document-node/core": 3.2.0 - "@repeaterjs/repeater": ^3.0.4 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 709f4660850236ccfcf9ef13b0479d19cea2af9a7dd3ffe60457117c0c5e8e31e2e3d89c38183fe65062ee4e6b4f60a484b98121982c6283c4c518a2c59d2003 - languageName: node - linkType: hard - -"@graphql-tools/git-loader@npm:^8.0.0": - version: 8.0.7 - resolution: "@graphql-tools/git-loader@npm:8.0.7" - dependencies: - "@graphql-tools/graphql-tag-pluck": 8.3.2 - "@graphql-tools/utils": ^10.0.13 - is-glob: 4.0.3 - micromatch: ^4.0.4 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: d22bd4d207d890e495da625a11a24b9f89bde71d0f9f5951b1b5ae5cf18df89f91dbf36a87c41e49b73f765731eb99bfabf4b23e21aa5c46747b8e555cca2aa7 - languageName: node - linkType: hard - -"@graphql-tools/github-loader@npm:^8.0.0": - version: 8.0.1 - resolution: "@graphql-tools/github-loader@npm:8.0.1" - dependencies: - "@ardatan/sync-fetch": ^0.0.1 - "@graphql-tools/executor-http": ^1.0.9 - "@graphql-tools/graphql-tag-pluck": ^8.0.0 - "@graphql-tools/utils": ^10.0.13 - "@whatwg-node/fetch": ^0.9.0 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 40d379f4c35bf318ad643ada4133dd630fac34dc3c959e10887da9730caf7c71e5e2c47eef62fdb15e90ce7b05281459cd86639a4f86cdc8784c7b9974d6c017 - languageName: node - linkType: hard - -"@graphql-tools/graphql-file-loader@npm:^8.0.0": - version: 8.0.1 - resolution: "@graphql-tools/graphql-file-loader@npm:8.0.1" - dependencies: - "@graphql-tools/import": 7.0.1 - "@graphql-tools/utils": ^10.0.13 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 55fd5cc96ea063341e03be2fa72a6494e8fedb0cd09cc2a4664732fc81e57e5c67026f63ff9e6c1afc284bd303988cd1bda715c88100b8316b5e8cdf6da70a32 - languageName: node - linkType: hard - -"@graphql-tools/graphql-tag-pluck@npm:8.3.2, @graphql-tools/graphql-tag-pluck@npm:^8.0.0": - version: 8.3.2 - resolution: "@graphql-tools/graphql-tag-pluck@npm:8.3.2" - dependencies: - "@babel/core": ^7.22.9 - "@babel/parser": ^7.16.8 - "@babel/plugin-syntax-import-assertions": ^7.20.0 - "@babel/traverse": ^7.16.8 - "@babel/types": ^7.16.8 - "@graphql-tools/utils": ^10.0.13 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 183b71dc04c930ccf7175c8c1c454a74552148512a0306148f7a49db5af550afde4845a03c0ef26ecee9283d866cfd7964c521ae4a83416c83693ed931fcc770 - languageName: node - linkType: hard - -"@graphql-tools/import@npm:7.0.1": - version: 7.0.1 - resolution: "@graphql-tools/import@npm:7.0.1" - dependencies: - "@graphql-tools/utils": ^10.0.13 - resolve-from: 5.0.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: eb3596779e1dcebc3453eafdb459575531b30c01ce82c4fb779dccc9d5865ba7e5dbfef443836cd5ecc9250eb8e4001ec0b83878841c2f366d1643ccefc57267 - languageName: node - linkType: hard - -"@graphql-tools/json-file-loader@npm:^8.0.0": - version: 8.0.1 - resolution: "@graphql-tools/json-file-loader@npm:8.0.1" - dependencies: - "@graphql-tools/utils": ^10.0.13 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 803124fc91a83b2e486ec34315510fef1497e4a3800c3557b3d9bf37b8ef182b5898293f05bfee2e663a4102ead766391748901daf92ccf98379fe4ff36cbdee - languageName: node - linkType: hard - -"@graphql-tools/load@npm:^8.0.0": - version: 8.0.2 - resolution: "@graphql-tools/load@npm:8.0.2" - dependencies: - "@graphql-tools/schema": ^10.0.3 - "@graphql-tools/utils": ^10.0.13 - p-limit: 3.1.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: ddc4bd9dcf5a799321fb1bd21a27887e3c8321003b1826efabff9aae5c189dd8cce0dffa0a94708ef7d64791daf7e73c8ff95cf2f7e036c131ef5eddccf38e34 - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.6": - version: 9.0.7 - resolution: "@graphql-tools/merge@npm:9.0.7" - dependencies: - "@graphql-tools/utils": ^10.5.4 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: d61a0cead730fd50dcc0055e94d7c53a1a6e982d0fb35d8a5c0721191eec6ab1102fcea2aabbdab0a224bdfd779458e4292b066572b562419b2958b255e41fa7 - languageName: node - linkType: hard - -"@graphql-tools/optimize@npm:^2.0.0": - version: 2.0.0 - resolution: "@graphql-tools/optimize@npm:2.0.0" - dependencies: - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 7f79c0e1852abc571308e887d27d613da5b797256c8c6eb6c5fe7ca77f09e61524778ae281cebc0b698c51d4fe1074e2b8e0d0627b8e2dcf505aa6ed09b49a2f - languageName: node - linkType: hard - -"@graphql-tools/prisma-loader@npm:^8.0.0": - version: 8.0.4 - resolution: "@graphql-tools/prisma-loader@npm:8.0.4" - dependencies: - "@graphql-tools/url-loader": ^8.0.2 - "@graphql-tools/utils": ^10.0.13 - "@types/js-yaml": ^4.0.0 - "@whatwg-node/fetch": ^0.9.0 - chalk: ^4.1.0 - debug: ^4.3.1 - dotenv: ^16.0.0 - graphql-request: ^6.0.0 - http-proxy-agent: ^7.0.0 - https-proxy-agent: ^7.0.0 - jose: ^5.0.0 - js-yaml: ^4.0.0 - lodash: ^4.17.20 - scuid: ^1.1.0 - tslib: ^2.4.0 - yaml-ast-parser: ^0.0.43 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 70eeefff95ccacc10bcc94ba6a4f102b4135303dd39fb549209e39b5f460611c730bbc92700b81d2b138b9c32806de48e6b5fbb0166756e255ab72337ce3dadd - languageName: node - linkType: hard - -"@graphql-tools/relay-operation-optimizer@npm:^7.0.0": - version: 7.0.1 - resolution: "@graphql-tools/relay-operation-optimizer@npm:7.0.1" - dependencies: - "@ardatan/relay-compiler": 12.0.0 - "@graphql-tools/utils": ^10.0.13 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 24a29aea91a0028d7624ae38fed1bfd387ecf5a0e297dbbca23c0f73c51956765db7517b2a75a5b3a6003ea5e3f025f0fc4f527eec22b05e7e25216dc6318797 - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:^10.0.0, @graphql-tools/schema@npm:^10.0.3, @graphql-tools/schema@npm:^10.0.4": - version: 10.0.6 - resolution: "@graphql-tools/schema@npm:10.0.6" - dependencies: - "@graphql-tools/merge": ^9.0.6 - "@graphql-tools/utils": ^10.5.4 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 3548c7daf7df7a13ae8852379b5589ee2041caabca31e3c14106dfae3e4417b66623a9f33037c93659e84c1129e9ab93ba16138f1fdd43c6c858802d4c9e93a8 - languageName: node - linkType: hard - -"@graphql-tools/url-loader@npm:^8.0.0, @graphql-tools/url-loader@npm:^8.0.2": - version: 8.0.2 - resolution: "@graphql-tools/url-loader@npm:8.0.2" - dependencies: - "@ardatan/sync-fetch": ^0.0.1 - "@graphql-tools/delegate": ^10.0.4 - "@graphql-tools/executor-graphql-ws": ^1.1.2 - "@graphql-tools/executor-http": ^1.0.9 - "@graphql-tools/executor-legacy-ws": ^1.0.6 - "@graphql-tools/utils": ^10.0.13 - "@graphql-tools/wrap": ^10.0.2 - "@types/ws": ^8.0.0 - "@whatwg-node/fetch": ^0.9.0 - isomorphic-ws: ^5.0.0 - tslib: ^2.4.0 - value-or-promise: ^1.0.11 - ws: ^8.12.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: f3dfb80678fa7b0473f0bbdbbb7ce0d64878bfa2a265bee5dc1eb698ab6c033737a4dd8ab037b880d8aa040771e66118dc067d06af4b813601a2025545e66e1d - languageName: node - linkType: hard - -"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.1.1, @graphql-tools/utils@npm:^10.3.0, @graphql-tools/utils@npm:^10.3.2, @graphql-tools/utils@npm:^10.3.4, @graphql-tools/utils@npm:^10.5.4": - version: 10.5.4 - resolution: "@graphql-tools/utils@npm:10.5.4" - dependencies: - "@graphql-typed-document-node/core": ^3.1.1 - cross-inspect: 1.0.1 - dset: ^3.1.2 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 56b41b276401c9010e47627b0d84336ac840d4e3e7c0124884626f11b92a20a1f1aec97712dd06d8adf5239fc39f4a86d4f4349f6a7028205e577e4c200bf070 - languageName: node - linkType: hard - -"@graphql-tools/wrap@npm:^10.0.2": - version: 10.0.5 - resolution: "@graphql-tools/wrap@npm:10.0.5" - dependencies: - "@graphql-tools/delegate": ^10.0.4 - "@graphql-tools/schema": ^10.0.3 - "@graphql-tools/utils": ^10.1.1 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 7cf834eef085a4ad0f6a0a3aa2b58d8bc329375a6acb2e93dc59962ce8655d205877fa08b6a35eaea07c6e7279feab683a03194703db1c9d6be8b1eb7da23d0e - languageName: node - linkType: hard - -"@graphql-typed-document-node/core@npm:3.2.0, @graphql-typed-document-node/core@npm:^3.1.1, @graphql-typed-document-node/core@npm:^3.2.0": - version: 3.2.0 - resolution: "@graphql-typed-document-node/core@npm:3.2.0" - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fa44443accd28c8cf4cb96aaaf39d144a22e8b091b13366843f4e97d19c7bfeaf609ce3c7603a4aeffe385081eaf8ea245d078633a7324c11c5ec4b2011bb76d - languageName: node - linkType: hard - "@grpc/grpc-js@npm:^1.7.1": version: 1.9.14 resolution: "@grpc/grpc-js@npm:1.9.14" @@ -7785,44 +6383,6 @@ __metadata: languageName: node linkType: hard -"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": - version: 9.3.0 - resolution: "@hapi/hoek@npm:9.3.0" - checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 - languageName: node - linkType: hard - -"@hapi/topo@npm:^5.1.0": - version: 5.1.0 - resolution: "@hapi/topo@npm:5.1.0" - dependencies: - "@hapi/hoek": ^9.0.0 - checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 - languageName: node - linkType: hard - -"@headlessui/react@npm:^1.5.0": - version: 1.7.19 - resolution: "@headlessui/react@npm:1.7.19" - dependencies: - "@tanstack/react-virtual": ^3.0.0-beta.60 - client-only: ^0.0.1 - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - checksum: 2a343a5fcf1f45e870cc94613231b89a8da78114001ffafa4751a0eceae7569ff9237aff1f2aedfa6f6e53ee3bb9ba5e5d19ebf1878fee3ff4f3c733fddc1087 - languageName: node - linkType: hard - -"@heroicons/react@npm:^1.0.6": - version: 1.0.6 - resolution: "@heroicons/react@npm:1.0.6" - peerDependencies: - react: ">= 16" - checksum: 372b1eda3ce735ef069777bc96304f70de585ebb71a6d1cedc121bb695f9bca235619112e3ee14e8779e95a03096813cbbe3b755927a54b7580d1ce084fa4096 - languageName: node - linkType: hard - "@hookform/error-message@npm:^2.0.0": version: 2.0.0 resolution: "@hookform/error-message@npm:2.0.0" @@ -8806,20 +7366,13 @@ __metadata: languageName: node linkType: hard -"@juggle/resize-observer@npm:^3.3.1, @juggle/resize-observer@npm:^3.4.0": +"@juggle/resize-observer@npm:^3.3.1": version: 3.4.0 resolution: "@juggle/resize-observer@npm:3.4.0" checksum: 2505028c05cc2e17639fcad06218b1c4b60f932a4ebb4b41ab546ef8c157031ae377e3f560903801f6d01706dbefd4943b6c4704bf19ed86dfa1c62f1473a570 languageName: node linkType: hard -"@kamilkisiela/fast-url-parser@npm:^1.1.4": - version: 1.1.4 - resolution: "@kamilkisiela/fast-url-parser@npm:1.1.4" - checksum: 921d305eff1fce5c7c669aee5cfe39e50109968addb496c23f0a42253d030e3cd5865eb01b13245915923bee452db75ba8a8254e69b0d0575d3c168efce7091e - languageName: node - linkType: hard - "@lexical/clipboard@npm:0.9.1": version: 0.9.1 resolution: "@lexical/clipboard@npm:0.9.1" @@ -9584,13 +8137,6 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.2.7": - version: 14.2.7 - resolution: "@next/env@npm:14.2.7" - checksum: 8d3c4338f1a06683f938492391634ce1dd7a5c4a3dff030f4aeddc06fb0feb05904d292af42d5c87c4bb2521c9186c973d6146410a89d1161966b3f6a8d46c75 - languageName: node - linkType: hard - "@next/eslint-plugin-next@npm:13.2.1": version: 13.2.1 resolution: "@next/eslint-plugin-next@npm:13.2.1" @@ -9623,13 +8169,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-darwin-arm64@npm:14.2.7" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@next/swc-darwin-x64@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-darwin-x64@npm:13.5.5" @@ -9644,13 +8183,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-darwin-x64@npm:14.2.7" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@next/swc-linux-arm64-gnu@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-arm64-gnu@npm:13.5.5" @@ -9665,13 +8197,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-arm64-gnu@npm:14.2.7" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - "@next/swc-linux-arm64-musl@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-arm64-musl@npm:13.5.5" @@ -9686,13 +8211,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-arm64-musl@npm:14.2.7" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - "@next/swc-linux-x64-gnu@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-x64-gnu@npm:13.5.5" @@ -9707,13 +8225,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-x64-gnu@npm:14.2.7" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - "@next/swc-linux-x64-musl@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-x64-musl@npm:13.5.5" @@ -9728,13 +8239,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-x64-musl@npm:14.2.7" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - "@next/swc-win32-arm64-msvc@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-win32-arm64-msvc@npm:13.5.5" @@ -9749,13 +8253,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-win32-arm64-msvc@npm:14.2.7" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@next/swc-win32-ia32-msvc@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-win32-ia32-msvc@npm:13.5.5" @@ -9770,13 +8267,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-win32-ia32-msvc@npm:14.2.7" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@next/swc-win32-x64-msvc@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-win32-x64-msvc@npm:13.5.5" @@ -9791,13 +8281,6 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.7" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@next/third-parties@npm:^14.2.5": version: 14.2.5 resolution: "@next/third-parties@npm:14.2.5" @@ -10785,39 +9268,6 @@ __metadata: languageName: node linkType: hard -"@peculiar/asn1-schema@npm:^2.3.8": - version: 2.3.13 - resolution: "@peculiar/asn1-schema@npm:2.3.13" - dependencies: - asn1js: ^3.0.5 - pvtsutils: ^1.3.5 - tslib: ^2.6.2 - checksum: 245cf398992788fc61c48a4e1263a47803bccd91807e7a419e3fe9ad44ede5e396a5f8d13215b0765774855b634fe10d730b08944e5dc085fc5ee121a7e0139e - languageName: node - linkType: hard - -"@peculiar/json-schema@npm:^1.1.12": - version: 1.1.12 - resolution: "@peculiar/json-schema@npm:1.1.12" - dependencies: - tslib: ^2.0.0 - checksum: b26ececdc23c5ef25837f8be8d1eb5e1c8bb6e9ae7227ac59ffea57fff56bd05137734e7685e9100595d3d88d906dff638ef8d1df54264c388d3eac1b05aa060 - languageName: node - linkType: hard - -"@peculiar/webcrypto@npm:^1.4.0": - version: 1.5.0 - resolution: "@peculiar/webcrypto@npm:1.5.0" - dependencies: - "@peculiar/asn1-schema": ^2.3.8 - "@peculiar/json-schema": ^1.1.12 - pvtsutils: ^1.3.5 - tslib: ^2.6.2 - webcrypto-core: ^1.8.0 - checksum: 9022d7452d564a5a26fbacf477842be34736f2d9139f2f5026adc47fdeda7033193d727491503f2a829d35ab819bbfa61c82a785c49c999eac535ecd69a3a459 - languageName: node - linkType: hard - "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -10973,13 +9423,6 @@ __metadata: languageName: node linkType: hard -"@prisma/debug@npm:5.19.1": - version: 5.19.1 - resolution: "@prisma/debug@npm:5.19.1" - checksum: 73fb1de49e09bf641501c7c5819d033b29df282af4f93c96a1347ee56888e4b946d27c6b72e285fe2d31603561e52d7d266d5fdb6b3d76ee2007df9178e28bef - languageName: node - linkType: hard - "@prisma/debug@npm:5.3.1": version: 5.3.1 resolution: "@prisma/debug@npm:5.3.1" @@ -11155,15 +9598,6 @@ __metadata: languageName: node linkType: hard -"@prisma/generator-helper@npm:^5.9.1": - version: 5.19.1 - resolution: "@prisma/generator-helper@npm:5.19.1" - dependencies: - "@prisma/debug": 5.19.1 - checksum: 8cb9cd971dd1d74d474d70373fc8c6f76fc9c669f956390acea36dc879241b1bbbf14b2e0d36d1872ef68cc4c532b44f4f0fc248135c8b7618b5b0ab46f2e0f6 - languageName: node - linkType: hard - "@prisma/generator-helper@npm:~3.8.1": version: 3.8.1 resolution: "@prisma/generator-helper@npm:3.8.1" @@ -11471,33 +9905,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-accordion@npm:^1.0.0": - version: 1.2.0 - resolution: "@radix-ui/react-accordion@npm:1.2.0" - dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-collapsible": 1.1.0 - "@radix-ui/react-collection": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-direction": 1.1.0 - "@radix-ui/react-id": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-controllable-state": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 7761c9e5758d4aa288d21ad02925cca0b58dbcab1ebe4de2c660b601d12a4cb50c9949a267a1d34d4a48fa87dd3076a4a476c28a22efdfbae219d6e51b99b760 - languageName: node - linkType: hard - "@radix-ui/react-arrow@npm:1.0.3": version: 1.0.3 resolution: "@radix-ui/react-arrow@npm:1.0.3" @@ -11568,32 +9975,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-collapsible@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-collapsible@npm:1.1.0" - dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-id": 1.1.0 - "@radix-ui/react-presence": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-controllable-state": 1.1.0 - "@radix-ui/react-use-layout-effect": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 1891dde55bf716d9619bd54da72bc65005cbc9dec2395079b53abe0bf4d655906bcbb85ca040e09b9bd8e3fcd0e58154a7ddc410b848db1dfb34ca1530459af0 - languageName: node - linkType: hard - "@radix-ui/react-collapsible@npm:^1.0.0": version: 1.0.3 resolution: "@radix-ui/react-collapsible@npm:1.0.3" @@ -11659,28 +10040,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-collection@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-collection@npm:1.1.0" - dependencies: - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-slot": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 70cee7f23cf19b0a9533723ba2ce80a40013d7b5e3588acd40e3f155cb46e0d94d9ebef58fd907d9862e2cb2b65f3f73315719597a790aefabfeae8a64566807 - languageName: node - linkType: hard - "@radix-ui/react-compose-refs@npm:0.1.0": version: 0.1.0 resolution: "@radix-ui/react-compose-refs@npm:0.1.0" @@ -11855,19 +10214,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-direction@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-direction@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 25ad0d1d65ad08c93cebfbefdff9ef2602e53f4573a66b37d2c366ede9485e75ec6fc8e7dd7d2939b34ea5504ca0fe6ac4a3acc2f6ee9b62d131d65486eafd49 - languageName: node - linkType: hard - "@radix-ui/react-dismissable-layer@npm:0.1.5": version: 0.1.5 resolution: "@radix-ui/react-dismissable-layer@npm:0.1.5" @@ -11950,29 +10296,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.0" - dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-callback-ref": 1.1.0 - "@radix-ui/react-use-escape-keydown": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 857feab2d5184a72df4e6dd9430c8e4b9fe7304790ef69512733346eee5fc33a6527256fc135d4bee6d94e8cc9c1b83c3d91da96cb4bf8300f88e9c660b71b08 - languageName: node - linkType: hard - "@radix-ui/react-dropdown-menu@npm:^2.0.5": version: 2.0.5 resolution: "@radix-ui/react-dropdown-menu@npm:2.0.5" @@ -12144,21 +10467,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-id@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-id@npm:1.1.0" - dependencies: - "@radix-ui/react-use-layout-effect": 1.1.0 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 6fbc9d1739b3b082412da10359e63967b4f3a60383ebda4c9e56b07a722d29bee53b203b3b1418f88854a29315a7715867133bb149e6e22a027a048cdd20d970 - languageName: node - linkType: hard - "@radix-ui/react-label@npm:0.1.5": version: 0.1.5 resolution: "@radix-ui/react-label@npm:0.1.5" @@ -12211,38 +10519,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-navigation-menu@npm:^1.0.0": - version: 1.2.0 - resolution: "@radix-ui/react-navigation-menu@npm:1.2.0" - dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-collection": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-direction": 1.1.0 - "@radix-ui/react-dismissable-layer": 1.1.0 - "@radix-ui/react-id": 1.1.0 - "@radix-ui/react-presence": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-callback-ref": 1.1.0 - "@radix-ui/react-use-controllable-state": 1.1.0 - "@radix-ui/react-use-layout-effect": 1.1.0 - "@radix-ui/react-use-previous": 1.1.0 - "@radix-ui/react-visually-hidden": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: bb0c18a1772148cb083a94879956261936a235345f442ab4ad6e906333daa074b9a6312ebb5977c667e9fa54e16bdf91dc96f3f46db6281955d3da363da08d2b - languageName: node - linkType: hard - "@radix-ui/react-popover@npm:^1.0.2": version: 1.0.6 resolution: "@radix-ui/react-popover@npm:1.0.6" @@ -12437,26 +10713,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-presence@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-presence@npm:1.1.0" - dependencies: - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-use-layout-effect": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 7f482268aa5bb5a4214dcf39d20ad93cac96585f1f248931be897ed8a9f99965b7f9b2e8bd4f4140c64eb243b471c471bf148e107f49578cc582faa773d3e83a - languageName: node - linkType: hard - "@radix-ui/react-primitive@npm:0.1.4": version: 0.1.4 resolution: "@radix-ui/react-primitive@npm:0.1.4" @@ -12578,33 +10834,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-roving-focus@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-roving-focus@npm:1.1.0" - dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-collection": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-direction": 1.1.0 - "@radix-ui/react-id": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-callback-ref": 1.1.0 - "@radix-ui/react-use-controllable-state": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 6f3a3fd047b0ac503f8a97297fba937c15653d01c883f344970f1c4206e9485572bc613f2561973f9010e96525ca87030ca5abf83a2e4dd67511f8b5afa20581 - languageName: node - linkType: hard - "@radix-ui/react-select@npm:^0.1.1": version: 0.1.1 resolution: "@radix-ui/react-select@npm:0.1.1" @@ -12831,32 +11060,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-tabs@npm:^1.0.0": - version: 1.1.0 - resolution: "@radix-ui/react-tabs@npm:1.1.0" - dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-direction": 1.1.0 - "@radix-ui/react-id": 1.1.0 - "@radix-ui/react-presence": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-roving-focus": 1.1.0 - "@radix-ui/react-use-controllable-state": 1.1.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 68200d65f02f1aa9d8c06f9a587dbf169e0a4efa715eb855d98f9dd8e3c0ba32981f431f4e306d2ff85005dfe2b0a905c8d5f9ee50f7a80abc1e4eb59ecd56d7 - languageName: node - linkType: hard - "@radix-ui/react-toast@npm:^1.1.5": version: 1.1.5 resolution: "@radix-ui/react-toast@npm:1.1.5" @@ -13150,21 +11353,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-use-escape-keydown@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" - dependencies: - "@radix-ui/react-use-callback-ref": 1.1.0 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 9bf88ea272b32ea0f292afd336780a59c5646f795036b7e6105df2d224d73c54399ee5265f61d571eb545d28382491a8b02dc436e3088de8dae415d58b959b71 - languageName: node - linkType: hard - "@radix-ui/react-use-layout-effect@npm:0.1.0": version: 0.1.0 resolution: "@radix-ui/react-use-layout-effect@npm:0.1.0" @@ -13333,25 +11521,6 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-visually-hidden@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-visually-hidden@npm:1.1.0" - dependencies: - "@radix-ui/react-primitive": 2.0.0 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 9e30775dc3bd562722b5671d91545e3e16111f9d1942c98188cb84935eb4a7d31ef1ad1e028e1f1d41e490392f295fbd55424106263869cc7028de9f6141363d - languageName: node - linkType: hard - "@radix-ui/rect@npm:1.0.1": version: 1.0.1 resolution: "@radix-ui/rect@npm:1.0.1" @@ -13451,13 +11620,6 @@ __metadata: languageName: node linkType: hard -"@repeaterjs/repeater@npm:^3.0.4, @repeaterjs/repeater@npm:^3.0.6": - version: 3.0.6 - resolution: "@repeaterjs/repeater@npm:3.0.6" - checksum: aae878b953162bec77c94b45f2236ddfc01a65308267c7cb30220fa2f8511654a302c0d32aad228c58241d685607d7bb35b6d528b2879355e6636ff08fddb266 - languageName: node - linkType: hard - "@resvg/resvg-wasm@npm:2.4.1": version: 2.4.1 resolution: "@resvg/resvg-wasm@npm:2.4.1" @@ -14379,29 +12541,6 @@ __metadata: languageName: node linkType: hard -"@sideway/address@npm:^4.1.5": - version: 4.1.5 - resolution: "@sideway/address@npm:4.1.5" - dependencies: - "@hapi/hoek": ^9.0.0 - checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d - languageName: node - linkType: hard - -"@sideway/formula@npm:^3.0.1": - version: 3.0.1 - resolution: "@sideway/formula@npm:3.0.1" - checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a - languageName: node - linkType: hard - -"@sideway/pinpoint@npm:^2.0.0": - version: 2.0.0 - resolution: "@sideway/pinpoint@npm:2.0.0" - checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.25.16": version: 0.25.24 resolution: "@sinclair/typebox@npm:0.25.24" @@ -14416,13 +12555,6 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 - languageName: node - linkType: hard - "@sindresorhus/is@npm:^5.2.0": version: 5.6.0 resolution: "@sindresorhus/is@npm:5.6.0" @@ -14949,27 +13081,13 @@ __metadata: languageName: node linkType: hard -"@stablelib/base64@npm:^1.0.0, @stablelib/base64@npm:^1.0.1": +"@stablelib/base64@npm:^1.0.0": version: 1.0.1 resolution: "@stablelib/base64@npm:1.0.1" checksum: 3ef4466d1d6889ac3fc67407bc21aa079953981c322eeca3b29f426d05506c63011faab1bfc042d7406e0677a94de6c9d2db2ce079afdd1eccae90031bfb5859 languageName: node linkType: hard -"@stablelib/hex@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/hex@npm:1.0.1" - checksum: 557f1c5d6b42963deee7627d4be1ae3542607851c5561e9419c42682d09562ebd3a06e2d92e088c52213a71ed121ec38221abfc5acd9e65707a77ecee3c96915 - languageName: node - linkType: hard - -"@stablelib/utf8@npm:^1.0.1": - version: 1.0.2 - resolution: "@stablelib/utf8@npm:1.0.2" - checksum: 3ab01baa4eb36eece44a310bf6b2e4313e8d585fc04dbcf8a5dc2d239f06071f34038b85aad6fbd98e9969f0b3b0584fcb541fe5e512c8f0cc0982b9fe1290a3 - languageName: node - linkType: hard - "@storybook/addon-actions@npm:7.6.3, @storybook/addon-actions@npm:^7.6.3": version: 7.6.3 resolution: "@storybook/addon-actions@npm:7.6.3" @@ -16128,16 +14246,6 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:0.5.5": - version: 0.5.5 - resolution: "@swc/helpers@npm:0.5.5" - dependencies: - "@swc/counter": ^0.1.3 - tslib: ^2.4.0 - checksum: d4f207b191e54b29460804ddf2984ba6ece1d679a0b2f6a9c765dcf27bba92c5769e7965668a4546fb9f1021eaf0ff9be4bf5c235ce12adcd65acdfe77187d11 - languageName: node - linkType: hard - "@swc/types@npm:^0.1.5": version: 0.1.5 resolution: "@swc/types@npm:0.1.5" @@ -16154,15 +14262,6 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: ^2.0.0 - checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 - languageName: node - linkType: hard - "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -16205,13 +14304,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.36.1": - version: 4.36.1 - resolution: "@tanstack/query-core@npm:4.36.1" - checksum: 47672094da20d89402d9fe03bb7b0462be73a76ff9ca715169738bc600a719d064d106d083a8eedae22a2c22de22f87d5eb5d31ef447aba771d9190f2117ed10 - languageName: node - linkType: hard - "@tanstack/query-core@npm:5.17.19": version: 5.17.19 resolution: "@tanstack/query-core@npm:5.17.19" @@ -16219,25 +14311,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/react-query@npm:^4.3.9": - version: 4.36.1 - resolution: "@tanstack/react-query@npm:4.36.1" - dependencies: - "@tanstack/query-core": 4.36.1 - use-sync-external-store: ^1.2.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: "*" - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - checksum: 1aff0a476859386f8d32253fa0d0bde7b81769a6d4d4d9cbd78778f0f955459a3bdb7ee27a0d2ee7373090f12998b45df80db0b5b313bd0a7a39d36c6e8e51c5 - languageName: node - linkType: hard - "@tanstack/react-query@npm:^5.17.15": version: 5.17.19 resolution: "@tanstack/react-query@npm:5.17.19" @@ -16261,18 +14334,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/react-virtual@npm:^3.0.0-beta.60": - version: 3.10.6 - resolution: "@tanstack/react-virtual@npm:3.10.6" - dependencies: - "@tanstack/virtual-core": 3.10.6 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 50624357867ce8eca4084bfe132b73fe7a2e0f9bcb2a7241b16425d58c0f7602c6f889f28d29a9416f7c3ab12d89239da48d0d84ca470ace94f77cf982d6246e - languageName: node - linkType: hard - "@tanstack/table-core@npm:8.9.3": version: 8.9.3 resolution: "@tanstack/table-core@npm:8.9.3" @@ -16280,13 +14341,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/virtual-core@npm:3.10.6": - version: 3.10.6 - resolution: "@tanstack/virtual-core@npm:3.10.6" - checksum: c7eeda2a2ad49b0b5065127094225877656b718301bcd972b80e55b19a7f2f063867a8d598544e824cc230d080124c9c34abeb8517c0ed3f5759c16c1f86acd8 - languageName: node - linkType: hard - "@tediousjs/connection-string@npm:^0.5.0": version: 0.5.0 resolution: "@tediousjs/connection-string@npm:0.5.0" @@ -16462,15 +14516,6 @@ __metadata: languageName: node linkType: hard -"@trpc/client@npm:^10.0.0": - version: 10.45.2 - resolution: "@trpc/client@npm:10.45.2" - peerDependencies: - "@trpc/server": 10.45.2 - checksum: d1eaa8e0059a371265065dafb48372be8456bc5bbc68f63c92401b12258cf15efb3f9f3790ef18ec6a0b7b73daa362bbd371f98db67c0610f2aee284f12cf09a - languageName: node - linkType: hard - "@trpc/next@npm:11.0.0-next-beta.222": version: 11.0.0-next-beta.222 resolution: "@trpc/next@npm:11.0.0-next-beta.222" @@ -16511,13 +14556,6 @@ __metadata: languageName: node linkType: hard -"@trpc/server@npm:^10.0.0": - version: 10.45.2 - resolution: "@trpc/server@npm:10.45.2" - checksum: 30b92853c45747a376bbbd5c4eef71fea17a2b22e83ba7e694fb13cc99b15d1f24a17aa9124346074618fb5cee8d13434aa16cdf24af82f5e8acabdecfee0ca2 - languageName: node - linkType: hard - "@tryvital/vital-node@npm:^1.4.6": version: 1.4.6 resolution: "@tryvital/vital-node@npm:1.4.6" @@ -16571,25 +14609,6 @@ __metadata: languageName: node linkType: hard -"@typeform/embed-react@npm:^1.2.4": - version: 1.21.0 - resolution: "@typeform/embed-react@npm:1.21.0" - dependencies: - "@typeform/embed": 1.38.0 - fast-deep-equal: ^3.1.3 - peerDependencies: - react: ">=16.8.0" - checksum: 1d91cb797dfe7b27e08798f7a571f34724a8f56bf9c89a8ed2a454820efce2de4db44fd4a18f446573784c28f79478f269c1719500e1b332e7ea34ea77ffa185 - languageName: node - linkType: hard - -"@typeform/embed@npm:1.38.0": - version: 1.38.0 - resolution: "@typeform/embed@npm:1.38.0" - checksum: 41115134e5cee28f5e031181b4525c7885d23707699cf183921110262717c7544bfd101428267410b812914c235687783e373ce98e37bdc447d72f8177663597 - languageName: node - linkType: hard - "@types/accept-language-parser@npm:1.5.2": version: 1.5.2 resolution: "@types/accept-language-parser@npm:1.5.2" @@ -16701,18 +14720,6 @@ __metadata: languageName: node linkType: hard -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" - dependencies: - "@types/http-cache-semantics": "*" - "@types/keyv": ^3.1.4 - "@types/node": "*" - "@types/responselike": ^1.0.0 - checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 - languageName: node - linkType: hard - "@types/chai-subset@npm:^1.3.3": version: 1.3.3 resolution: "@types/chai-subset@npm:1.3.3" @@ -16894,13 +14901,6 @@ __metadata: languageName: node linkType: hard -"@types/debounce@npm:^1.2.1": - version: 1.2.4 - resolution: "@types/debounce@npm:1.2.4" - checksum: decef3eee65d681556d50f7fac346f1b33134f6b21f806d41326f9dfb362fa66b0282ff0640ae6791b690694c9dc3dad4e146e909e707e6f96650f3aa325b9da - languageName: node - linkType: hard - "@types/debug@npm:4.1.7": version: 4.1.7 resolution: "@types/debug@npm:4.1.7" @@ -16928,15 +14928,6 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.0.0": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "*" - checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 - languageName: node - linkType: hard - "@types/detect-port@npm:^1.3.0": version: 1.3.5 resolution: "@types/detect-port@npm:1.3.5" @@ -17006,15 +14997,6 @@ __metadata: languageName: node linkType: hard -"@types/estree-jsx@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree-jsx@npm:1.0.5" - dependencies: - "@types/estree": "*" - checksum: a028ab0cd7b2950168a05c6a86026eb3a36a54a4adfae57f13911d7b49dffe573d9c2b28421b2d029b49b3d02fcd686611be2622dc3dad6d9791166c083f6008 - languageName: node - linkType: hard - "@types/estree@npm:*, @types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" @@ -17142,13 +15124,6 @@ __metadata: languageName: node linkType: hard -"@types/gtag.js@npm:^0.0.10": - version: 0.0.10 - resolution: "@types/gtag.js@npm:0.0.10" - checksum: 5c18ffdc64418887763ec1a564e73c9fbf222ff3eece1fbc35a182fdd884e7884bb7708f67e6e4939f157bb9f2cb7a4aff42be7834527e35c5aac4f98783164c - languageName: node - linkType: hard - "@types/hast@npm:^2.0.0": version: 2.3.4 resolution: "@types/hast@npm:2.3.4" @@ -17158,15 +15133,6 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/hast@npm:3.0.4" - dependencies: - "@types/unist": "*" - checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 - languageName: node - linkType: hard - "@types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" @@ -17191,7 +15157,7 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2": +"@types/http-cache-semantics@npm:^4.0.2": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" checksum: 7f4dd832e618bc1e271be49717d7b4066d77c2d4eed5b81198eb987e532bb3e1c7e02f45d77918185bad936f884b700c10cebe06305f50400f382ab75055f9e8 @@ -17282,13 +15248,6 @@ __metadata: languageName: node linkType: hard -"@types/js-yaml@npm:^4.0.0": - version: 4.0.9 - resolution: "@types/js-yaml@npm:4.0.9" - checksum: e5e5e49b5789a29fdb1f7d204f82de11cb9e8f6cb24ab064c616da5d6e1b3ccfbf95aa5d1498a9fbd3b9e745564e69b4a20b6c530b5a8bbb2d4eb830cda9bc69 - languageName: node - linkType: hard - "@types/jsdom@npm:^21.1.3": version: 21.1.4 resolution: "@types/jsdom@npm:21.1.4" @@ -17373,15 +15332,6 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "*" - checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d - languageName: node - linkType: hard - "@types/koa-compose@npm:*": version: 3.2.8 resolution: "@types/koa-compose@npm:3.2.8" @@ -17477,24 +15427,6 @@ __metadata: languageName: node linkType: hard -"@types/mdast@npm:^3.0.0": - version: 3.0.15 - resolution: "@types/mdast@npm:3.0.15" - dependencies: - "@types/unist": ^2 - checksum: af85042a4e3af3f879bde4059fa9e76c71cb552dffc896cdcc6cf9dc1fd38e37035c2dbd6245cfa6535b433f1f0478f5549696234ccace47a64055a10c656530 - languageName: node - linkType: hard - -"@types/mdast@npm:^4.0.0": - version: 4.0.4 - resolution: "@types/mdast@npm:4.0.4" - dependencies: - "@types/unist": "*" - checksum: 20c4e9574cc409db662a35cba52b068b91eb696b3049e94321219d47d34c8ccc99a142be5c76c80a538b612457b03586bc2f6b727a3e9e7530f4c8568f6282ee - languageName: node - linkType: hard - "@types/mdurl@npm:*": version: 1.0.2 resolution: "@types/mdurl@npm:1.0.2" @@ -17502,13 +15434,6 @@ __metadata: languageName: node linkType: hard -"@types/mdurl@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/mdurl@npm:1.0.5" - checksum: e8e872e8da8f517a9c748b06cec61c947cb73fd3069e8aeb0926670ec5dfac5d30549b3d0f1634950401633e812f9b7263f2d5dbe7e98fce12bcb2c659aa4b21 - languageName: node - linkType: hard - "@types/mdx@npm:^2.0.0": version: 2.0.10 resolution: "@types/mdx@npm:2.0.10" @@ -17639,13 +15564,6 @@ __metadata: languageName: node linkType: hard -"@types/parse5@npm:^6.0.0": - version: 6.0.3 - resolution: "@types/parse5@npm:6.0.3" - checksum: ddb59ee4144af5dfcc508a8dcf32f37879d11e12559561e65788756b95b33e6f03ea027d88e1f5408f9b7bfb656bf630ace31a2169edf44151daaf8dd58df1b7 - languageName: node - linkType: hard - "@types/passport-jwt@npm:^3.0.13": version: 3.0.13 resolution: "@types/passport-jwt@npm:3.0.13" @@ -17773,13 +15691,6 @@ __metadata: languageName: node linkType: hard -"@types/react-gtm-module@npm:^2.0.1": - version: 2.0.3 - resolution: "@types/react-gtm-module@npm:2.0.3" - checksum: b4b892c9efe93f6f624a42ffe5de37ef7615139191eccc127f7dc2006a70b0540aacb0dc882e3452c344498fdc7f2d4eafc53fe3a33696c1e60fc6852ac650f5 - languageName: node - linkType: hard - "@types/react-phone-number-input@npm:^3.0.14": version: 3.0.14 resolution: "@types/react-phone-number-input@npm:3.0.14" @@ -17842,15 +15753,6 @@ __metadata: languageName: node linkType: hard -"@types/responselike@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/responselike@npm:1.0.3" - dependencies: - "@types/node": "*" - checksum: 6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 - languageName: node - linkType: hard - "@types/retry@npm:0.12.0": version: 0.12.0 resolution: "@types/retry@npm:0.12.0" @@ -18027,20 +15929,6 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:^2": - version: 2.0.11 - resolution: "@types/unist@npm:2.0.11" - checksum: 6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e - languageName: node - linkType: hard - -"@types/unist@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/unist@npm:3.0.3" - checksum: 96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a - languageName: node - linkType: hard - "@types/uuid@npm:8.3.1": version: 8.3.1 resolution: "@types/uuid@npm:8.3.1" @@ -18087,24 +15975,6 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.0.0": - version: 8.5.12 - resolution: "@types/ws@npm:8.5.12" - dependencies: - "@types/node": "*" - checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 - languageName: node - linkType: hard - -"@types/xml2js@npm:^0.4.11": - version: 0.4.14 - resolution: "@types/xml2js@npm:0.4.14" - dependencies: - "@types/node": "*" - checksum: df9f106b9953dcdec7ba3304ebc56d6c2f61d49bf556d600bed439f94a1733f73ca0bf2d0f64330b402191622862d9d6058bab9d7e3dcb5b0fe51ebdc4372aac - languageName: node - linkType: hard - "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -18419,7 +16289,7 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 @@ -18463,15 +16333,6 @@ __metadata: languageName: node linkType: hard -"@vercel/analytics@npm:^0.1.6": - version: 0.1.11 - resolution: "@vercel/analytics@npm:0.1.11" - peerDependencies: - react: ^16.8||^17||^18 - checksum: 05b8180ac6e23ebe7c09d74c43f8ee78c408cd0b6546e676389cbf4fba44dfeeae3648c9b52e2421be64fe3aeee8b026e6ea4bdfc0589fb5780670f2b090a167 - languageName: node - linkType: hard - "@vercel/edge-config@npm:^0.1.1": version: 0.1.1 resolution: "@vercel/edge-config@npm:0.1.1" @@ -18505,6 +16366,18 @@ __metadata: languageName: node linkType: hard +"@vercel/functions@npm:^1.4.1": + version: 1.4.1 + resolution: "@vercel/functions@npm:1.4.1" + peerDependencies: + "@aws-sdk/credential-provider-web-identity": "*" + peerDependenciesMeta: + "@aws-sdk/credential-provider-web-identity": + optional: true + checksum: 55d949be4f7d400a934dcd1d1b05380d90a9ff98f1d40503095d1d94e2a8c7a3ace65e1a59dfd36ef07b7a8639ed22877fd07efb1abf3002edca7edae7470eb8 + languageName: node + linkType: hard + "@vercel/og@npm:^0.5.0": version: 0.5.0 resolution: "@vercel/og@npm:0.5.0" @@ -18859,77 +16732,6 @@ __metadata: languageName: node linkType: hard -"@whatwg-node/events@npm:^0.0.3": - version: 0.0.3 - resolution: "@whatwg-node/events@npm:0.0.3" - checksum: af26f40d4d0a0f5f0ee45fc6124afb8d6b33988dae96ab0fb87aa5e66d1ff08a749491b9da533ea524bbaebd4a770736f254d574a91ab4455386aa098cee8c77 - languageName: node - linkType: hard - -"@whatwg-node/fetch@npm:^0.5.3": - version: 0.5.4 - resolution: "@whatwg-node/fetch@npm:0.5.4" - dependencies: - "@peculiar/webcrypto": ^1.4.0 - abort-controller: ^3.0.0 - busboy: ^1.6.0 - form-data-encoder: ^1.7.1 - formdata-node: ^4.3.1 - node-fetch: ^2.6.7 - undici: ^5.12.0 - web-streams-polyfill: ^3.2.0 - checksum: 6fb6c6a582cb78fc438beee11f1d931eabc0ac8b5b660b68ea30a42c2068f4d3126d2b07e21770a4d6f391e70979bae527ca892898da9857e73dc3cc7adb8da9 - languageName: node - linkType: hard - -"@whatwg-node/fetch@npm:^0.8.0": - version: 0.8.8 - resolution: "@whatwg-node/fetch@npm:0.8.8" - dependencies: - "@peculiar/webcrypto": ^1.4.0 - "@whatwg-node/node-fetch": ^0.3.6 - busboy: ^1.6.0 - urlpattern-polyfill: ^8.0.0 - web-streams-polyfill: ^3.2.1 - checksum: 891407ba57e32e5af70a3b0a86980c4466dcf2ba8581b6927475c85400280b163085519e98821dd94776da9aa1b0b1e221e718009e2abed9c8a0d4721025b2ab - languageName: node - linkType: hard - -"@whatwg-node/fetch@npm:^0.9.0": - version: 0.9.21 - resolution: "@whatwg-node/fetch@npm:0.9.21" - dependencies: - "@whatwg-node/node-fetch": ^0.5.23 - urlpattern-polyfill: ^10.0.0 - checksum: 09cea7a1de578f812f403ebbc2a325d57f7055b415cdaffe9d1f2e05d32ecdc5b61d0ff9aab6271f250a8f360fbbaf2f0e773ff2570b777c3d005507a3c9d950 - languageName: node - linkType: hard - -"@whatwg-node/node-fetch@npm:^0.3.6": - version: 0.3.6 - resolution: "@whatwg-node/node-fetch@npm:0.3.6" - dependencies: - "@whatwg-node/events": ^0.0.3 - busboy: ^1.6.0 - fast-querystring: ^1.1.1 - fast-url-parser: ^1.1.3 - tslib: ^2.3.1 - checksum: d3d7b0a0242c0511c7b666de66d9096fb24ea251426ce76e3a26a8ca17408de5d4d4f81b5aaec840cc7025f0321fb97e06067c53f377c844a5a9473dd76491ae - languageName: node - linkType: hard - -"@whatwg-node/node-fetch@npm:^0.5.23": - version: 0.5.26 - resolution: "@whatwg-node/node-fetch@npm:0.5.26" - dependencies: - "@kamilkisiela/fast-url-parser": ^1.1.4 - busboy: ^1.6.0 - fast-querystring: ^1.1.1 - tslib: ^2.6.3 - checksum: 00f344ee406d6ae421d0b78ec436106c44a539f5f748d2724d533fb4893c96eff3635e0e191781d57a7876dbe36ffb18ff897df437a55d0eb35285158bfc4eab - languageName: node - linkType: hard - "@wojtekmaj/date-utils@npm:^1.0.2, @wojtekmaj/date-utils@npm:^1.0.3": version: 1.0.3 resolution: "@wojtekmaj/date-utils@npm:1.0.3" @@ -19713,13 +17515,6 @@ __metadata: languageName: node linkType: hard -"array-flatten@npm:^3.0.0": - version: 3.0.0 - resolution: "array-flatten@npm:3.0.0" - checksum: ad00c51ca70cf837501fb6da823ba39bc6a86b43d0b76d840daa02fe0f8e68e94ad5bc2d0d038053118b879aaca8ea6168c32c7387a2fa5b118ad28db4f1f863 - languageName: node - linkType: hard - "array-includes@npm:^3.1.4": version: 3.1.4 resolution: "array-includes@npm:3.1.4" @@ -20021,17 +17816,6 @@ __metadata: languageName: node linkType: hard -"asn1js@npm:^3.0.1, asn1js@npm:^3.0.5": - version: 3.0.5 - resolution: "asn1js@npm:3.0.5" - dependencies: - pvtsutils: ^1.3.2 - pvutils: ^1.1.3 - tslib: ^2.4.0 - checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb - languageName: node - linkType: hard - "assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": version: 1.0.0 resolution: "assert-plus@npm:1.0.0" @@ -20123,13 +17907,6 @@ __metadata: languageName: node linkType: hard -"async-scheduler@npm:^1.4.4": - version: 1.4.4 - resolution: "async-scheduler@npm:1.4.4" - checksum: 080310e642bc4309aa83d625b21f9f0f1291bd0a292361cf6c0ebc86646ca719888bebc3d519f8ed177130b623b0f20640dad7f24fd8c2ede31d6d6f976968a4 - languageName: node - linkType: hard - "async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -20182,7 +17959,7 @@ __metadata: languageName: node linkType: hard -"auto-bind@npm:4.0.0, auto-bind@npm:~4.0.0": +"auto-bind@npm:4.0.0": version: 4.0.0 resolution: "auto-bind@npm:4.0.0" checksum: 00cad71cce5742faccb7dd65c1b55ebc4f45add4b0c9a1547b10b05bab22813230133b0c892c67ba3eb969a4524710c5e43cc45c72898ec84e56f3a596e7a04f @@ -20366,17 +18143,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.1": - version: 1.7.7 - resolution: "axios@npm:1.7.7" - dependencies: - follow-redirects: ^1.15.6 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe - languageName: node - linkType: hard - "axios@npm:^1.6.7": version: 1.6.8 resolution: "axios@npm:1.6.8" @@ -20544,13 +18310,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-syntax-trailing-function-commas@npm:^7.0.0-beta.0": - version: 7.0.0-beta.0 - resolution: "babel-plugin-syntax-trailing-function-commas@npm:7.0.0-beta.0" - checksum: e37509156ca945dd9e4b82c66dd74f2d842ad917bd280cb5aa67960942300cd065eeac476d2514bdcdedec071277a358f6d517c31d9f9244d9bbc3619a8ecf8a - languageName: node - linkType: hard - "babel-preset-current-node-syntax@npm:^1.0.0": version: 1.0.1 resolution: "babel-preset-current-node-syntax@npm:1.0.1" @@ -20573,43 +18332,6 @@ __metadata: languageName: node linkType: hard -"babel-preset-fbjs@npm:^3.4.0": - version: 3.4.0 - resolution: "babel-preset-fbjs@npm:3.4.0" - dependencies: - "@babel/plugin-proposal-class-properties": ^7.0.0 - "@babel/plugin-proposal-object-rest-spread": ^7.0.0 - "@babel/plugin-syntax-class-properties": ^7.0.0 - "@babel/plugin-syntax-flow": ^7.0.0 - "@babel/plugin-syntax-jsx": ^7.0.0 - "@babel/plugin-syntax-object-rest-spread": ^7.0.0 - "@babel/plugin-transform-arrow-functions": ^7.0.0 - "@babel/plugin-transform-block-scoped-functions": ^7.0.0 - "@babel/plugin-transform-block-scoping": ^7.0.0 - "@babel/plugin-transform-classes": ^7.0.0 - "@babel/plugin-transform-computed-properties": ^7.0.0 - "@babel/plugin-transform-destructuring": ^7.0.0 - "@babel/plugin-transform-flow-strip-types": ^7.0.0 - "@babel/plugin-transform-for-of": ^7.0.0 - "@babel/plugin-transform-function-name": ^7.0.0 - "@babel/plugin-transform-literals": ^7.0.0 - "@babel/plugin-transform-member-expression-literals": ^7.0.0 - "@babel/plugin-transform-modules-commonjs": ^7.0.0 - "@babel/plugin-transform-object-super": ^7.0.0 - "@babel/plugin-transform-parameters": ^7.0.0 - "@babel/plugin-transform-property-literals": ^7.0.0 - "@babel/plugin-transform-react-display-name": ^7.0.0 - "@babel/plugin-transform-react-jsx": ^7.0.0 - "@babel/plugin-transform-shorthand-properties": ^7.0.0 - "@babel/plugin-transform-spread": ^7.0.0 - "@babel/plugin-transform-template-literals": ^7.0.0 - babel-plugin-syntax-trailing-function-commas: ^7.0.0-beta.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: b3352cf690729125997f254bc31b9c4db347f8646f1571958ced1c45f0da89439e183e1c88e35397eb0361b9e1fbb1dd8142d3f4647814deb427e53c54f44d5f - languageName: node - linkType: hard - "babel-preset-jest@npm:^29.6.3": version: 29.6.3 resolution: "babel-preset-jest@npm:29.6.3" @@ -20622,23 +18344,6 @@ __metadata: languageName: node linkType: hard -"babel-runtime@npm:^6.11.6": - version: 6.26.0 - resolution: "babel-runtime@npm:6.26.0" - dependencies: - core-js: ^2.4.0 - regenerator-runtime: ^0.11.0 - checksum: 8aeade94665e67a73c1ccc10f6fd42ba0c689b980032b70929de7a6d9a12eb87ef51902733f8fefede35afea7a5c3ef7e916a64d503446c1eedc9e3284bd3d50 - languageName: node - linkType: hard - -"bail@npm:^2.0.0": - version: 2.0.2 - resolution: "bail@npm:2.0.2" - checksum: aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -21136,20 +18841,6 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.23.1": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" - dependencies: - caniuse-lite: ^1.0.30001646 - electron-to-chromium: ^1.5.4 - node-releases: ^2.0.18 - update-browserslist-db: ^1.1.0 - bin: - browserslist: cli.js - checksum: 7906064f9970aeb941310b2fcb8b4ace4a1b50aa657c986677c6f1553a8cabcc94ee9c5922f715baffbedaa0e6cf0831b6fed7b059dde6873a4bfadcbe069c7e - languageName: node - linkType: hard - "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -21298,7 +18989,7 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0, busboy@npm:^1.0.0, busboy@npm:^1.6.0": +"busboy@npm:1.6.0, busboy@npm:^1.0.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" dependencies: @@ -21383,13 +19074,6 @@ __metadata: languageName: node linkType: hard -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d - languageName: node - linkType: hard - "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -21412,21 +19096,6 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^7.0.2": - version: 7.0.4 - resolution: "cacheable-request@npm:7.0.4" - dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^4.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^6.0.1 - responselike: ^2.0.0 - checksum: 0de9df773fd4e7dd9bd118959878f8f2163867e2e1ab3575ffbecbe6e75e80513dd0c68ba30005e5e5a7b377cc6162bbc00ab1db019bb4e9cb3c2f3f7a6f1ee4 - languageName: node - linkType: hard - "calcom-monorepo@workspace:.": version: 0.0.0-use.local resolution: "calcom-monorepo@workspace:." @@ -21524,16 +19193,6 @@ __metadata: languageName: node linkType: hard -"camel-case@npm:^3.0.0": - version: 3.0.0 - resolution: "camel-case@npm:3.0.0" - dependencies: - no-case: ^2.2.0 - upper-case: ^1.1.1 - checksum: 4190ed6ab8acf4f3f6e1a78ad4d0f3f15ce717b6bfa1b5686d58e4bcd29960f6e312dd746b5fa259c6d452f1413caef25aee2e10c9b9a580ac83e516533a961a - languageName: node - linkType: hard - "camel-case@npm:^4.1.2": version: 4.1.2 resolution: "camel-case@npm:4.1.2" @@ -21562,13 +19221,6 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^3.0.0": - version: 3.0.0 - resolution: "camelcase@npm:3.0.0" - checksum: ae4fe1c17c8442a3a345a6b7d2393f028ab7a7601af0c352ad15d1ab97ca75112e19e29c942b2a214898e160194829b68923bce30e018d62149c6d84187f1673 - languageName: node - linkType: hard - "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -21625,13 +19277,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001655 - resolution: "caniuse-lite@npm:1.0.30001655" - checksum: 3739c8f6d0fb55cff3c631d28c4fdafc81ab28756ce17a373428042c06f84a5877288d89fbe41be5ac494dd5092dca38ab91c9304e81935b9f2938419d2c23b3 - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591": version: 1.0.30001597 resolution: "caniuse-lite@npm:1.0.30001597" @@ -21646,17 +19291,6 @@ __metadata: languageName: node linkType: hard -"capital-case@npm:^1.0.4": - version: 1.0.4 - resolution: "capital-case@npm:1.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - upper-case-first: ^2.0.2 - checksum: 41fa8fa87f6d24d0835a2b4a9341a3eaecb64ac29cd7c5391f35d6175a0fa98ab044e7f2602e1ec3afc886231462ed71b5b80c590b8b41af903ec2c15e5c5931 - languageName: node - linkType: hard - "cardinal@npm:^2.1.1": version: 2.1.1 resolution: "cardinal@npm:2.1.1" @@ -21683,13 +19317,6 @@ __metadata: languageName: node linkType: hard -"ccount@npm:^2.0.0": - version: 2.0.1 - resolution: "ccount@npm:2.0.1" - checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 - languageName: node - linkType: hard - "chai@npm:^4.3.10": version: 4.3.10 resolution: "chai@npm:4.3.10" @@ -21766,24 +19393,6 @@ __metadata: languageName: node linkType: hard -"change-case-all@npm:1.0.15": - version: 1.0.15 - resolution: "change-case-all@npm:1.0.15" - dependencies: - change-case: ^4.1.2 - is-lower-case: ^2.0.2 - is-upper-case: ^2.0.2 - lower-case: ^2.0.2 - lower-case-first: ^2.0.2 - sponge-case: ^1.0.1 - swap-case: ^2.0.2 - title-case: ^3.0.3 - upper-case: ^2.0.2 - upper-case-first: ^2.0.2 - checksum: e1dabdcd8447a3690f3faf15f92979dfbc113109b50916976e1d5e518e6cfdebee4f05f54d0ca24fb79a4bf835185b59ae25e967bb3dc10bd236a775b19ecc52 - languageName: node - linkType: hard - "change-case@npm:^2.3.0": version: 2.3.1 resolution: "change-case@npm:2.3.1" @@ -21808,52 +19417,6 @@ __metadata: languageName: node linkType: hard -"change-case@npm:^3.0.0": - version: 3.1.0 - resolution: "change-case@npm:3.1.0" - dependencies: - camel-case: ^3.0.0 - constant-case: ^2.0.0 - dot-case: ^2.1.0 - header-case: ^1.0.0 - is-lower-case: ^1.1.0 - is-upper-case: ^1.1.0 - lower-case: ^1.1.1 - lower-case-first: ^1.0.0 - no-case: ^2.3.2 - param-case: ^2.1.0 - pascal-case: ^2.0.0 - path-case: ^2.1.0 - sentence-case: ^2.1.0 - snake-case: ^2.1.0 - swap-case: ^1.1.0 - title-case: ^2.1.0 - upper-case: ^1.1.1 - upper-case-first: ^1.1.0 - checksum: d6f9f90a5f1d2a98294e06ea62f913fa0d7cfc289f188bf05662344da6128f5710b5c99ece83682c6a848db8d996b7348e09b2235dc3363afb6ae7142e7978e1 - languageName: node - linkType: hard - -"change-case@npm:^4.1.2": - version: 4.1.2 - resolution: "change-case@npm:4.1.2" - dependencies: - camel-case: ^4.1.2 - capital-case: ^1.0.4 - constant-case: ^3.0.4 - dot-case: ^3.0.4 - header-case: ^2.0.4 - no-case: ^3.0.4 - param-case: ^3.0.4 - pascal-case: ^3.1.2 - path-case: ^3.0.4 - sentence-case: ^3.0.4 - snake-case: ^3.0.4 - tslib: ^2.0.3 - checksum: e4bc4a093a1f7cce8b33896665cf9e456e3bc3cc0def2ad7691b1994cfca99b3188d0a513b16855b01a6bd20692fcde12a7d4d87a5615c4c515bbbf0e651f116 - languageName: node - linkType: hard - "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -21861,13 +19424,6 @@ __metadata: languageName: node linkType: hard -"character-entities-html4@npm:^2.0.0": - version: 2.1.0 - resolution: "character-entities-html4@npm:2.1.0" - checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d - languageName: node - linkType: hard - "character-entities-legacy@npm:^1.0.0": version: 1.1.4 resolution: "character-entities-legacy@npm:1.1.4" @@ -21875,13 +19431,6 @@ __metadata: languageName: node linkType: hard -"character-entities-legacy@npm:^3.0.0": - version: 3.0.0 - resolution: "character-entities-legacy@npm:3.0.0" - checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 - languageName: node - linkType: hard - "character-entities@npm:^1.0.0": version: 1.2.4 resolution: "character-entities@npm:1.2.4" @@ -21889,13 +19438,6 @@ __metadata: languageName: node linkType: hard -"character-entities@npm:^2.0.0": - version: 2.0.2 - resolution: "character-entities@npm:2.0.2" - checksum: cf1643814023697f725e47328fcec17923b8f1799102a8a79c1514e894815651794a2bffd84bb1b3a4b124b050154e4529ed6e81f7c8068a734aecf07a6d3def - languageName: node - linkType: hard - "character-reference-invalid@npm:^1.0.0": version: 1.1.4 resolution: "character-reference-invalid@npm:1.1.4" @@ -21903,13 +19445,6 @@ __metadata: languageName: node linkType: hard -"character-reference-invalid@npm:^2.0.0": - version: 2.0.1 - resolution: "character-reference-invalid@npm:2.0.1" - checksum: 98d3b1a52ae510b7329e6ee7f6210df14f1e318c5415975d4c9e7ee0ef4c07875d47c6e74230c64551f12f556b4a8ccc24d9f3691a2aa197019e72a95e9297ee - languageName: node - linkType: hard - "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -21924,13 +19459,6 @@ __metadata: languageName: node linkType: hard -"chart.js@npm:^3.7.1": - version: 3.9.1 - resolution: "chart.js@npm:3.9.1" - checksum: 9ab0c0ac01215af0b3f020f2e313030fd6e347b48ed17d5484ee9c4e8ead45e78ae71bea16c397621c386b409ce0b14bf17f9f6c2492cd15b56c0f433efdfff6 - languageName: node - linkType: hard - "check-error@npm:^1.0.3": version: 1.0.3 resolution: "check-error@npm:1.0.3" @@ -22327,24 +19855,13 @@ __metadata: languageName: node linkType: hard -"client-only@npm:0.0.1, client-only@npm:^0.0.1": +"client-only@npm:0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 languageName: node linkType: hard -"cliui@npm:^3.2.0": - version: 3.2.0 - resolution: "cliui@npm:3.2.0" - dependencies: - string-width: ^1.0.1 - strip-ansi: ^3.0.1 - wrap-ansi: ^2.0.0 - checksum: c68d1dbc3e347bfe79ed19cc7f48007d5edd6cd8438342e32073e0b4e311e3c44e1f4f19221462bc6590de56c2df520e427533a9dde95dee25710bec322746ad - languageName: node - linkType: hard - "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -22389,15 +19906,6 @@ __metadata: languageName: node linkType: hard -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" - dependencies: - mimic-response: ^1.0.0 - checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e - languageName: node - linkType: hard - "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -22426,13 +19934,6 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.2.1": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 - languageName: node - linkType: hard - "clsx@npm:^2.0.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" @@ -22483,15 +19984,6 @@ __metadata: languageName: node linkType: hard -"cobe@npm:^0.4.1": - version: 0.4.2 - resolution: "cobe@npm:0.4.2" - dependencies: - phenomenon: ^1.6.0 - checksum: 4c11dd8cf3c6614a2ff2f6eacca5283278c6db06c2e441011aa90f58c66d045e66ef98a5e4b9d0282d58ee22f5b87d965538aa4c6064ed97f436f3e4cd9ee3ed - languageName: node - linkType: hard - "code-block-writer@npm:^11.0.0": version: 11.0.0 resolution: "code-block-writer@npm:11.0.0" @@ -22510,13 +20002,6 @@ __metadata: languageName: node linkType: hard -"code-point-at@npm:^1.0.0": - version: 1.1.0 - resolution: "code-point-at@npm:1.1.0" - checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681 - languageName: node - linkType: hard - "coffeescript@npm:^1.10.0": version: 1.12.7 resolution: "coffeescript@npm:1.12.7" @@ -22652,13 +20137,6 @@ __metadata: languageName: node linkType: hard -"comma-separated-tokens@npm:^2.0.0": - version: 2.0.3 - resolution: "comma-separated-tokens@npm:2.0.3" - checksum: e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d - languageName: node - linkType: hard - "command-score@npm:0.1.2, command-score@npm:^0.1.2": version: 0.1.2 resolution: "command-score@npm:0.1.2" @@ -22766,13 +20244,6 @@ __metadata: languageName: node linkType: hard -"common-tags@npm:1.8.2": - version: 1.8.2 - resolution: "common-tags@npm:1.8.2" - checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff - languageName: node - linkType: hard - "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -22868,26 +20339,6 @@ __metadata: languageName: node linkType: hard -"concurrently@npm:^7.6.0": - version: 7.6.0 - resolution: "concurrently@npm:7.6.0" - dependencies: - chalk: ^4.1.0 - date-fns: ^2.29.1 - lodash: ^4.17.21 - rxjs: ^7.0.0 - shell-quote: ^1.7.3 - spawn-command: ^0.0.2-1 - supports-color: ^8.1.0 - tree-kill: ^1.2.2 - yargs: ^17.3.1 - bin: - conc: dist/bin/concurrently.js - concurrently: dist/bin/concurrently.js - checksum: f705c9a7960f1b16559ca64958043faeeef6385c0bf30a03d1375e15ab2d96dba4f8166f1bbbb1c85e8da35ca0ce3c353875d71dff2aa132b2357bb533b3332e - languageName: node - linkType: hard - "conf@npm:10.2.0": version: 10.2.0 resolution: "conf@npm:10.2.0" @@ -22972,27 +20423,6 @@ __metadata: languageName: node linkType: hard -"constant-case@npm:^2.0.0": - version: 2.0.0 - resolution: "constant-case@npm:2.0.0" - dependencies: - snake-case: ^2.1.0 - upper-case: ^1.1.1 - checksum: 893c793a425ebcd0744061c7f12650c655aae259b89d5654fb8eda42d22c3690716a4988ed03f2abe370b1ee7bfec44f8e4395e76e2f1458a8921982b15410ba - languageName: node - linkType: hard - -"constant-case@npm:^3.0.4": - version: 3.0.4 - resolution: "constant-case@npm:3.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - upper-case: ^2.0.2 - checksum: 6c3346d51afc28d9fae922e966c68eb77a19d94858dba230dd92d7b918b37d36db50f0311e9ecf6847e43e934b1c01406a0936973376ab17ec2c471fbcfb2cf3 - languageName: node - linkType: hard - "constants-browserify@npm:^1.0.0": version: 1.0.0 resolution: "constants-browserify@npm:1.0.0" @@ -23173,13 +20603,6 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^2.4.0": - version: 2.6.12 - resolution: "core-js@npm:2.6.12" - checksum: 44fa9934a85f8c78d61e0c8b7b22436330471ffe59ec5076fe7f324d6e8cf7f824b14b1c81ca73608b13bdb0fef035bd820989bf059767ad6fa13123bb8bd016 - languageName: node - linkType: hard - "core-js@npm:^3": version: 3.21.1 resolution: "core-js@npm:3.21.1" @@ -23211,7 +20634,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:9.0.0, cosmiconfig@npm:^9.0.0": +"cosmiconfig@npm:9.0.0": version: 9.0.0 resolution: "cosmiconfig@npm:9.0.0" dependencies: @@ -23254,7 +20677,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0": +"cosmiconfig@npm:^8.2.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -23380,18 +20803,6 @@ __metadata: languageName: node linkType: hard -"cross-env@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-env@npm:7.0.3" - dependencies: - cross-spawn: ^7.0.1 - bin: - cross-env: src/bin/cross-env.js - cross-env-shell: src/bin/cross-env-shell.js - checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79 - languageName: node - linkType: hard - "cross-fetch@npm:3.1.5, cross-fetch@npm:^3.1.5": version: 3.1.5 resolution: "cross-fetch@npm:3.1.5" @@ -23410,16 +20821,7 @@ __metadata: languageName: node linkType: hard -"cross-inspect@npm:1.0.1": - version: 1.0.1 - resolution: "cross-inspect@npm:1.0.1" - dependencies: - tslib: ^2.4.0 - checksum: 7c1e02e0a9670b62416a3ea1df7ae880fdad3aa0a857de8932c4e5f8acd71298c7e3db9da8e9da603f5692cd1879938f5e72e34a9f5d1345987bef656d117fc1 - languageName: node - linkType: hard - -"cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -23893,13 +21295,6 @@ __metadata: languageName: node linkType: hard -"dataloader@npm:^2.2.2": - version: 2.2.2 - resolution: "dataloader@npm:2.2.2" - checksum: 4dabd247089c29f194e94d5434d504f99156c5c214a03463c20f3f17f40398d7e179edee69a27c16e315519ac8739042a810090087ae26449a0e685156a02c65 - languageName: node - linkType: hard - "date-fns@npm:^2.28.0": version: 2.29.3 resolution: "date-fns@npm:2.29.3" @@ -23907,15 +21302,6 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^2.29.1": - version: 2.30.0 - resolution: "date-fns@npm:2.30.0" - dependencies: - "@babel/runtime": ^7.21.0 - checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4 - languageName: node - linkType: hard - "date-fns@npm:^3.6.0": version: 3.6.0 resolution: "date-fns@npm:3.6.0" @@ -23923,43 +21309,6 @@ __metadata: languageName: node linkType: hard -"datocms-listen@npm:^0.1.9": - version: 0.1.15 - resolution: "datocms-listen@npm:0.1.15" - dependencies: - "@0no-co/graphql.web": ^1.0.1 - checksum: 243fec6f8c07d35f8d8d206ded45c4b8cfeb22907bba23d2180af6284903e4af1146c89e08ad0f68977193d42530323c53d0d906f7cf9f1ba92490ed11386e8c - languageName: node - linkType: hard - -"datocms-structured-text-generic-html-renderer@npm:^2.0.1, datocms-structured-text-generic-html-renderer@npm:^2.1.12": - version: 2.1.12 - resolution: "datocms-structured-text-generic-html-renderer@npm:2.1.12" - dependencies: - datocms-structured-text-utils: ^2.1.12 - checksum: ef9e29b15903ce69be42faa4f4a4364bb7ba0c6565008cb2f557e8865c0806edb938a27f9bee7aa682f7af84fe89489b688b9713ea48501c139d204fea1f18c0 - languageName: node - linkType: hard - -"datocms-structured-text-to-plain-text@npm:^2.0.4": - version: 2.1.12 - resolution: "datocms-structured-text-to-plain-text@npm:2.1.12" - dependencies: - datocms-structured-text-generic-html-renderer: ^2.1.12 - datocms-structured-text-utils: ^2.1.12 - checksum: 8d436ca14379650d66257b5a2f36523e1ebaee41584caf021c863155404a292dbde7408c6cb0e0185638c2eb7508087239f862e78e8647b806ececd4e24683fd - languageName: node - linkType: hard - -"datocms-structured-text-utils@npm:^2.0.1, datocms-structured-text-utils@npm:^2.0.4, datocms-structured-text-utils@npm:^2.1.12": - version: 2.1.12 - resolution: "datocms-structured-text-utils@npm:2.1.12" - dependencies: - array-flatten: ^3.0.0 - checksum: 68d5be9cb711fb630866cca2c0e44b333b390d9672b2ea680d5870c26e8ccadcc6bd77d02a95ccbb913c160466a3046cbd934c41712f9d064f98a73009e0b97a - languageName: node - linkType: hard - "dayjs@npm:1.11.4": version: 1.11.4 resolution: "dayjs@npm:1.11.4" @@ -23997,13 +21346,6 @@ __metadata: languageName: node linkType: hard -"debounce@npm:^1.2.0, debounce@npm:^1.2.1": - version: 1.2.1 - resolution: "debounce@npm:1.2.1" - checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e - languageName: node - linkType: hard - "debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -24034,18 +21376,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.0.0": - version: 4.3.6 - resolution: "debug@npm:4.3.6" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 1630b748dea3c581295e02137a9f5cbe2c1d85fea35c1e6597a65ca2b16a6fce68cec61b299d480787ef310ba927dc8c92d3061faba0ad06c6a724672f66be7f - languageName: node - linkType: hard - "decamelize-keys@npm:^1.1.0": version: 1.1.0 resolution: "decamelize-keys@npm:1.1.0" @@ -24056,7 +21386,7 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^1.1.0, decamelize@npm:^1.1.1, decamelize@npm:^1.2.0": +"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa @@ -24077,15 +21407,6 @@ __metadata: languageName: node linkType: hard -"decode-named-character-reference@npm:^1.0.0": - version: 1.0.2 - resolution: "decode-named-character-reference@npm:1.0.2" - dependencies: - character-entities: ^2.0.0 - checksum: f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 - languageName: node - linkType: hard - "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -24213,7 +21534,7 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.0, defer-to-connect@npm:^2.0.1": +"defer-to-connect@npm:^2.0.1": version: 2.0.1 resolution: "defer-to-connect@npm:2.0.1" checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b @@ -24364,13 +21685,6 @@ __metadata: languageName: node linkType: hard -"dependency-graph@npm:^0.11.0": - version: 0.11.0 - resolution: "dependency-graph@npm:0.11.0" - checksum: 477204beaa9be69e642bc31ffe7a8c383d0cf48fa27acbc91c5df01431ab913e65c154213d2ef83d034c98d77280743ec85e5da018a97a18dd43d3c0b78b28cd - languageName: node - linkType: hard - "deprecation@npm:^2.0.0": version: 2.3.1 resolution: "deprecation@npm:2.3.1" @@ -24378,7 +21692,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.2, dequal@npm:^2.0.3": +"dequal@npm:^2.0.2, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -24473,15 +21787,6 @@ __metadata: languageName: node linkType: hard -"devlop@npm:^1.0.0, devlop@npm:^1.1.0": - version: 1.1.0 - resolution: "devlop@npm:1.1.0" - dependencies: - dequal: ^2.0.0 - checksum: d2ff650bac0bb6ef08c48f3ba98640bb5fec5cce81e9957eb620408d1bab1204d382a45b785c6b3314dc867bb0684936b84c6867820da6db97cbb5d3c15dd185 - languageName: node - linkType: hard - "dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -24520,13 +21825,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.0.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd - languageName: node - linkType: hard - "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -24736,15 +22034,6 @@ __metadata: languageName: node linkType: hard -"dot-case@npm:^2.1.0": - version: 2.1.1 - resolution: "dot-case@npm:2.1.1" - dependencies: - no-case: ^2.2.0 - checksum: 5c9d937245ff810a7ae788602e40c62e38cb515146ddf9b11c7f60cb02aae84859588761f1e8769d9e713609fae3c78dc99c8da9e0ee8e4d8b5c09a2fdf70328 - languageName: node - linkType: hard - "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -24829,13 +22118,6 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv@npm:10.0.0" - checksum: f412c5fe8c24fbe313d302d2500e247ba8a1946492db405a4de4d30dd0eb186a88a43f13c958c5a7de303938949c4231c56994f97d05c4bc1f22478d631b4005 - languageName: node - linkType: hard - "dotenv@npm:^16.0.0": version: 16.0.1 resolution: "dotenv@npm:16.0.1" @@ -24865,13 +22147,6 @@ __metadata: languageName: node linkType: hard -"dset@npm:^3.1.2": - version: 3.1.3 - resolution: "dset@npm:3.1.3" - checksum: 5db964a36c60c51aa3f7088bfe1dc5c0eedd9a6ef3b216935bb70ef4a7b8fc40fd2f9bb16b9a4692c9c9772cea60cfefb108d2d09fbd53c85ea8f6cd54502d6a - languageName: node - linkType: hard - "duplexer@npm:^0.1.1, duplexer@npm:^0.1.2, duplexer@npm:~0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -24975,13 +22250,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.13 - resolution: "electron-to-chromium@npm:1.5.13" - checksum: f18ac84dd3bf9a200654a6a9292b9ec4bced0cf9bd26cec9941b775f4470c581c9d043e70b37a124d9752dcc0f47fc96613d52b2defd8e59632852730cb418b9 - languageName: node - linkType: hard - "elliptic@npm:^6.5.3": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -25069,7 +22337,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:0.1.13, encoding@npm:^0.1.11, encoding@npm:^0.1.13": +"encoding@npm:0.1.13, encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -25147,16 +22415,6 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.4.1": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: ^4.1.1 - strip-ansi: ^6.0.1 - checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 - languageName: node - linkType: hard - "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -25231,7 +22489,7 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": +"error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" dependencies: @@ -25833,13 +23091,6 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.2": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e - languageName: node - linkType: hard - "escape-goat@npm:^4.0.0": version: 4.0.0 resolution: "escape-goat@npm:4.0.0" @@ -26538,13 +23789,6 @@ __metadata: languageName: node linkType: hard -"estree-util-is-identifier-name@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-is-identifier-name@npm:3.0.0" - checksum: ea3909f0188ea164af0aadeca87c087e3e5da78d76da5ae9c7954ff1340ea3e4679c4653bbf4299ffb70caa9b322218cc1128db2541f3d2976eb9704f9857787 - languageName: node - linkType: hard - "estree-walker@npm:^1.0.1": version: 1.0.1 resolution: "estree-walker@npm:1.0.1" @@ -26822,13 +24066,6 @@ __metadata: languageName: node linkType: hard -"extract-files@npm:^11.0.0": - version: 11.0.0 - resolution: "extract-files@npm:11.0.0" - checksum: 39ebd92772e9a1e30d1e3112fb7db85d353c8243640635668b615ac1d605ceb79fbb13d17829dd308993ef37bb189ad99817f79ab164ae95c9bb3df9f440bd16 - languageName: node - linkType: hard - "extract-zip@npm:^1.6.6": version: 1.7.0 resolution: "extract-zip@npm:1.7.0" @@ -26857,13 +24094,6 @@ __metadata: languageName: node linkType: hard -"fast-decode-uri-component@npm:^1.0.1": - version: 1.0.1 - resolution: "fast-decode-uri-component@npm:1.0.1" - checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -26982,15 +24212,6 @@ __metadata: languageName: node linkType: hard -"fast-querystring@npm:^1.1.1": - version: 1.1.2 - resolution: "fast-querystring@npm:1.1.2" - dependencies: - fast-decode-uri-component: ^1.0.1 - checksum: 7149f82ee9ac39a9c08c7ffe435b9f6deade76ae5e3675fe1835720513e8c4bc541e666b4b7b1c0c07e08f369dcf4828d00f2bee39889a90a168e1439cf27b0b - languageName: node - linkType: hard - "fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" @@ -27019,15 +24240,6 @@ __metadata: languageName: node linkType: hard -"fast-url-parser@npm:^1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: ^1.3.2 - checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c - languageName: node - linkType: hard - "fast-xml-parser@npm:4.2.5": version: 4.2.5 resolution: "fast-xml-parser@npm:4.2.5" @@ -27069,13 +24281,6 @@ __metadata: languageName: node linkType: hard -"fathom-client@npm:^3.5.0": - version: 3.7.2 - resolution: "fathom-client@npm:3.7.2" - checksum: 2f6859cc8e2995334b67b1e9efe3e1084e0b55cfd8832f4fd9badf37abf80d2213a5892313ec57a3dfccd7b7a62bb3949617dc8310dd7af2af0781e534398cbc - languageName: node - linkType: hard - "fault@npm:^1.0.0": version: 1.0.4 resolution: "fault@npm:1.0.4" @@ -27117,28 +24322,6 @@ __metadata: languageName: node linkType: hard -"fbjs-css-vars@npm:^1.0.0": - version: 1.0.2 - resolution: "fbjs-css-vars@npm:1.0.2" - checksum: 72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 - languageName: node - linkType: hard - -"fbjs@npm:^3.0.0": - version: 3.0.5 - resolution: "fbjs@npm:3.0.5" - dependencies: - cross-fetch: ^3.1.5 - fbjs-css-vars: ^1.0.0 - loose-envify: ^1.0.0 - object-assign: ^4.1.0 - promise: ^7.1.1 - setimmediate: ^1.0.5 - ua-parser-js: ^1.0.35 - checksum: e609b5b64686bc96495a5c67728ed9b2710b9b3d695c5759c5f5e47c9483d1c323543ac777a86459e3694efc5712c6ce7212e944feb19752867d699568bb0e54 - languageName: node - linkType: hard - "fd-slicer@npm:~1.1.0": version: 1.1.0 resolution: "fd-slicer@npm:1.1.0" @@ -27369,16 +24552,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^1.0.0": - version: 1.1.2 - resolution: "find-up@npm:1.1.2" - dependencies: - path-exists: ^2.0.0 - pinkie-promise: ^2.0.0 - checksum: a2cb9f4c9f06ee3a1e92ed71d5aed41ac8ae30aefa568132f6c556fac7678a5035126153b59eaec68da78ac409eef02503b2b059706bdbf232668d7245e3240a - languageName: node - linkType: hard - "find-up@npm:^2.1.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -27608,13 +24781,6 @@ __metadata: languageName: node linkType: hard -"form-data-encoder@npm:^1.7.1": - version: 1.9.0 - resolution: "form-data-encoder@npm:1.9.0" - checksum: a73f617976f91b594dbd777ec5147abdb0c52d707475130f8cefc8ae9102ccf51be154b929f7c18323729c2763ac25b16055f5034bc188834e9febeb0d971d7f - languageName: node - linkType: hard - "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -27694,16 +24860,6 @@ __metadata: languageName: node linkType: hard -"formdata-node@npm:^4.3.1": - version: 4.4.1 - resolution: "formdata-node@npm:4.4.1" - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - checksum: d91d4f667cfed74827fc281594102c0dabddd03c9f8b426fc97123eedbf73f5060ee43205d89284d6854e2fc5827e030cd352ef68b93beda8decc2d72128c576 - languageName: node - linkType: hard - "formdata-polyfill@npm:^4.0.10": version: 4.0.10 resolution: "formdata-polyfill@npm:4.0.10" @@ -27853,7 +25009,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^8.0.1, fs-extra@npm:^8.1.0": +"fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" dependencies: @@ -28110,13 +25266,6 @@ __metadata: languageName: node linkType: hard -"get-caller-file@npm:^1.0.1": - version: 1.0.3 - resolution: "get-caller-file@npm:1.0.3" - checksum: 2b90a7f848896abcebcdc0acc627a435bcf05b9cd280599bc980ebfcdc222416c3df12c24c4845f69adc4346728e8966f70b758f9369f3534182791dfbc25c05 - languageName: node - linkType: hard - "get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -28227,15 +25376,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - "get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -28371,13 +25511,6 @@ __metadata: languageName: node linkType: hard -"github-buttons@npm:^2.22.0": - version: 2.29.0 - resolution: "github-buttons@npm:2.29.0" - checksum: c43ece51179209cdac4ecc26b5652ef5774e65b28dbde433971677301c6ed9349c0ad1c38ec5034b8ca12a5bf2feeb2235475ba5b228fcb8a434321aa2659bfb - languageName: node - linkType: hard - "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -28475,7 +25608,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.2.3": +"glob@npm:^7.0.0, glob@npm:^7.2.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -28579,7 +25712,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.0.3, globby@npm:^11.1.0": +"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -28633,19 +25766,6 @@ __metadata: languageName: node linkType: hard -"globby@npm:^13.1.3": - version: 13.2.2 - resolution: "globby@npm:13.2.2" - dependencies: - dir-glob: ^3.0.1 - fast-glob: ^3.3.0 - ignore: ^5.2.4 - merge2: ^1.4.1 - slash: ^4.0.0 - checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e - languageName: node - linkType: hard - "globrex@npm:^0.1.2": version: 0.1.2 resolution: "globrex@npm:0.1.2" @@ -28770,25 +25890,6 @@ __metadata: languageName: node linkType: hard -"got@npm:^11.8.5": - version: 11.8.6 - resolution: "got@npm:11.8.6" - dependencies: - "@sindresorhus/is": ^4.0.0 - "@szmarczak/http-timer": ^4.0.5 - "@types/cacheable-request": ^6.0.1 - "@types/responselike": ^1.0.0 - cacheable-lookup: ^5.0.3 - cacheable-request: ^7.0.2 - decompress-response: ^6.0.0 - http2-wrapper: ^1.0.0-beta.5.2 - lowercase-keys: ^2.0.0 - p-cancelable: ^2.0.0 - responselike: ^2.0.0 - checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d - languageName: node - linkType: hard - "got@npm:^12.1.0": version: 12.6.1 resolution: "got@npm:12.6.1" @@ -28853,89 +25954,6 @@ __metadata: languageName: node linkType: hard -"graphql-codegen@npm:^0.4.0": - version: 0.4.0 - resolution: "graphql-codegen@npm:0.4.0" - dependencies: - babel-runtime: ^6.11.6 - change-case: ^3.0.0 - graphql: ^0.7.0 - inflected: ^1.1.7 - mkdirp: ^0.5.1 - node-fetch: ^1.5.3 - yargs: ^5.0.0 - bin: - graphql-codegen: ./lib/cli.js - checksum: 584ad3382de9ee3927cfd4fcc340abb2f8d4bbdacacebe9e56e34edf255c87eb1e191f2d7c4f3d1d5bb0ebd829b852e50efe91e967683a8b181dcd3b26ae6b6c - languageName: node - linkType: hard - -"graphql-config@npm:^5.0.2": - version: 5.1.2 - resolution: "graphql-config@npm:5.1.2" - dependencies: - "@graphql-tools/graphql-file-loader": ^8.0.0 - "@graphql-tools/json-file-loader": ^8.0.0 - "@graphql-tools/load": ^8.0.0 - "@graphql-tools/merge": ^9.0.0 - "@graphql-tools/url-loader": ^8.0.0 - "@graphql-tools/utils": ^10.0.0 - cosmiconfig: ^9.0.0 - jiti: ^1.18.2 - minimatch: ^9.0.5 - string-env-interpolation: ^1.0.1 - tslib: ^2.4.0 - peerDependencies: - cosmiconfig-toml-loader: ^1.0.0 - graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - peerDependenciesMeta: - cosmiconfig-toml-loader: - optional: true - checksum: 48e17fff9e31a5037a42e9edb79251fe91e49338125ac3141ec80886832e0669112f547b2b67db9412d31fcc4cdac4548180f45550dc2ed2bc94c54bcb01053a - languageName: node - linkType: hard - -"graphql-request@npm:^6.0.0, graphql-request@npm:^6.1.0": - version: 6.1.0 - resolution: "graphql-request@npm:6.1.0" - dependencies: - "@graphql-typed-document-node/core": ^3.2.0 - cross-fetch: ^3.1.5 - peerDependencies: - graphql: 14 - 16 - checksum: 6d62630a0169574442320651c1f7626c0c602025c3c46b19e09417c9579bb209306ee63de9793a03be2e1701bb7f13971f8545d99bc6573e340f823af0ad35b2 - languageName: node - linkType: hard - -"graphql-tag@npm:^2.11.0": - version: 2.12.6 - resolution: "graphql-tag@npm:2.12.6" - dependencies: - tslib: ^2.1.0 - peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: b15162a3d62f17b9b79302445b9ee330e041582f1c7faca74b9dec5daa74272c906ec1c34e1c50592bb6215e5c3eba80a309103f6ba9e4c1cddc350c46f010df - languageName: node - linkType: hard - -"graphql-ws@npm:^5.14.0": - version: 5.16.0 - resolution: "graphql-ws@npm:5.16.0" - peerDependencies: - graphql: ">=0.11 <=16" - checksum: e3e077ec187a92be3fd5dfae49e23af11a82711d3537064384f6861c2b5ceb339f60dc1871d0026b47ff05e4ed3c941404812a8086347e454688e0e6ef0e69f3 - languageName: node - linkType: hard - -"graphql@npm:^0.7.0": - version: 0.7.2 - resolution: "graphql@npm:0.7.2" - dependencies: - iterall: 1.0.2 - checksum: 9b815b851d4fbc861609ce37e88e0be881d25fa2d5dc54f661379e600d103d4f051cee15a09799c4efa2d3590a61f64fc2e1d67332c7fdf8df2871c27b1c3f40 - languageName: node - linkType: hard - "graphql@npm:^16.3.0": version: 16.5.0 resolution: "graphql@npm:16.5.0" @@ -28943,13 +25961,6 @@ __metadata: languageName: node linkType: hard -"graphql@npm:^16.8.0": - version: 16.9.0 - resolution: "graphql@npm:16.9.0" - checksum: 8cb3d54100e9227310383ce7f791ca48d12f15ed9f2021f23f8735f1121aafe4e5e611a853081dd935ce221724ea1ae4638faef5d2921fb1ad7c26b5f46611e9 - languageName: node - linkType: hard - "gray-matter@npm:^4.0.3": version: 4.0.3 resolution: "gray-matter@npm:4.0.3" @@ -28962,13 +25973,6 @@ __metadata: languageName: node linkType: hard -"gsap@npm:^3.11.0": - version: 3.12.5 - resolution: "gsap@npm:3.12.5" - checksum: 60b99dc4482992ba86013963ee9a97a5ec62d480495dd85764788913245aa08cfd202c1df4bbc7592e43d5faa885127bec75f77266f2964fe3d3b559ab63f852 - languageName: node - linkType: hard - "gtoken@npm:^5.0.4": version: 5.3.2 resolution: "gtoken@npm:5.3.2" @@ -29239,21 +26243,6 @@ __metadata: languageName: node linkType: hard -"hast-util-from-parse5@npm:^7.0.0": - version: 7.1.2 - resolution: "hast-util-from-parse5@npm:7.1.2" - dependencies: - "@types/hast": ^2.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 - checksum: 7b4ed5b508b1352127c6719f7b0c0880190cf9859fe54ccaf7c9228ecf623d36cef3097910b3874d2fe1aac6bf4cf45d3cc2303daac3135a05e9ade6534ddddb - languageName: node - linkType: hard - "hast-util-parse-selector@npm:^2.0.0": version: 2.2.5 resolution: "hast-util-parse-selector@npm:2.2.5" @@ -29261,115 +26250,6 @@ __metadata: languageName: node linkType: hard -"hast-util-parse-selector@npm:^3.0.0": - version: 3.1.1 - resolution: "hast-util-parse-selector@npm:3.1.1" - dependencies: - "@types/hast": ^2.0.0 - checksum: 511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 - languageName: node - linkType: hard - -"hast-util-raw@npm:^7.0.0": - version: 7.2.3 - resolution: "hast-util-raw@npm:7.2.3" - 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 - checksum: 21857eea3ffb8fd92d2d9be7793b56d0b2c40db03c4cfa14828855ae41d7c584917aa83efb7157220b2e41e25e95f81f24679ac342c35145e5f1c1d39015f81f - languageName: node - linkType: hard - -"hast-util-sanitize@npm:^4.0.0": - version: 4.1.0 - resolution: "hast-util-sanitize@npm:4.1.0" - dependencies: - "@types/hast": ^2.0.0 - checksum: 4f1786d6556bae6485a657a3e77e7e71b573fd20e4e2d70678e0f445eb8fe3dc6c4441cda6d18b89a79b53e2c03b6232eb6c470ecd478737050724ea09398603 - languageName: node - linkType: hard - -"hast-util-to-html@npm:^8.0.0": - version: 8.0.4 - resolution: "hast-util-to-html@npm:8.0.4" - 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 - checksum: 8f2ae071df2ced5afb4f19f76af8fd3a2f837dc47bcc1c0e0c1578d29dafcd28738f9617505d13c4a2adf13d70e043143e2ad8f130d5554ab4fc11bfa8f74094 - languageName: node - linkType: hard - -"hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.0 - resolution: "hast-util-to-jsx-runtime@npm:2.3.0" - dependencies: - "@types/estree": ^1.0.0 - "@types/hast": ^3.0.0 - "@types/unist": ^3.0.0 - comma-separated-tokens: ^2.0.0 - devlop: ^1.0.0 - estree-util-is-identifier-name: ^3.0.0 - hast-util-whitespace: ^3.0.0 - mdast-util-mdx-expression: ^2.0.0 - mdast-util-mdx-jsx: ^3.0.0 - mdast-util-mdxjs-esm: ^2.0.0 - property-information: ^6.0.0 - space-separated-tokens: ^2.0.0 - style-to-object: ^1.0.0 - unist-util-position: ^5.0.0 - vfile-message: ^4.0.0 - checksum: 599a97c6ec61c1430776813d7fb42e6f96032bf4a04dfcbb8eceef3bc8d1845ecf242387a4426b9d3f52320dbbfa26450643b81124b3d6a0b9bbb0fff4d0ba83 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^7.0.0": - version: 7.1.0 - resolution: "hast-util-to-parse5@npm:7.1.0" - dependencies: - "@types/hast": ^2.0.0 - comma-separated-tokens: ^2.0.0 - property-information: ^6.0.0 - space-separated-tokens: ^2.0.0 - web-namespaces: ^2.0.0 - zwitch: ^2.0.0 - checksum: 3a7f2175a3db599bbae7e49ba73d3e5e688e5efca7590ff50130ba108ad649f728402815d47db49146f6b94c14c934bf119915da9f6964e38802c122bcc8af6b - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^2.0.0": - version: 2.0.1 - resolution: "hast-util-whitespace@npm:2.0.1" - checksum: 431be6b2f35472f951615540d7a53f69f39461e5e080c0190268bdeb2be9ab9b1dddfd1f467dd26c1de7e7952df67beb1307b6ee940baf78b24a71b5e0663868 - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-whitespace@npm:3.0.0" - dependencies: - "@types/hast": ^3.0.0 - checksum: 41d93ccce218ba935dc3c12acdf586193c35069489c8c8f50c2aa824c00dec94a3c78b03d1db40fa75381942a189161922e4b7bca700b3a2cc779634c351a1e4 - languageName: node - linkType: hard - "hastscript@npm:^6.0.0": version: 6.0.0 resolution: "hastscript@npm:6.0.0" @@ -29383,19 +26263,6 @@ __metadata: languageName: node linkType: hard -"hastscript@npm:^7.0.0": - version: 7.2.0 - resolution: "hastscript@npm:7.2.0" - 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 - checksum: 928a21576ff7b9a8c945e7940bcbf2d27f770edb4279d4d04b33dc90753e26ca35c1172d626f54afebd377b2afa32331e399feb3eb0f7b91a399dca5927078ae - languageName: node - linkType: hard - "he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -29405,26 +26272,6 @@ __metadata: languageName: node linkType: hard -"header-case@npm:^1.0.0": - version: 1.0.1 - resolution: "header-case@npm:1.0.1" - dependencies: - no-case: ^2.2.0 - upper-case: ^1.1.3 - checksum: fe1cc9a555ec9aabc2de80f4dd961a81c534fc23951694fef34297e59b0dd60f26647148731bf0dd3fdb3a1c688089d3cd147d7038db850e25be7c0a5fabb022 - languageName: node - linkType: hard - -"header-case@npm:^2.0.4": - version: 2.0.4 - resolution: "header-case@npm:2.0.4" - dependencies: - capital-case: ^1.0.4 - tslib: ^2.0.3 - checksum: 571c83eeb25e8130d172218712f807c0b96d62b020981400bccc1503a7cf14b09b8b10498a962d2739eccf231d950e3848ba7d420b58a6acd2f9283439546cd9 - languageName: node - linkType: hard - "headers-polyfill@npm:^3.0.4": version: 3.0.7 resolution: "headers-polyfill@npm:3.0.7" @@ -29562,20 +26409,6 @@ __metadata: languageName: node linkType: hard -"html-url-attributes@npm:^3.0.0": - version: 3.0.0 - resolution: "html-url-attributes@npm:3.0.0" - checksum: 9f499d33e6ddff6c2d2766fd73d2f22f3c370b4e485a92b0b2938303665b306dc7f36b2724c9466764e8f702351c01f342f5ec933be41a31c1fa40b72087b91d - languageName: node - linkType: hard - -"html-void-elements@npm:^2.0.0": - version: 2.0.1 - resolution: "html-void-elements@npm:2.0.1" - checksum: 06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 - languageName: node - linkType: hard - "html-webpack-plugin@npm:^5.5.0": version: 5.5.4 resolution: "html-webpack-plugin@npm:5.5.4" @@ -29615,7 +26448,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -29751,16 +26584,6 @@ __metadata: languageName: node linkType: hard -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: ^5.1.1 - resolve-alpn: ^1.0.0 - checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e - languageName: node - linkType: hard - "http2-wrapper@npm:^2.1.10": version: 2.2.1 resolution: "http2-wrapper@npm:2.2.1" @@ -30028,28 +26851,6 @@ __metadata: languageName: node linkType: hard -"iframe-resizer-react@npm:^1.1.0": - version: 1.1.1 - resolution: "iframe-resizer-react@npm:1.1.1" - dependencies: - "@babel/plugin-proposal-private-property-in-object": ^7.21.11 - iframe-resizer: ^4.4.4 - warning: ^4.0.3 - peerDependencies: - prop-types: ^15.7.2 - react: ^16.13.1 || ^18.0.0 - react-dom: ^16.13.1 || ^18.0.0 - checksum: fd3db2dfd3e1455e2f8150ed0cc4068b8970389eca478d13e2ca6408e1fe0a85425f7b2cb004e5a8eee0e7d4ed304774cad4b1b40d9a7467c2db3ed4851c4572 - languageName: node - linkType: hard - -"iframe-resizer@npm:^4.4.4": - version: 4.4.5 - resolution: "iframe-resizer@npm:4.4.5" - checksum: fa2493daba2df7578866aeb5fceabcf2129da9327abd7d26b4f16e9e7109eddcb97a8ba7ea6e94b043705f13bcbe6ae307e67cc48c24f7bd9d948d491a150163 - languageName: node - linkType: hard - "ignore-walk@npm:^5.0.1": version: 5.0.1 resolution: "ignore-walk@npm:5.0.1" @@ -30093,13 +26894,6 @@ __metadata: languageName: node linkType: hard -"immer@npm:^10.0.3": - version: 10.1.1 - resolution: "immer@npm:10.1.1" - checksum: 07c67970b7d22aded73607193d84861bf786f07d47f7d7c98bb10016c7a88f6654ad78ae1e220b3c623695b133aabbf24f5eb8d9e8060cff11e89ccd81c9c10b - languageName: node - linkType: hard - "immutable@npm:^3.8.2, immutable@npm:^3.x.x": version: 3.8.2 resolution: "immutable@npm:3.8.2" @@ -30107,13 +26901,6 @@ __metadata: languageName: node linkType: hard -"immutable@npm:~3.7.6": - version: 3.7.6 - resolution: "immutable@npm:3.7.6" - checksum: 8cccfb22d3ecf14fe0c474612e96d6bb5d117493e7639fe6642fb81e78c9ac4b698dd8a322c105001a709ad873ffc90e30bad7db5d9a3ef0b54a6e1db0258e8e - languageName: node - linkType: hard - "import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -30124,13 +26911,6 @@ __metadata: languageName: node linkType: hard -"import-from@npm:4.0.0": - version: 4.0.0 - resolution: "import-from@npm:4.0.0" - checksum: 1fa29c05b048da18914e91d9a529e5d9b91774bebbfab10e53f59bcc1667917672b971cf102fee857f142e5e433ce69fa1f0a596e1c7d82f9947a5ec352694b9 - languageName: node - linkType: hard - "import-in-the-middle@npm:1.4.2": version: 1.4.2 resolution: "import-in-the-middle@npm:1.4.2" @@ -30214,13 +26994,6 @@ __metadata: languageName: node linkType: hard -"inflected@npm:^1.1.7": - version: 1.1.7 - resolution: "inflected@npm:1.1.7" - checksum: eac857f10871586006d629dc72bab05058f1967c10fae9d7391d627534566a8e5be0a1f690d2590102d890e4ef5647b73b7827380dc7bcf50faac4154f0ab084 - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -30316,13 +27089,6 @@ __metadata: languageName: node linkType: hard -"inline-style-parser@npm:0.2.3": - version: 0.2.3 - resolution: "inline-style-parser@npm:0.2.3" - checksum: ed6454de80759e7faef511f51b5716b33c40a6b05b8a8f5383dc01e8a087c6fd5df877446d05e8e3961ae0751e028e25e180f5cffc192a5ce7822edef6810ade - languageName: node - linkType: hard - "inline-style-prefixer@npm:^7.0.0": version: 7.0.0 resolution: "inline-style-prefixer@npm:7.0.0" @@ -30364,7 +27130,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.6, inquirer@npm:^8.0.0": +"inquirer@npm:8.2.6": version: 8.2.6 resolution: "inquirer@npm:8.2.6" dependencies: @@ -30524,13 +27290,6 @@ __metadata: languageName: node linkType: hard -"invert-kv@npm:^1.0.0": - version: 1.0.0 - resolution: "invert-kv@npm:1.0.0" - checksum: aebeee31dda3b3d25ffd242e9a050926e7fe5df642d60953ab183aca1a7d1ffb39922eb2618affb0e850cf2923116f0da1345367759d88d097df5da1f1e1590e - languageName: node - linkType: hard - "ioredis@npm:^5.3.2": version: 5.3.2 resolution: "ioredis@npm:5.3.2" @@ -30579,16 +27338,6 @@ __metadata: languageName: node linkType: hard -"is-absolute@npm:^1.0.0": - version: 1.0.0 - resolution: "is-absolute@npm:1.0.0" - dependencies: - is-relative: ^1.0.0 - is-windows: ^1.0.1 - checksum: 9d16b2605eda3f3ce755410f1d423e327ad3a898bcb86c9354cf63970ed3f91ba85e9828aa56f5d6a952b9fae43d0477770f78d37409ae8ecc31e59ebc279b27 - languageName: node - linkType: hard - "is-alphabetical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphabetical@npm:1.0.4" @@ -30596,13 +27345,6 @@ __metadata: languageName: node linkType: hard -"is-alphabetical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphabetical@npm:2.0.1" - checksum: 56207db8d9de0850f0cd30f4966bf731eb82cedfe496cbc2e97e7c3bacaf66fc54a972d2d08c0d93bb679cb84976a05d24c5ad63de56fabbfc60aadae312edaa - languageName: node - linkType: hard - "is-alphanumerical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphanumerical@npm:1.0.4" @@ -30613,16 +27355,6 @@ __metadata: languageName: node linkType: hard -"is-alphanumerical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphanumerical@npm:2.0.1" - dependencies: - is-alphabetical: ^2.0.0 - is-decimal: ^2.0.0 - checksum: 87acc068008d4c9c4e9f5bd5e251041d42e7a50995c77b1499cf6ed248f971aadeddb11f239cabf09f7975ee58cac7a48ffc170b7890076d8d227b24a68663c9 - languageName: node - linkType: hard - "is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -30705,13 +27437,6 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^2.0.0": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 - languageName: node - linkType: hard - "is-buffer@npm:~1.1.6": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" @@ -30834,13 +27559,6 @@ __metadata: languageName: node linkType: hard -"is-decimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-decimal@npm:2.0.1" - checksum: 97132de7acdce77caa7b797632970a2ecd649a88e715db0e4dbc00ab0708b5e7574ba5903962c860cd4894a14fd12b100c0c4ac8aed445cf6f55c6cf747a4158 - languageName: node - linkType: hard - "is-deflate@npm:^1.0.0": version: 1.0.0 resolution: "is-deflate@npm:1.0.0" @@ -30899,15 +27617,6 @@ __metadata: languageName: node linkType: hard -"is-fullwidth-code-point@npm:^1.0.0": - version: 1.0.0 - resolution: "is-fullwidth-code-point@npm:1.0.0" - dependencies: - number-is-nan: ^1.0.0 - checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -30945,7 +27654,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:4.0.3, is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -30968,13 +27677,6 @@ __metadata: languageName: node linkType: hard -"is-hexadecimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-hexadecimal@npm:2.0.1" - checksum: 66a2ea85994c622858f063f23eda506db29d92b52580709eb6f4c19550552d4dcf3fb81952e52f7cf972097237959e00adc7bb8c9400cd12886e15bf06145321 - languageName: node - linkType: hard - "is-in-ci@npm:^0.1.0": version: 0.1.0 resolution: "is-in-ci@npm:0.1.0" @@ -31035,15 +27737,6 @@ __metadata: languageName: node linkType: hard -"is-lower-case@npm:^2.0.2": - version: 2.0.2 - resolution: "is-lower-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: ba57dd1201e15fd9b590654736afccf1b3b68e919f40c23ef13b00ebcc639b1d9c2f81fe86415bff3e8eccffec459786c9ac9dc8f3a19cfa4484206c411c1d7d - languageName: node - linkType: hard - "is-map@npm:^2.0.2": version: 2.0.2 resolution: "is-map@npm:2.0.2" @@ -31175,7 +27868,7 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": +"is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce @@ -31238,15 +27931,6 @@ __metadata: languageName: node linkType: hard -"is-relative@npm:^1.0.0": - version: 1.0.0 - resolution: "is-relative@npm:1.0.0" - dependencies: - is-unc-path: ^1.0.0 - checksum: 3271a0df109302ef5e14a29dcd5d23d9788e15ade91a40b942b035827ffbb59f7ce9ff82d036ea798541a52913cbf9d2d0b66456340887b51f3542d57b5a4c05 - languageName: node - linkType: hard - "is-retry-allowed@npm:^1.1.0": version: 1.2.0 resolution: "is-retry-allowed@npm:1.2.0" @@ -31302,13 +27986,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^1.0.1": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -31382,15 +28059,6 @@ __metadata: languageName: node linkType: hard -"is-unc-path@npm:^1.0.0": - version: 1.0.0 - resolution: "is-unc-path@npm:1.0.0" - dependencies: - unc-path-regex: ^0.1.2 - checksum: e8abfde203f7409f5b03a5f1f8636e3a41e78b983702ef49d9343eb608cdfe691429398e8815157519b987b739bcfbc73ae7cf4c8582b0ab66add5171088eab6 - languageName: node - linkType: hard - "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -31421,22 +28089,6 @@ __metadata: languageName: node linkType: hard -"is-upper-case@npm:^2.0.2": - version: 2.0.2 - resolution: "is-upper-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: cf4fd43c00c2e72cd5cff911923070b89f0933b464941bd782e2315385f80b5a5acd772db3b796542e5e3cfed735f4dffd88c54d62db1ebfc5c3daa7b1af2bc6 - languageName: node - linkType: hard - -"is-utf8@npm:^0.2.0": - version: 0.2.1 - resolution: "is-utf8@npm:0.2.1" - checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 - languageName: node - linkType: hard - "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -31477,7 +28129,7 @@ __metadata: languageName: node linkType: hard -"is-windows@npm:1.0.2, is-windows@npm:^1.0.0, is-windows@npm:^1.0.1": +"is-windows@npm:1.0.2, is-windows@npm:^1.0.0": version: 1.0.2 resolution: "is-windows@npm:1.0.2" checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 @@ -31565,15 +28217,6 @@ __metadata: languageName: node linkType: hard -"isomorphic-ws@npm:^5.0.0": - version: 5.0.0 - resolution: "isomorphic-ws@npm:5.0.0" - peerDependencies: - ws: "*" - checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 - languageName: node - linkType: hard - "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -31669,13 +28312,6 @@ __metadata: languageName: node linkType: hard -"iterall@npm:1.0.2": - version: 1.0.2 - resolution: "iterall@npm:1.0.2" - checksum: f87cbb8e22e3681f4d7ba634e4ce7bd419a78b47ff7b01f57f90cf761d187cb845fcac0d4d7e4c7dfcbfb80467c8ea42a9f3691bb3aa909e3e3707a25735ed70 - languageName: node - linkType: hard - "iterare@npm:1.2.1": version: 1.2.1 resolution: "iterare@npm:1.2.1" @@ -32301,15 +28937,6 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.17.1": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" - bin: - jiti: bin/jiti.js - checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 - languageName: node - linkType: hard - "jiti@npm:^1.18.2": version: 1.20.0 resolution: "jiti@npm:1.20.0" @@ -32335,19 +28962,6 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.11.0": - version: 17.13.3 - resolution: "joi@npm:17.13.3" - dependencies: - "@hapi/hoek": ^9.3.0 - "@hapi/topo": ^5.1.0 - "@sideway/address": ^4.1.5 - "@sideway/formula": ^3.0.1 - "@sideway/pinpoint": ^2.0.0 - checksum: 66ed454fee3d8e8da1ce21657fd2c7d565d98f3e539d2c5c028767e5f38cbd6297ce54df8312d1d094e62eb38f9452ebb43da4ce87321df66cf5e3f128cbc400 - languageName: node - linkType: hard - "jose@npm:5.2.1": version: 5.2.1 resolution: "jose@npm:5.2.1" @@ -32376,13 +28990,6 @@ __metadata: languageName: node linkType: hard -"jose@npm:^5.0.0": - version: 5.8.0 - resolution: "jose@npm:5.8.0" - checksum: bb9cd97ac6ccb8148a8e23d6a7f61e5756a3373a7d65dd783051d8af409c3534bdc2a2c30ecd1820988ea943aba5755b2a45b86955c5765d71691bb0ddd45d61 - languageName: node - linkType: hard - "jpeg-js@npm:0.4.2": version: 0.4.2 resolution: "jpeg-js@npm:0.4.2" @@ -32439,7 +29046,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -32685,16 +29292,6 @@ __metadata: languageName: node linkType: hard -"json-to-pretty-yaml@npm:^1.2.2": - version: 1.2.2 - resolution: "json-to-pretty-yaml@npm:1.2.2" - dependencies: - remedial: ^1.0.7 - remove-trailing-spaces: ^1.0.6 - checksum: 4b78480f426e176e5fdac073e05877683bb026f1175deb52d0941b992f9c91a58a812c020f00aa67ba1fc7cadb220539a264146f222e48a48c8bb2a0931cac9b - languageName: node - linkType: hard - "json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -32750,19 +29347,6 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^5.0.0": - version: 5.0.0 - resolution: "jsonfile@npm:5.0.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^0.1.2 - dependenciesMeta: - graceful-fs: - optional: true - checksum: e0ecff572dba34153a66e3a3bc5c6cb01a2c1d2cf4a2c19b6728dcfcab39d94be9cca4a0fc86a17ff2c815f2aeb43768ac75545780dbea4009433fdc32aa14d1 - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -32936,13 +29520,6 @@ __metadata: languageName: node linkType: hard -"keen-slider@npm:^6.8.0": - version: 6.8.6 - resolution: "keen-slider@npm:6.8.6" - checksum: f87e65d72e3b2e73cbd52b1908c1458b253ec5a2a2d3e1e34bd1a831172d18568649188cf3e4ad679c7988568929195ae91d4b7a1c0bd3d6da592a453be3723a - languageName: node - linkType: hard - "keypress@npm:~0.2.1": version: 0.2.1 resolution: "keypress@npm:0.2.1" @@ -32950,7 +29527,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.0.0, keyv@npm:^4.5.3": +"keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -32966,7 +29543,7 @@ __metadata: languageName: node linkType: hard -"kleur@npm:4.1.5, kleur@npm:^4.0.3, kleur@npm:^4.1.5": +"kleur@npm:4.1.5, kleur@npm:^4.1.5": version: 4.1.5 resolution: "kleur@npm:4.1.5" checksum: 1dc476e32741acf0b1b5b0627ffd0d722e342c1b0da14de3e8ae97821327ca08f9fb944542fb3c126d90ac5f27f9d804edbe7c585bf7d12ef495d115e0f22c12 @@ -33069,15 +29646,6 @@ __metadata: languageName: node linkType: hard -"lcid@npm:^1.0.0": - version: 1.0.0 - resolution: "lcid@npm:1.0.0" - dependencies: - invert-kv: ^1.0.0 - checksum: e8c7a4db07663068c5c44b650938a2bc41aa992037eebb69376214320f202c1250e70b50c32f939e28345fd30c2d35b8e8cd9a19d5932c398246a864ce54843d - languageName: node - linkType: hard - "level-blobs@npm:^0.1.7": version: 0.1.7 resolution: "level-blobs@npm:0.1.7" @@ -33380,19 +29948,6 @@ __metadata: languageName: node linkType: hard -"load-json-file@npm:^1.0.0": - version: 1.1.0 - resolution: "load-json-file@npm:1.1.0" - dependencies: - graceful-fs: ^4.1.2 - parse-json: ^2.2.0 - pify: ^2.0.0 - pinkie-promise: ^2.0.0 - strip-bom: ^2.0.0 - checksum: 0e4e4f380d897e13aa236246a917527ea5a14e4fc34d49e01ce4e7e2a1e08e2740ee463a03fb021c04f594f29a178f4adb994087549d7c1c5315fcd29bf9934b - languageName: node - linkType: hard - "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -33527,13 +30082,6 @@ __metadata: languageName: node linkType: hard -"lodash.assign@npm:^4.1.0, lodash.assign@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.assign@npm:4.2.0" - checksum: 75bbc6733c9f577c448031b4051f990f068802708891f94be9d4c2faffd6a9ec67a2c49671dafc908a068d35687765464853282842b4560b662e6c903d11cc90 - languageName: node - linkType: hard - "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -33695,13 +30243,6 @@ __metadata: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - "lodash.startcase@npm:^4.4.0": version: 4.4.0 resolution: "lodash.startcase@npm:4.4.0" @@ -33737,14 +30278,14 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0, lodash@npm:~4.17.15": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 languageName: node linkType: hard -"log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -33811,13 +30352,6 @@ __metadata: languageName: node linkType: hard -"longest-streak@npm:^3.0.0": - version: 3.1.0 - resolution: "longest-streak@npm:3.1.0" - checksum: d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 - languageName: node - linkType: hard - "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -33866,15 +30400,6 @@ __metadata: languageName: node linkType: hard -"lower-case-first@npm:^2.0.2": - version: 2.0.2 - resolution: "lower-case-first@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 33e3da1098ddda219ce125d4ab7a78a944972c0ee8872e95b6ccc35df8ad405284ab233b0ba4d72315ad1a06fe2f0d418ee4cba9ec1ef1c386dea78899fc8958 - languageName: node - linkType: hard - "lower-case@npm:^1.1.0, lower-case@npm:^1.1.1, lower-case@npm:^1.1.2": version: 1.1.4 resolution: "lower-case@npm:1.1.4" @@ -33891,13 +30416,6 @@ __metadata: languageName: node linkType: hard -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 - languageName: node - linkType: hard - "lowercase-keys@npm:^3.0.0": version: 3.0.0 resolution: "lowercase-keys@npm:3.0.0" @@ -34005,15 +30523,6 @@ __metadata: languageName: node linkType: hard -"lucide-react@npm:^0.171.0": - version: 0.171.0 - resolution: "lucide-react@npm:0.171.0" - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - checksum: 768ffe368c52a518ee339203d86ff4479989ab4d79c0716f721900c4bb7392ef6ff7a14807f6a685abd74d27f4c1778170bff77a0ab4c3e06c17944b557d8300 - languageName: node - linkType: hard - "lucide-static@npm:^0.424.0": version: 0.424.0 resolution: "lucide-static@npm:0.424.0" @@ -34215,13 +30724,6 @@ __metadata: languageName: node linkType: hard -"map-cache@npm:^0.2.0": - version: 0.2.2 - resolution: "map-cache@npm:0.2.2" - checksum: 3067cea54285c43848bb4539f978a15dedc63c03022abeec6ef05c8cb6829f920f13b94bcaf04142fc6a088318e564c4785704072910d120d55dbc2e0c421969 - languageName: node - linkType: hard - "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -34327,191 +30829,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-definitions@npm:^5.0.0": - version: 5.1.2 - resolution: "mdast-util-definitions@npm:5.1.2" - dependencies: - "@types/mdast": ^3.0.0 - "@types/unist": ^2.0.0 - unist-util-visit: ^4.0.0 - checksum: 2544daccab744ea1ede76045c2577ae4f1cc1b9eb1ea51ab273fe1dca8db5a8d6f50f87759c0ce6484975914b144b7f40316f805cb9c86223a78db8de0b77bae - languageName: node - linkType: hard - -"mdast-util-from-markdown@npm:^1.0.0": - version: 1.3.1 - resolution: "mdast-util-from-markdown@npm:1.3.1" - dependencies: - "@types/mdast": ^3.0.0 - "@types/unist": ^2.0.0 - decode-named-character-reference: ^1.0.0 - mdast-util-to-string: ^3.1.0 - micromark: ^3.0.0 - micromark-util-decode-numeric-character-reference: ^1.0.0 - micromark-util-decode-string: ^1.0.0 - micromark-util-normalize-identifier: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - unist-util-stringify-position: ^3.0.0 - uvu: ^0.5.0 - checksum: c2fac225167e248d394332a4ea39596e04cbde07d8cdb3889e91e48972c4c3462a02b39fda3855345d90231eb17a90ac6e082fb4f012a77c1d0ddfb9c7446940 - languageName: node - linkType: hard - -"mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-from-markdown@npm:2.0.1" - dependencies: - "@types/mdast": ^4.0.0 - "@types/unist": ^3.0.0 - decode-named-character-reference: ^1.0.0 - devlop: ^1.0.0 - mdast-util-to-string: ^4.0.0 - micromark: ^4.0.0 - micromark-util-decode-numeric-character-reference: ^2.0.0 - micromark-util-decode-string: ^2.0.0 - micromark-util-normalize-identifier: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - unist-util-stringify-position: ^4.0.0 - checksum: 2e50be71272a1503558c599cd5766cf2743935a021f82e32bc2ae5da44f6c7dcabb9da3a6eee76ede0ec8ad2b122d1192f4fe89890aac90c76463f049f8a835d - languageName: node - linkType: hard - -"mdast-util-mdx-expression@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-mdx-expression@npm:2.0.0" - dependencies: - "@types/estree-jsx": ^1.0.0 - "@types/hast": ^3.0.0 - "@types/mdast": ^4.0.0 - devlop: ^1.0.0 - mdast-util-from-markdown: ^2.0.0 - mdast-util-to-markdown: ^2.0.0 - checksum: 4e1183000e183e07a7264e192889b4fd57372806103031c71b9318967f85fd50a5dd0f92ef14f42c331e77410808f5de3341d7bc8ad4ee91b7fa8f0a30043a8a - languageName: node - linkType: hard - -"mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.1.3 - resolution: "mdast-util-mdx-jsx@npm:3.1.3" - dependencies: - "@types/estree-jsx": ^1.0.0 - "@types/hast": ^3.0.0 - "@types/mdast": ^4.0.0 - "@types/unist": ^3.0.0 - ccount: ^2.0.0 - devlop: ^1.1.0 - mdast-util-from-markdown: ^2.0.0 - mdast-util-to-markdown: ^2.0.0 - parse-entities: ^4.0.0 - stringify-entities: ^4.0.0 - unist-util-stringify-position: ^4.0.0 - vfile-message: ^4.0.0 - checksum: 638644420090163fc08d01150e10550a21e914b85dd3a37178d3b949173c5aee2d7fee536f864ac25800e0cebde8357a5808427ffb7e9975a669e4382ae479ab - languageName: node - linkType: hard - -"mdast-util-mdxjs-esm@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdxjs-esm@npm:2.0.1" - dependencies: - "@types/estree-jsx": ^1.0.0 - "@types/hast": ^3.0.0 - "@types/mdast": ^4.0.0 - devlop: ^1.0.0 - mdast-util-from-markdown: ^2.0.0 - mdast-util-to-markdown: ^2.0.0 - checksum: 1f9dad04d31d59005332e9157ea9510dc1d03092aadbc607a10475c7eec1c158b475aa0601a3a4f74e13097ca735deb8c2d9d37928ddef25d3029fd7c9e14dc3 - languageName: node - linkType: hard - -"mdast-util-phrasing@npm:^3.0.0": - version: 3.0.1 - resolution: "mdast-util-phrasing@npm:3.0.1" - dependencies: - "@types/mdast": ^3.0.0 - unist-util-is: ^5.0.0 - checksum: c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 - languageName: node - linkType: hard - -"mdast-util-phrasing@npm:^4.0.0": - version: 4.1.0 - resolution: "mdast-util-phrasing@npm:4.1.0" - dependencies: - "@types/mdast": ^4.0.0 - unist-util-is: ^6.0.0 - checksum: 3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:^11.0.0": - version: 11.3.0 - resolution: "mdast-util-to-hast@npm:11.3.0" - 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 - checksum: a968d034613aa5cfb44b9c03d8e61a08bb563bfde3a233fb3d83a28857357e2beef56b6767bab2867d3c3796dc5dd796af4d03fb83e3133aeb7f4187b5cc9327 - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:^13.0.0": - version: 13.2.0 - resolution: "mdast-util-to-hast@npm:13.2.0" - dependencies: - "@types/hast": ^3.0.0 - "@types/mdast": ^4.0.0 - "@ungap/structured-clone": ^1.0.0 - devlop: ^1.0.0 - micromark-util-sanitize-uri: ^2.0.0 - trim-lines: ^3.0.0 - unist-util-position: ^5.0.0 - unist-util-visit: ^5.0.0 - vfile: ^6.0.0 - checksum: 7e5231ff3d4e35e1421908437577fd5098141f64918ff5cc8a0f7a8a76c5407f7a3ee88d75f7a1f7afb763989c9f357475fa0ba8296c00aaff1e940098fe86a6 - languageName: node - linkType: hard - -"mdast-util-to-markdown@npm:^1.0.0": - version: 1.5.0 - resolution: "mdast-util-to-markdown@npm:1.5.0" - dependencies: - "@types/mdast": ^3.0.0 - "@types/unist": ^2.0.0 - longest-streak: ^3.0.0 - mdast-util-phrasing: ^3.0.0 - mdast-util-to-string: ^3.0.0 - micromark-util-decode-string: ^1.0.0 - unist-util-visit: ^4.0.0 - zwitch: ^2.0.0 - checksum: 64338eb33e49bb0aea417591fd986f72fdd39205052563bb7ce9eb9ecc160824509bfacd740086a05af355c6d5c36353aafe95cab9e6927d674478757cee6259 - languageName: node - linkType: hard - -"mdast-util-to-markdown@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-to-markdown@npm:2.1.0" - dependencies: - "@types/mdast": ^4.0.0 - "@types/unist": ^3.0.0 - longest-streak: ^3.0.0 - mdast-util-phrasing: ^4.0.0 - mdast-util-to-string: ^4.0.0 - micromark-util-decode-string: ^2.0.0 - unist-util-visit: ^5.0.0 - zwitch: ^2.0.0 - checksum: 3a2cf3957e23b34e2e092e6e76ae72ee0b8745955bd811baba6814cf3a3d916c3fd52264b4b58f3bb3d512a428f84a1e998b6fc7e28434e388a9ae8fb6a9c173 - languageName: node - linkType: hard - "mdast-util-to-string@npm:^1.0.0": version: 1.1.0 resolution: "mdast-util-to-string@npm:1.1.0" @@ -34519,24 +30836,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": - version: 3.2.0 - resolution: "mdast-util-to-string@npm:3.2.0" - dependencies: - "@types/mdast": ^3.0.0 - checksum: dc40b544d54339878ae2c9f2b3198c029e1e07291d2126bd00ca28272ee6616d0d2194eb1c9828a7c34d412a79a7e73b26512a734698d891c710a1e73db1e848 - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-to-string@npm:4.0.0" - dependencies: - "@types/mdast": ^4.0.0 - checksum: 35489fb5710d58cbc2d6c8b6547df161a3f81e0f28f320dfb3548a9393555daf07c310c0c497708e67ed4dfea4a06e5655799e7d631ca91420c288b4525d6c29 - languageName: node - linkType: hard - "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -34544,7 +30843,7 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.0, mdurl@npm:^1.0.1": +"mdurl@npm:^1.0.1": version: 1.0.1 resolution: "mdurl@npm:1.0.1" checksum: 71731ecba943926bfbf9f9b51e28b5945f9411c4eda80894221b47cc105afa43ba2da820732b436f0798fd3edbbffcd1fc1415843c41a87fea08a41cc1e3d02b @@ -34678,18 +30977,6 @@ __metadata: languageName: node linkType: hard -"meros@npm:^1.2.1": - version: 1.3.0 - resolution: "meros@npm:1.3.0" - peerDependencies: - "@types/node": ">=13" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: ea86c83fe9357d3eb2f5bad20909e12642c7bc8c10340d9bd0968b48f69ec453de14f7e5032d138ad04cb10d79b8c9fb3c9601bb515e8fbdf9bec4eed62994ad - languageName: node - linkType: hard - "methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -34710,478 +30997,6 @@ __metadata: languageName: node linkType: hard -"micromark-core-commonmark@npm:^1.0.1": - version: 1.1.0 - resolution: "micromark-core-commonmark@npm:1.1.0" - dependencies: - decode-named-character-reference: ^1.0.0 - micromark-factory-destination: ^1.0.0 - micromark-factory-label: ^1.0.0 - micromark-factory-space: ^1.0.0 - micromark-factory-title: ^1.0.0 - micromark-factory-whitespace: ^1.0.0 - micromark-util-character: ^1.0.0 - micromark-util-chunked: ^1.0.0 - micromark-util-classify-character: ^1.0.0 - micromark-util-html-tag-name: ^1.0.0 - micromark-util-normalize-identifier: ^1.0.0 - micromark-util-resolve-all: ^1.0.0 - micromark-util-subtokenize: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.1 - uvu: ^0.5.0 - checksum: c6dfedc95889cc73411cb222fc2330b9eda6d849c09c9fd9eb3cd3398af246167e9d3cdb0ae3ce9ae59dd34a14624c8330e380255d41279ad7350cf6c6be6c5b - languageName: node - linkType: hard - -"micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" - dependencies: - decode-named-character-reference: ^1.0.0 - devlop: ^1.0.0 - micromark-factory-destination: ^2.0.0 - micromark-factory-label: ^2.0.0 - micromark-factory-space: ^2.0.0 - micromark-factory-title: ^2.0.0 - micromark-factory-whitespace: ^2.0.0 - micromark-util-character: ^2.0.0 - micromark-util-chunked: ^2.0.0 - micromark-util-classify-character: ^2.0.0 - micromark-util-html-tag-name: ^2.0.0 - micromark-util-normalize-identifier: ^2.0.0 - micromark-util-resolve-all: ^2.0.0 - micromark-util-subtokenize: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 6a9891cc883a531e090dc8dab6669945f3df9448e84216a8f2a91f9258281e6abea5ae3940fde2bd77a57dc3e0d67f2add6762aed63a378f37b09eaf7e7426c4 - languageName: node - linkType: hard - -"micromark-factory-destination@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-destination@npm:1.1.0" - dependencies: - micromark-util-character: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: 9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa - languageName: node - linkType: hard - -"micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" - dependencies: - micromark-util-character: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: d36e65ed1c072ff4148b016783148ba7c68a078991154625723e24bda3945160268fb91079fb28618e1613c2b6e70390a8ddc544c45410288aa27b413593071a - languageName: node - linkType: hard - -"micromark-factory-label@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-label@npm:1.1.0" - dependencies: - micromark-util-character: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - uvu: ^0.5.0 - checksum: fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 - languageName: node - linkType: hard - -"micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" - dependencies: - devlop: ^1.0.0 - micromark-util-character: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: c021dbd0ed367610d35f2bae21209bc804d1a6d1286ffce458fd6a717f4d7fe581a7cba7d5c2d7a63757c44eb927c80d6a571d6ea7969fae1b48ab6461d109c4 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-space@npm:1.1.0" - dependencies: - micromark-util-character: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" - dependencies: - micromark-util-character: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 4ffdcdc2f759887bbb356500cb460b3915ecddcb5d85c3618d7df68ad05d13ed02b1153ee1845677b7d8126df8f388288b84fcf0d943bd9c92bcc71cd7222e37 - languageName: node - linkType: hard - -"micromark-factory-title@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-title@npm:1.1.0" - dependencies: - micromark-factory-space: ^1.0.0 - micromark-util-character: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: 4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 - languageName: node - linkType: hard - -"micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" - dependencies: - micromark-factory-space: ^2.0.0 - micromark-util-character: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 39e1ac23af3554e6e652e56065579bc7faf21ade7b8704b29c175871b4152b7109b790bb3cae0f7e088381139c6bac9553b8400772c3d322e4fa635f813a3578 - languageName: node - linkType: hard - -"micromark-factory-whitespace@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-whitespace@npm:1.1.0" - dependencies: - micromark-factory-space: ^1.0.0 - micromark-util-character: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd - languageName: node - linkType: hard - -"micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" - dependencies: - micromark-factory-space: ^2.0.0 - micromark-util-character: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 9587c2546d1a58b4d5472b42adf05463f6212d0449455285662d63cd8eaed89c6b159ac82713fcee5f9dd88628c24307d9533cccd8971a2f3f4d48702f8f850a - languageName: node - linkType: hard - -"micromark-util-character@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-character@npm:1.2.0" - dependencies: - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: 089e79162a19b4a28731736246579ab7e9482ac93cd681c2bfca9983dcff659212ef158a66a5957e9d4b1dba957d1b87b565d85418a5b009f0294f1f07f2aaac - languageName: node - linkType: hard - -"micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" - dependencies: - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 36ee910f84077cf16626fa618cfe46ac25956b3242e3166b8e8e98c5a8c524af7e5bf3d70822264b1fd2d297a36104a7eb7e3462c19c28353eaca7b0d8717594 - languageName: node - linkType: hard - -"micromark-util-chunked@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-chunked@npm:1.1.0" - dependencies: - micromark-util-symbol: ^1.0.0 - checksum: c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b - languageName: node - linkType: hard - -"micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" - dependencies: - micromark-util-symbol: ^2.0.0 - checksum: 324f95cccdae061332a8241936eaba6ef0782a1e355bac5c607ad2564fd3744929be7dc81651315a2921535747a33243e6a5606bcb64b7a56d49b6d74ea1a3d4 - languageName: node - linkType: hard - -"micromark-util-classify-character@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-classify-character@npm:1.1.0" - dependencies: - micromark-util-character: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: 8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 - languageName: node - linkType: hard - -"micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" - dependencies: - micromark-util-character: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 086e52904deffebb793fb1c08c94aabb8901f76958142dfc3a6282890ebaa983b285e69bd602b9d507f1b758ed38e75a994d2ad9fbbefa7de2584f67a16af405 - languageName: node - linkType: hard - -"micromark-util-combine-extensions@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-combine-extensions@npm:1.1.0" - dependencies: - micromark-util-chunked: ^1.0.0 - micromark-util-types: ^1.0.0 - checksum: ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 - languageName: node - linkType: hard - -"micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" - dependencies: - micromark-util-chunked: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 107c47700343f365b4ed81551e18bc3458b573c500e56ac052b2490bd548adc475216e41d2271633a8867fac66fc22ba3e0a2d74a31ed79b9870ca947eb4e3ba - languageName: node - linkType: hard - -"micromark-util-decode-numeric-character-reference@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" - dependencies: - micromark-util-symbol: ^1.0.0 - checksum: 4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 - languageName: node - linkType: hard - -"micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" - dependencies: - micromark-util-symbol: ^2.0.0 - checksum: 9512507722efd2033a9f08715eeef787fbfe27e23edf55db21423d46d82ab46f76c89b4f960be3f5e50a2d388d89658afc0647989cf256d051e9ea01277a1adb - languageName: node - linkType: hard - -"micromark-util-decode-string@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-decode-string@npm:1.1.0" - dependencies: - decode-named-character-reference: ^1.0.0 - micromark-util-character: ^1.0.0 - micromark-util-decode-numeric-character-reference: ^1.0.0 - micromark-util-symbol: ^1.0.0 - checksum: f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 - languageName: node - linkType: hard - -"micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" - dependencies: - decode-named-character-reference: ^1.0.0 - micromark-util-character: ^2.0.0 - micromark-util-decode-numeric-character-reference: ^2.0.0 - micromark-util-symbol: ^2.0.0 - checksum: a75daf32a4a6b549e9f19b4d833ebfeb09a32a9a1f9ce50f35dec6b6a3e4f9f121f49024ba7f9c91c55ebe792f7c7a332fc9604795181b6a612637df0df5b959 - languageName: node - linkType: hard - -"micromark-util-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-encode@npm:1.1.0" - checksum: 4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 - languageName: node - linkType: hard - -"micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 853a3f33fce72aaf4ffa60b7f2b6fcfca40b270b3466e1b96561b02185d2bd8c01dd7948bc31a24ac014f4cc854e545ca9a8e9cf7ea46262f9d24c9e88551c66 - languageName: node - linkType: hard - -"micromark-util-html-tag-name@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-html-tag-name@npm:1.2.0" - checksum: ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 - languageName: node - linkType: hard - -"micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: d786d4486f93eb0ac5b628779809ca97c5dc60f3c9fc03eb565809831db181cf8cb7f05f9ac76852f3eb35461af0f89fa407b46f3a03f4f97a96754d8dc540d8 - languageName: node - linkType: hard - -"micromark-util-normalize-identifier@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-normalize-identifier@npm:1.1.0" - dependencies: - micromark-util-symbol: ^1.0.0 - checksum: 8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 - languageName: node - linkType: hard - -"micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" - dependencies: - micromark-util-symbol: ^2.0.0 - checksum: b36da2d3fd102053dadd953ce5c558328df12a63a8ac0e5aad13d4dda8e43b6a5d4a661baafe0a1cd8a260bead4b4a8e6e0e74193dd651e8484225bd4f4e68aa - languageName: node - linkType: hard - -"micromark-util-resolve-all@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-resolve-all@npm:1.1.0" - dependencies: - micromark-util-types: ^1.0.0 - checksum: 1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c - languageName: node - linkType: hard - -"micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" - dependencies: - micromark-util-types: ^2.0.0 - checksum: 31fe703b85572cb3f598ebe32750e59516925c7ff1f66cfe6afaebe0771a395a9eaa770787f2523d3c46082ea80e6c14f83643303740b3d650af7c96ebd30ccc - languageName: node - linkType: hard - -"micromark-util-sanitize-uri@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-sanitize-uri@npm:1.2.0" - dependencies: - micromark-util-character: ^1.0.0 - micromark-util-encode: ^1.0.0 - micromark-util-symbol: ^1.0.0 - checksum: 6663f365c4fe3961d622a580f4a61e34867450697f6806f027f21cf63c92989494895fcebe2345d52e249fe58a35be56e223a9776d084c9287818b40c779acc1 - languageName: node - linkType: hard - -"micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" - dependencies: - micromark-util-character: ^2.0.0 - micromark-util-encode: ^2.0.0 - micromark-util-symbol: ^2.0.0 - checksum: ea4c28bbffcf2430e9aff2d18554296789a8b0a1f54ac24020d1dde76624a7f93e8f2a83e88cd5a846b6d2c4287b71b1142d1b89fa7f1b0363a9b33711a141fe - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-subtokenize@npm:1.1.0" - dependencies: - micromark-util-chunked: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.0 - uvu: ^0.5.0 - checksum: 4a9d780c4d62910e196ea4fd886dc4079d8e424e5d625c0820016da0ed399a281daff39c50f9288045cc4bcd90ab47647e5396aba500f0853105d70dc8b1fc45 - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" - dependencies: - devlop: ^1.0.0 - micromark-util-chunked: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: 5d338883ad8889c63f9b262b9cae0c02a42088201981d820ae7af7aa6d38fab6585b89fd4cf2206a46a7c4002e41ee6c70e1a3e0ceb3ad8b7adcffaf166b1511 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-symbol@npm:1.1.0" - checksum: 02414a753b79f67ff3276b517eeac87913aea6c028f3e668a19ea0fc09d98aea9f93d6222a76ca783d20299af9e4b8e7c797fe516b766185dcc6e93290f11f88 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: fa4a05bff575d9fbf0ad96a1013003e3bb6087ed6b34b609a141b6c0d2137b57df594aca409a95f4c5fda199f227b56a7d8b1f82cea0768df161d8a3a3660764 - languageName: node - linkType: hard - -"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": - version: 1.1.0 - resolution: "micromark-util-types@npm:1.1.0" - checksum: b0ef2b4b9589f15aec2666690477a6a185536927ceb7aa55a0f46475852e012d75a1ab945187e5c7841969a842892164b15d58ff8316b8e0d6cc920cabd5ede7 - languageName: node - linkType: hard - -"micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 819fef3ab5770c37893d2a60381fb2694396c8d22803b6e103c830c3a1bc1490363c2b0470bb2acaaddad776dfbc2fc1fcfde39cb63c4f54d95121611672e3d0 - languageName: node - linkType: hard - -"micromark@npm:^3.0.0": - version: 3.2.0 - resolution: "micromark@npm:3.2.0" - dependencies: - "@types/debug": ^4.0.0 - debug: ^4.0.0 - decode-named-character-reference: ^1.0.0 - micromark-core-commonmark: ^1.0.1 - micromark-factory-space: ^1.0.0 - micromark-util-character: ^1.0.0 - micromark-util-chunked: ^1.0.0 - micromark-util-combine-extensions: ^1.0.0 - micromark-util-decode-numeric-character-reference: ^1.0.0 - micromark-util-encode: ^1.0.0 - micromark-util-normalize-identifier: ^1.0.0 - micromark-util-resolve-all: ^1.0.0 - micromark-util-sanitize-uri: ^1.0.0 - micromark-util-subtokenize: ^1.0.0 - micromark-util-symbol: ^1.0.0 - micromark-util-types: ^1.0.1 - uvu: ^0.5.0 - checksum: 56c15851ad3eb8301aede65603473443e50c92a54849cac1dadd57e4ec33ab03a0a77f3df03de47133e6e8f695dae83b759b514586193269e98c0bf319ecd5e4 - languageName: node - linkType: hard - -"micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" - dependencies: - "@types/debug": ^4.0.0 - debug: ^4.0.0 - decode-named-character-reference: ^1.0.0 - devlop: ^1.0.0 - micromark-core-commonmark: ^2.0.0 - micromark-factory-space: ^2.0.0 - micromark-util-character: ^2.0.0 - micromark-util-chunked: ^2.0.0 - micromark-util-combine-extensions: ^2.0.0 - micromark-util-decode-numeric-character-reference: ^2.0.0 - micromark-util-encode: ^2.0.0 - micromark-util-normalize-identifier: ^2.0.0 - micromark-util-resolve-all: ^2.0.0 - micromark-util-sanitize-uri: ^2.0.0 - micromark-util-subtokenize: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: b84ab5ab1a0b28c063c52e9c2c9d7d44b954507235c10c9492d66e0b38f7de24bf298f914a1fbdf109f2a57a88cf0412de217c84cfac5fd60e3e42a74dbac085 - languageName: node - linkType: hard - "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -35266,13 +31081,6 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 - languageName: node - linkType: hard - "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -35362,15 +31170,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.5": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: ^2.0.1 - checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 - languageName: node - linkType: hard - "minimist-options@npm:4.1.0, minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -35382,7 +31181,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.3, minimist@npm:^1.2.8": +"minimist@npm:^1.1.0, minimist@npm:^1.2.3": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -35734,7 +31533,7 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.1.0, mri@npm:^1.2.0": +"mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 @@ -36393,64 +32192,6 @@ __metadata: languageName: node linkType: hard -"next@npm:^14.1.3": - version: 14.2.7 - resolution: "next@npm:14.2.7" - dependencies: - "@next/env": 14.2.7 - "@next/swc-darwin-arm64": 14.2.7 - "@next/swc-darwin-x64": 14.2.7 - "@next/swc-linux-arm64-gnu": 14.2.7 - "@next/swc-linux-arm64-musl": 14.2.7 - "@next/swc-linux-x64-gnu": 14.2.7 - "@next/swc-linux-x64-musl": 14.2.7 - "@next/swc-win32-arm64-msvc": 14.2.7 - "@next/swc-win32-ia32-msvc": 14.2.7 - "@next/swc-win32-x64-msvc": 14.2.7 - "@swc/helpers": 0.5.5 - busboy: 1.6.0 - caniuse-lite: ^1.0.30001579 - graceful-fs: ^4.2.11 - postcss: 8.4.31 - styled-jsx: 5.1.1 - peerDependencies: - "@opentelemetry/api": ^1.1.0 - "@playwright/test": ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - dependenciesMeta: - "@next/swc-darwin-arm64": - optional: true - "@next/swc-darwin-x64": - optional: true - "@next/swc-linux-arm64-gnu": - optional: true - "@next/swc-linux-arm64-musl": - optional: true - "@next/swc-linux-x64-gnu": - optional: true - "@next/swc-linux-x64-musl": - optional: true - "@next/swc-win32-arm64-msvc": - optional: true - "@next/swc-win32-ia32-msvc": - optional: true - "@next/swc-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - "@playwright/test": - optional: true - sass: - optional: true - bin: - next: dist/bin/next - checksum: bc0237acb57c338803e0ef5ecc1b51908583da9d9dd325ece8b5862beba27b0ab556e9f8bdea863fc4fbf8378200946dcb0ad911ea978d166c8741c434461fe7 - languageName: node - linkType: hard - "nice-try@npm:^1.0.4": version: 1.0.5 resolution: "nice-try@npm:1.0.5" @@ -36458,15 +32199,6 @@ __metadata: languageName: node linkType: hard -"no-case@npm:^2.2.0, no-case@npm:^2.3.2": - version: 2.3.2 - resolution: "no-case@npm:2.3.2" - dependencies: - lower-case: ^1.1.1 - checksum: 856487731936fef44377ca74fdc5076464aba2e0734b56a4aa2b2a23d5b154806b591b9b2465faa59bb982e2b5c9391e3685400957fb4eeb38f480525adcf3dd - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -36594,16 +32326,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^1.5.3": - version: 1.7.3 - resolution: "node-fetch@npm:1.7.3" - dependencies: - encoding: ^0.1.11 - is-stream: ^1.0.1 - checksum: 3bb0528c05d541316ebe52770d71ee25a6dce334df4231fd55df41a644143e07f068637488c18a5b0c43f05041dbd3346752f9e19b50df50569a802484544d5b - languageName: node - linkType: hard - "node-forge@npm:1.3.1, node-forge@npm:^1.0.0": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -36750,13 +32472,6 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 - languageName: node - linkType: hard - "node-releases@npm:^2.0.6": version: 2.0.6 resolution: "node-releases@npm:2.0.6" @@ -36852,15 +32567,6 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^2.1.1": - version: 2.1.1 - resolution: "normalize-path@npm:2.1.1" - dependencies: - remove-trailing-separator: ^1.0.1 - checksum: 7e9cbdcf7f5b8da7aa191fbfe33daf290cdcd8c038f422faf1b8a83c972bf7a6d94c5be34c4326cb00fb63bc0fd97d9fbcfaf2e5d6142332c2cd36d2e1b86cea - languageName: node - linkType: hard - "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -36875,13 +32581,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 - languageName: node - linkType: hard - "normalize-url@npm:^8.0.0": version: 8.0.1 resolution: "normalize-url@npm:8.0.1" @@ -36999,13 +32698,6 @@ __metadata: languageName: node linkType: hard -"nullthrows@npm:^1.1.1": - version: 1.1.1 - resolution: "nullthrows@npm:1.1.1" - checksum: 10806b92121253eb1b08ecf707d92480f5331ba8ae5b23fa3eb0548ad24196eb797ed47606153006568a5733ea9e528a3579f21421f7828e09e7756f4bdd386f - languageName: node - linkType: hard - "number-allocator@npm:^1.0.9": version: 1.0.14 resolution: "number-allocator@npm:1.0.14" @@ -37121,13 +32813,6 @@ __metadata: languageName: node linkType: hard -"object-path@npm:^0.11.8": - version: 0.11.8 - resolution: "object-path@npm:0.11.8" - checksum: 684ccf0fb6b82f067dc81e2763481606692b8485bec03eb2a64e086a44dbea122b2b9ef44423a08e09041348fe4b4b67bd59985598f1652f67df95f0618f5968 - languageName: node - linkType: hard - "object-treeify@npm:^1.1.33": version: 1.1.33 resolution: "object-treeify@npm:1.1.33" @@ -37651,15 +33336,6 @@ __metadata: languageName: node linkType: hard -"os-locale@npm:^1.4.0": - version: 1.4.0 - resolution: "os-locale@npm:1.4.0" - dependencies: - lcid: ^1.0.0 - checksum: 0161a1b6b5a8492f99f4b47fe465df9fc521c55ba5414fce6444c45e2500487b8ed5b40a47a98a2363fe83ff04ab033785300ed8df717255ec4c3b625e55b1fb - languageName: node - linkType: hard - "os-name@npm:5.1.0": version: 5.1.0 resolution: "os-name@npm:5.1.0" @@ -37702,13 +33378,6 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf - languageName: node - linkType: hard - "p-cancelable@npm:^3.0.0": version: 3.0.0 resolution: "p-cancelable@npm:3.0.0" @@ -37732,15 +33401,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - "p-limit@npm:^1.1.0": version: 1.3.0 resolution: "p-limit@npm:1.3.0" @@ -37759,6 +33419,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + "p-limit@npm:^4.0.0": version: 4.0.0 resolution: "p-limit@npm:4.0.0" @@ -37940,15 +33609,6 @@ __metadata: languageName: node linkType: hard -"param-case@npm:^2.1.0": - version: 2.1.1 - resolution: "param-case@npm:2.1.1" - dependencies: - no-case: ^2.2.0 - checksum: 3a63dcb8d8dc7995a612de061afdc7bb6fe7bd0e6db994db8d4cae999ed879859fd24389090e1a0d93f4c9207ebf8c048c870f468a3f4767161753e03cb9ab58 - languageName: node - linkType: hard - "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -38026,33 +33686,6 @@ __metadata: languageName: node linkType: hard -"parse-entities@npm:^4.0.0": - version: 4.0.1 - resolution: "parse-entities@npm:4.0.1" - dependencies: - "@types/unist": ^2.0.0 - character-entities: ^2.0.0 - character-entities-legacy: ^3.0.0 - character-reference-invalid: ^2.0.0 - decode-named-character-reference: ^1.0.0 - is-alphanumerical: ^2.0.0 - is-decimal: ^2.0.0 - is-hexadecimal: ^2.0.0 - checksum: 32a6ff5b9acb9d2c4d71537308521fd265e685b9215691df73feedd9edfe041bb6da9f89bd0c35c4a2bc7d58e3e76e399bb6078c2fd7d2a343ff1dd46edbf1bd - languageName: node - linkType: hard - -"parse-filepath@npm:^1.0.2": - version: 1.0.2 - resolution: "parse-filepath@npm:1.0.2" - dependencies: - is-absolute: ^1.0.0 - map-cache: ^0.2.0 - path-root: ^0.1.1 - checksum: 6794c3f38d3921f0f7cc63fb1fb0c4d04cd463356ad389c8ce6726d3c50793b9005971f4138975a6d7025526058d5e65e9bfe634d0765e84c4e2571152665a69 - languageName: node - linkType: hard - "parse-headers@npm:^2.0.0": version: 2.0.5 resolution: "parse-headers@npm:2.0.5" @@ -38060,15 +33693,6 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^2.2.0": - version: 2.2.0 - resolution: "parse-json@npm:2.2.0" - dependencies: - error-ex: ^1.2.0 - checksum: dda78a63e57a47b713a038630868538f718a7ca0cd172a36887b0392ccf544ed0374902eb28f8bf3409e8b71d62b79d17062f8543afccf2745f9b0b2d2bb80ca - languageName: node - linkType: hard - "parse-json@npm:^4.0.0": version: 4.0.0 resolution: "parse-json@npm:4.0.0" @@ -38139,7 +33763,7 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.0, parse5@npm:^6.0.1": +"parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd @@ -38172,16 +33796,6 @@ __metadata: languageName: node linkType: hard -"pascal-case@npm:^2.0.0": - version: 2.0.1 - resolution: "pascal-case@npm:2.0.1" - dependencies: - camel-case: ^3.0.0 - upper-case-first: ^1.1.0 - checksum: 4c539bf556572812f64a02fc6b544f3d2b51db12aed484e5162ed7f8ac2b366775d15e536091c890d71d82bdf9153128321f21574721b3a984bd85df9e519a35 - languageName: node - linkType: hard - "pascal-case@npm:^3.1.2": version: 3.1.2 resolution: "pascal-case@npm:3.1.2" @@ -38253,34 +33867,6 @@ __metadata: languageName: node linkType: hard -"path-case@npm:^2.1.0": - version: 2.1.1 - resolution: "path-case@npm:2.1.1" - dependencies: - no-case: ^2.2.0 - checksum: eb1da508c28378715cbe4ce054ee5f83a570c5010f041f4cfb439c811f7a78e36c46f26a8d59b2594c3882b53db06ef26195519c27f86523dc5d19c2e29f306d - languageName: node - linkType: hard - -"path-case@npm:^3.0.4": - version: 3.0.4 - resolution: "path-case@npm:3.0.4" - dependencies: - dot-case: ^3.0.4 - tslib: ^2.0.3 - checksum: 61de0526222629f65038a66f63330dd22d5b54014ded6636283e1d15364da38b3cf29e4433aa3f9d8b0dba407ae2b059c23b0104a34ee789944b1bc1c5c7e06d - languageName: node - linkType: hard - -"path-exists@npm:^2.0.0": - version: 2.1.0 - resolution: "path-exists@npm:2.1.0" - dependencies: - pinkie-promise: ^2.0.0 - checksum: fdb734f1d00f225f7a0033ce6d73bff6a7f76ea08936abf0e5196fa6e54a645103538cd8aedcb90d6d8c3fa3705ded0c58a4da5948ae92aa8834892c1ab44a84 - languageName: node - linkType: hard - "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -38337,22 +33923,6 @@ __metadata: languageName: node linkType: hard -"path-root-regex@npm:^0.1.0": - version: 0.1.2 - resolution: "path-root-regex@npm:0.1.2" - checksum: dcd75d1f8e93faabe35a58e875b0f636839b3658ff2ad8c289463c40bc1a844debe0dab73c3398ef9dc8f6ec6c319720aff390cf4633763ddcf3cf4b1bbf7e8b - languageName: node - linkType: hard - -"path-root@npm:^0.1.1": - version: 0.1.1 - resolution: "path-root@npm:0.1.1" - dependencies: - path-root-regex: ^0.1.0 - checksum: ff88aebfc1c59ace510cc06703d67692a11530989920427625e52b66a303ca9b3d4059b0b7d0b2a73248d1ad29bcb342b8b786ec00592f3101d38a45fd3b2e08 - languageName: node - linkType: hard - "path-scurry@npm:^1.10.0, path-scurry@npm:^1.10.1, path-scurry@npm:^1.6.1": version: 1.10.1 resolution: "path-scurry@npm:1.10.1" @@ -38384,17 +33954,6 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^1.0.0": - version: 1.1.0 - resolution: "path-type@npm:1.1.0" - dependencies: - graceful-fs: ^4.1.2 - pify: ^2.0.0 - pinkie-promise: ^2.0.0 - checksum: 59a4b2c0e566baf4db3021a1ed4ec09a8b36fca960a490b54a6bcefdb9987dafe772852982b6011cd09579478a96e57960a01f75fa78a794192853c9d468fc79 - languageName: node - linkType: hard - "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -38605,13 +34164,6 @@ __metadata: languageName: node linkType: hard -"phenomenon@npm:^1.6.0": - version: 1.6.0 - resolution: "phenomenon@npm:1.6.0" - checksum: e05ca8223a9df42c5cee02c082103ef96a349424fec18a8478d2171060a63095e21bef394529263c64d8082aff43204a0fa1355211fd7ac2a338c2839fffbca3 - languageName: node - linkType: hard - "phin@npm:^2.9.1": version: 2.9.3 resolution: "phin@npm:2.9.3" @@ -38626,13 +34178,6 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.1": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd - languageName: node - linkType: hard - "picomatch@npm:3.0.1": version: 3.0.1 resolution: "picomatch@npm:3.0.1" @@ -38665,7 +34210,7 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.0.0, pify@npm:^2.3.0": +"pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba @@ -38695,15 +34240,6 @@ __metadata: languageName: node linkType: hard -"pinkie-promise@npm:^2.0.0": - version: 2.0.1 - resolution: "pinkie-promise@npm:2.0.1" - dependencies: - pinkie: ^2.0.0 - checksum: b53a4a2e73bf56b6f421eef711e7bdcb693d6abb474d57c5c413b809f654ba5ee750c6a96dd7225052d4b96c4d053cdcb34b708a86fceed4663303abee52fcca - languageName: node - linkType: hard - "pinkie@npm:^1.0.0": version: 1.0.0 resolution: "pinkie@npm:1.0.0" @@ -38711,13 +34247,6 @@ __metadata: languageName: node linkType: hard -"pinkie@npm:^2.0.0": - version: 2.0.4 - resolution: "pinkie@npm:2.0.4" - checksum: b12b10afea1177595aab036fc220785488f67b4b0fc49e7a27979472592e971614fa1c728e63ad3e7eb748b4ec3c3dbd780819331dad6f7d635c77c10537b9db - languageName: node - linkType: hard - "pirates@npm:^4.0.1, pirates@npm:^4.0.5": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -38808,15 +34337,6 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:^1.38.1": - version: 1.46.1 - resolution: "playwright-core@npm:1.46.1" - bin: - playwright-core: cli.js - checksum: 99a03f97d76af02b0565aa09758eb03427e13497ef7e9e9044fd1184a5f050e7545a517dd7ad8988a68b3ea76e2ba0d411f81e410b1cb29f5ac9161c49689822 - languageName: node - linkType: hard - "playwright@npm:1.45.3": version: 1.45.3 resolution: "playwright@npm:1.45.3" @@ -39472,33 +34992,6 @@ __metadata: languageName: node linkType: hard -"prism-react-renderer@npm:^1.3.5": - version: 1.3.5 - resolution: "prism-react-renderer@npm:1.3.5" - peerDependencies: - react: ">=0.14.9" - checksum: c18806dcbc4c0b4fd6fd15bd06b4f7c0a6da98d93af235c3e970854994eb9b59e23315abb6cfc29e69da26d36709a47e25da85ab27fed81b6812f0a52caf6dfa - languageName: node - linkType: hard - -"prisma-field-encryption@npm:^1.4.0": - version: 1.5.2 - resolution: "prisma-field-encryption@npm:1.5.2" - dependencies: - "@47ng/cloak": ^1.1.0 - "@prisma/generator-helper": ^5.9.1 - debug: ^4.3.4 - immer: ^10.0.3 - object-path: ^0.11.8 - zod: ^3.22.4 - peerDependencies: - "@prisma/client": ">= 4.7" - bin: - prisma-field-encryption: dist/generator/main.js - checksum: 22c04c16af2a3f0f4cd1b6b31172a17b758619cd5e1fb6bed469147fa0d840fc072f59c8da836c64181796778959fd512d2054f5f5d985921b4c91e3c18d4453 - languageName: node - linkType: hard - "prisma-kysely@npm:^1.7.1": version: 1.8.0 resolution: "prisma-kysely@npm:1.8.0" @@ -39676,13 +35169,6 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^6.0.0": - version: 6.5.0 - resolution: "property-information@npm:6.5.0" - checksum: 6e55664e2f64083b715011e5bafaa1e694faf36986c235b0907e95d09259cc37c38382e3cc94a4c3f56366e05336443db12c8a0f0968a8c0a1b1416eebfc8f53 - languageName: node - linkType: hard - "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -39830,7 +35316,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.3.2, punycode@npm:^1.4.1": +"punycode@npm:^1.4.1": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 @@ -39885,22 +35371,6 @@ __metadata: languageName: node linkType: hard -"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5": - version: 1.3.5 - resolution: "pvtsutils@npm:1.3.5" - dependencies: - tslib: ^2.6.1 - checksum: e734516b3cb26086c18bd9c012fefe818928a5073178842ab7e62885a090f1dd7bda9c7bb8cd317167502cb8ec86c0b1b0ccd71dac7ab469382a4518157b0d12 - languageName: node - linkType: hard - -"pvutils@npm:^1.1.3": - version: 1.1.3 - resolution: "pvutils@npm:1.1.3" - checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9 - languageName: node - linkType: hard - "q@npm:2.0.x": version: 2.0.3 resolution: "q@npm:2.0.3" @@ -40193,16 +35663,6 @@ __metadata: languageName: node linkType: hard -"react-chartjs-2@npm:^4.0.1": - version: 4.3.1 - resolution: "react-chartjs-2@npm:4.3.1" - peerDependencies: - chart.js: ^3.5.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 574d12cc43b9b4a0f1e04cc692982e16ef7083c03da2a8a9fc2180fe9bcadc793008f81d8f4eec5465925eff84c95d7c523cb74376858b363ae75a83bb3c2a5d - languageName: node - linkType: hard - "react-colorful@npm:^5.1.2": version: 5.6.1 resolution: "react-colorful@npm:5.6.1" @@ -40223,17 +35683,6 @@ __metadata: languageName: node linkType: hard -"react-confetti@npm:^6.0.1": - version: 6.1.0 - resolution: "react-confetti@npm:6.1.0" - dependencies: - tween-functions: ^1.2.0 - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 - checksum: 24b6975df144d2bf09d8e1c95ddc49e547775f911efaa8d96b49e522659d931539e9d9e48cc0db3a01f3a671be7e3824e6e728db85096f5527db5d1c69ebb153 - languageName: node - linkType: hard - "react-copy-to-clipboard@npm:5.0.4": version: 5.0.4 resolution: "react-copy-to-clipboard@npm:5.0.4" @@ -40267,23 +35716,6 @@ __metadata: languageName: node linkType: hard -"react-datocms@npm:^3.1.0": - version: 3.1.4 - resolution: "react-datocms@npm:3.1.4" - 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 - peerDependencies: - react: ">= 16.12.0" - checksum: 54aba12aef4937175c2011548a8a576c96c8d8a596e84d191826910624c1d596e76a49782689dc236388a10803b02e700ac820cb7500cca7fd147a81f6c544c3 - languageName: node - linkType: hard - "react-day-picker@npm:^8.10.1": version: 8.10.1 resolution: "react-day-picker@npm:8.10.1" @@ -40306,18 +35738,6 @@ __metadata: languageName: node linkType: hard -"react-device-detect@npm:^2.2.2": - version: 2.2.3 - resolution: "react-device-detect@npm:2.2.3" - dependencies: - ua-parser-js: ^1.0.33 - peerDependencies: - react: ">= 0.14.0" - react-dom: ">= 0.14.0" - checksum: 42d9b3182b9d2495bf0d7914c9f370da51d8bdb853a3eba2acaf433894ae760386a075ba103185be825b33d42f50d85ef462087f261656d433f4c74dab23861f - languageName: node - linkType: hard - "react-devtools-core@npm:^4.19.1": version: 4.24.6 resolution: "react-devtools-core@npm:4.24.6" @@ -40412,16 +35832,6 @@ __metadata: languageName: node linkType: hard -"react-fast-marquee@npm:^1.6.4": - version: 1.6.5 - resolution: "react-fast-marquee@npm:1.6.5" - peerDependencies: - react: ">= 16.8.0 || ^18.0.0" - react-dom: ">= 16.8.0 || ^18.0.0" - checksum: 5213b10983f47a2dc27c3206144f96b37dad2f08457b19ecb9e393e4bd3c8db8c9cccf1758ceb5c4ca6d697e3715f3f90c5d806e4cb62bbbad9ece7f0e7b3caf - languageName: node - linkType: hard - "react-fit@npm:^1.4.0": version: 1.4.0 resolution: "react-fit@npm:1.4.0" @@ -40445,17 +35855,6 @@ __metadata: languageName: node linkType: hard -"react-github-btn@npm:^1.4.0": - version: 1.4.0 - resolution: "react-github-btn@npm:1.4.0" - dependencies: - github-buttons: ^2.22.0 - peerDependencies: - react: ">=16.3.0" - checksum: 33a416ad76ab4cc9238ac5cf5cfcab636bb2127c48fb30805385350fd3a3c2aa0aaeb78f6c726c52a0d3d133ca469be35d4b3d188c8e40c735c7ff458d2c8c3c - languageName: node - linkType: hard - "react-hook-form@npm:^7.43.3": version: 7.43.3 resolution: "react-hook-form@npm:7.43.3" @@ -40541,15 +35940,6 @@ __metadata: languageName: node linkType: hard -"react-intersection-observer@npm:^8.33.1": - version: 8.34.0 - resolution: "react-intersection-observer@npm:8.34.0" - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0 - checksum: 7713fecfd1512c7f5a60f9f0bf15403b8f8bbd4110bcafaeaea6de36a0e0eb60368c3638f99e9c97b75ad8fc787ea48c241dcb5c694f821d7f2976f709082cc5 - languageName: node - linkType: hard - "react-intl@npm:^5.25.1": version: 5.25.1 resolution: "react-intl@npm:5.25.1" @@ -40618,34 +36008,6 @@ __metadata: languageName: node linkType: hard -"react-markdown@npm:^9.0.1": - version: 9.0.1 - resolution: "react-markdown@npm:9.0.1" - dependencies: - "@types/hast": ^3.0.0 - devlop: ^1.0.0 - hast-util-to-jsx-runtime: ^2.0.0 - html-url-attributes: ^3.0.0 - mdast-util-to-hast: ^13.0.0 - remark-parse: ^11.0.0 - remark-rehype: ^11.0.0 - unified: ^11.0.0 - unist-util-visit: ^5.0.0 - vfile: ^6.0.0 - peerDependencies: - "@types/react": ">=18" - react: ">=18" - checksum: ca1daa650d48b84a5a9771683cdb3f3d2d418247ce0faf73ede3207c65f2a21cdebb9df37afda67f6fc8f0f0a7b9ce00eb239781954a4d6c7ad88ea4df068add - languageName: node - linkType: hard - -"react-merge-refs@npm:1.1.0": - version: 1.1.0 - resolution: "react-merge-refs@npm:1.1.0" - checksum: 90884352999002d868ab9f1bcfe3222fb0f2178ed629f1da7e98e5a9b02a2c96b4aa72800db92aabd69d2483211b4be57a2088e89a11a0b660e7ada744d4ddf7 - languageName: node - linkType: hard - "react-multi-email@npm:^0.5.3": version: 0.5.3 resolution: "react-multi-email@npm:0.5.3" @@ -40865,18 +36227,6 @@ __metadata: languageName: node linkType: hard -"react-resize-detector@npm:^9.1.0": - version: 9.1.1 - resolution: "react-resize-detector@npm:9.1.1" - dependencies: - lodash: ^4.17.21 - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 0612b4416212962e5762f25e20c7016bdce3107d745a399b44bc099a04488a704228908357845c2e3fa49bf9902077f0eeebc99cf76d42ea479a8aa79f4c5b9d - languageName: node - linkType: hard - "react-schemaorg@npm:^2.0.0": version: 2.0.0 resolution: "react-schemaorg@npm:2.0.0" @@ -40951,13 +36301,6 @@ __metadata: languageName: node linkType: hard -"react-string-replace@npm:^1.1.0": - version: 1.1.1 - resolution: "react-string-replace@npm:1.1.1" - checksum: fd5058bbb3953f4bb2daa7012630a154c6109e3e848f93925e146710cebf527647a7c1496c89ca0b5d9e4b4f8ffd5c55ca631539095039faaba0a7ba3787e7cb - languageName: node - linkType: hard - "react-style-singleton@npm:^2.1.0": version: 2.1.1 resolution: "react-style-singleton@npm:2.1.1" @@ -41076,20 +36419,6 @@ __metadata: languageName: node linkType: hard -"react-twemoji@npm:^0.3.0": - version: 0.3.0 - resolution: "react-twemoji@npm:0.3.0" - dependencies: - lodash.isequal: ^4.5.0 - prop-types: ^15.7.2 - twemoji: ^13.0.1 - peerDependencies: - react: ^16.4.2 - react-dom: ^16.4.2 - checksum: d4e56477c28c0ad65b98a062a2e9a1777b808a16c05dfa35d77d84fea26f7d1e884d2e30f95a8f14c94c31330d3d4f53a4fd0bfce917bc4be9fb21d34a05db8a - languageName: node - linkType: hard - "react-universal-interface@npm:^0.6.2": version: 0.6.2 resolution: "react-universal-interface@npm:0.6.2" @@ -41110,18 +36439,6 @@ __metadata: languageName: node linkType: hard -"react-use-measure@npm:^2.1.1": - version: 2.1.1 - resolution: "react-use-measure@npm:2.1.1" - dependencies: - debounce: ^1.2.1 - peerDependencies: - react: ">=16.13" - react-dom: ">=16.13" - checksum: b8e8939229d463c3c505f7b617925c0228efae0cd6f651371f463846417b06c9170be57df51293a61027c41770f8a090fdb8a08717c4e36290ccb496e0318f1f - languageName: node - linkType: hard - "react-use@npm:^17.4.2": version: 17.5.0 resolution: "react-use@npm:17.5.0" @@ -41158,15 +36475,6 @@ __metadata: languageName: node linkType: hard -"react-wrap-balancer@npm:^1.0.0": - version: 1.1.1 - resolution: "react-wrap-balancer@npm:1.1.1" - peerDependencies: - react: ">=16.8.0 || ^17.0.0 || ^18" - checksum: 68d9417efa751eced4a8c9f7e3f1f43d59fbf9ecf42dfd90b7b4c33f5af855766bb21bf967c9fc8a0f09f6ca4a58071c1dd47af2c813b33b3813ebe7efcb32f2 - languageName: node - linkType: hard - "react@npm:^18, react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -41196,27 +36504,6 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^1.0.1": - version: 1.0.1 - resolution: "read-pkg-up@npm:1.0.1" - dependencies: - find-up: ^1.0.0 - read-pkg: ^1.0.0 - checksum: d18399a0f46e2da32beb2f041edd0cda49d2f2cc30195a05c759ef3ed9b5e6e19ba1ad1bae2362bdec8c6a9f2c3d18f4d5e8c369e808b03d498d5781cb9122c7 - languageName: node - linkType: hard - -"read-pkg@npm:^1.0.0": - version: 1.1.0 - resolution: "read-pkg@npm:1.1.0" - dependencies: - load-json-file: ^1.0.0 - normalize-package-data: ^2.3.2 - path-type: ^1.0.0 - checksum: a0f5d5e32227ec8e6a028dd5c5134eab229768dcb7a5d9a41a284ed28ad4b9284fecc47383dc1593b5694f4de603a7ffaee84b738956b9b77e0999567485a366 - languageName: node - linkType: hard - "read-pkg@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg@npm:3.0.0" @@ -41567,13 +36854,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.11.0": - version: 0.11.1 - resolution: "regenerator-runtime@npm:0.11.1" - checksum: 3c97bd2c7b2b3247e6f8e2147a002eb78c995323732dad5dc70fac8d8d0b758d0295e7015b90d3d444446ae77cbd24b9f9123ec3a77018e81d8999818301b4f4 - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.13.3": version: 0.13.9 resolution: "regenerator-runtime@npm:0.13.9" @@ -41719,17 +36999,6 @@ __metadata: languageName: node linkType: hard -"relay-runtime@npm:12.0.0": - version: 12.0.0 - resolution: "relay-runtime@npm:12.0.0" - dependencies: - "@babel/runtime": ^7.0.0 - fbjs: ^3.0.0 - invariant: ^2.2.4 - checksum: 51cdc8a5e04188982452ae4e7c6ac7d6375ee769130d24ce8e8f9cdd45aa7e11ecd68670f56e30dcee1b4974585e88ecce19e69a9868b80cda0db7678c3b8f0a - languageName: node - linkType: hard - "release-it@npm:^17.1.1": version: 17.1.1 resolution: "release-it@npm:17.1.1" @@ -41780,55 +37049,6 @@ __metadata: languageName: node linkType: hard -"remark-html@npm:^14.0.1": - version: 14.0.1 - resolution: "remark-html@npm:14.0.1" - 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 - checksum: 5d689b05dc6b4f24e08ece07aabca98685949198a8b6ceacb2fbf7fba8f45f55cea5623caddfd92aaf6e6f082bc1c93797dfb82dc48a6f6e1c5263947a4779c9 - languageName: node - linkType: hard - -"remark-parse@npm:^10.0.0": - version: 10.0.2 - resolution: "remark-parse@npm:10.0.2" - dependencies: - "@types/mdast": ^3.0.0 - mdast-util-from-markdown: ^1.0.0 - unified: ^10.0.0 - checksum: 5041b4b44725f377e69986e02f8f072ae2222db5e7d3b6c80829756b842e811343ffc2069cae1f958a96bfa36104ab91a57d7d7e2f0cef521e210ab8c614d5c7 - languageName: node - linkType: hard - -"remark-parse@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-parse@npm:11.0.0" - dependencies: - "@types/mdast": ^4.0.0 - mdast-util-from-markdown: ^2.0.0 - micromark-util-types: ^2.0.0 - unified: ^11.0.0 - checksum: d83d245290fa84bb04fb3e78111f09c74f7417e7c012a64dd8dc04fccc3699036d828fbd8eeec8944f774b6c30cc1d925c98f8c46495ebcee7c595496342ab7f - languageName: node - linkType: hard - -"remark-rehype@npm:^11.0.0": - version: 11.1.0 - resolution: "remark-rehype@npm:11.1.0" - dependencies: - "@types/hast": ^3.0.0 - "@types/mdast": ^4.0.0 - mdast-util-to-hast: ^13.0.0 - unified: ^11.0.0 - vfile: ^6.0.0 - checksum: f0c731f0ab92a122e7f9c9bcbd10d6a31fdb99f0ea3595d232ddd9f9d11a308c4ec0aff4d56e1d0d256042dfad7df23b9941e50b5038da29786959a5926814e1 - languageName: node - linkType: hard - "remark-slug@npm:^6.0.0": version: 6.1.0 resolution: "remark-slug@npm:6.1.0" @@ -41840,29 +37060,6 @@ __metadata: languageName: node linkType: hard -"remark-stringify@npm:^10.0.0": - version: 10.0.3 - resolution: "remark-stringify@npm:10.0.3" - dependencies: - "@types/mdast": ^3.0.0 - mdast-util-to-markdown: ^1.0.0 - unified: ^10.0.0 - checksum: 6004e204fba672ee322c3cf0bef090e95802feedf7ef875f88b120c5e6208f1eb09c014486d5ca42a1e199c0a17ce0ed165fb248c66608458afed4bdca51dd3a - languageName: node - linkType: hard - -"remark@npm:^14.0.2": - version: 14.0.3 - resolution: "remark@npm:14.0.3" - dependencies: - "@types/mdast": ^3.0.0 - remark-parse: ^10.0.0 - remark-stringify: ^10.0.0 - unified: ^10.0.0 - checksum: 36eec9668c5f5e497507fa5d396c79183265a5f7dd204a608e7f031a4f61b48f7bb5cfaec212f5614ccd1266cc4a9f8d7a59a45e95aed9876986b4c453b191be - languageName: node - linkType: hard - "remarkable@npm:^2.0.1": version: 2.0.1 resolution: "remarkable@npm:2.0.1" @@ -41875,20 +37072,6 @@ __metadata: languageName: node linkType: hard -"remeda@npm:^1.24.1": - version: 1.61.0 - resolution: "remeda@npm:1.61.0" - checksum: c080da71953ccc178334ca774f0da5c3f4664ef25ff7bc1e1f09a921ff9c264bbf8be8e0ac876c4a3f851a4d3e017cd454319a0e24610fd744bd8f9177dd4c7b - languageName: node - linkType: hard - -"remedial@npm:^1.0.7": - version: 1.0.8 - resolution: "remedial@npm:1.0.8" - checksum: 12df7c55eb92501d7f33cfe5f5ad12be13bb6ac0c53f494aaa9963d5a5155bb8be2143e8d5e17afa1a500ef5dc71d13642920d35350f2a31b65a9778afab6869 - languageName: node - linkType: hard - "remove-accents@npm:0.5.0": version: 0.5.0 resolution: "remove-accents@npm:0.5.0" @@ -41903,20 +37086,6 @@ __metadata: languageName: node linkType: hard -"remove-trailing-separator@npm:^1.0.1": - version: 1.1.0 - resolution: "remove-trailing-separator@npm:1.1.0" - checksum: d3c20b5a2d987db13e1cca9385d56ecfa1641bae143b620835ac02a6b70ab88f68f117a0021838db826c57b31373d609d52e4f31aca75fc490c862732d595419 - languageName: node - linkType: hard - -"remove-trailing-spaces@npm:^1.0.6": - version: 1.0.8 - resolution: "remove-trailing-spaces@npm:1.0.8" - checksum: 81f615c5cd8dd6a5e3017dcc9af598965575d176d42ef99cfd7b894529991f464e629fd68aba089f5c6bebf5bb8070a5eee56f3b621aba55e8ef524d6a4d4f69 - languageName: node - linkType: hard - "renderkid@npm:^3.0.0": version: 3.0.0 resolution: "renderkid@npm:3.0.0" @@ -41997,13 +37166,6 @@ __metadata: languageName: node linkType: hard -"require-main-filename@npm:^1.0.1": - version: 1.0.1 - resolution: "require-main-filename@npm:1.0.1" - checksum: 1fef30754da961f4e13c450c3eb60c7ae898a529c6ad6fa708a70bd2eed01564ceb299187b2899f5562804d797a059f39a5789884d0ac7b7ae1defc68fba4abf - languageName: node - linkType: hard - "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -42032,7 +37194,7 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": +"resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 @@ -42048,13 +37210,6 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -42062,6 +37217,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + "resolve-url-loader@npm:^5.0.0": version: 5.0.0 resolution: "resolve-url-loader@npm:5.0.0" @@ -42278,15 +37440,6 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^2.0.0": - version: 2.0.1 - resolution: "responselike@npm:2.0.1" - dependencies: - lowercase-keys: ^2.0.0 - checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a - languageName: node - linkType: hard - "responselike@npm:^3.0.0": version: 3.0.0 resolution: "responselike@npm:3.0.0" @@ -42648,7 +37801,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:7.8.1, rxjs@npm:^7.0.0, rxjs@npm:^7.8.1": +"rxjs@npm:7.8.1, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -42666,22 +37819,6 @@ __metadata: languageName: node linkType: hard -"s-ago@npm:^2.2.0": - version: 2.2.0 - resolution: "s-ago@npm:2.2.0" - checksum: f665fef44d9d88322ce5a798ca3c49b40f96231ddc7bd46dc23c883e98215675aa422985760d45d3779faa3c0bc94edb2a50630bf15f54c239d11963e53d998c - languageName: node - linkType: hard - -"sade@npm:^1.7.3": - version: 1.8.1 - resolution: "sade@npm:1.8.1" - dependencies: - mri: ^1.1.0 - checksum: 0756e5b04c51ccdc8221ebffd1548d0ce5a783a44a0fa9017a026659b97d632913e78f7dca59f2496aa996a0be0b0c322afd87ca72ccd909406f49dbffa0f45d - languageName: node - linkType: hard - "safe-array-concat@npm:^1.0.1": version: 1.1.0 resolution: "safe-array-concat@npm:1.1.0" @@ -42914,13 +38051,6 @@ __metadata: languageName: node linkType: hard -"scuid@npm:^1.1.0": - version: 1.1.0 - resolution: "scuid@npm:1.1.0" - checksum: cd094ac3718b0070a222f9a499b280c698fdea10268cc163fa244421099544c1766dd893fdee0e2a8eba5d53ab9d0bcb11067bedff166665030fa6fda25a096b - languageName: node - linkType: hard - "section-matter@npm:^1.0.0": version: 1.0.0 resolution: "section-matter@npm:1.0.0" @@ -43059,27 +38189,6 @@ __metadata: languageName: node linkType: hard -"sentence-case@npm:^2.1.0": - version: 2.1.1 - resolution: "sentence-case@npm:2.1.1" - dependencies: - no-case: ^2.2.0 - upper-case-first: ^1.1.2 - checksum: ce5ca48804051e056a6956ad75a1a7d833e5d8f5021a015d380a22d3cf04496d5238de2e5c876d9701a9218633052c3a65911ca1b6460d36a41ecad46e81d139 - languageName: node - linkType: hard - -"sentence-case@npm:^3.0.4": - version: 3.0.4 - resolution: "sentence-case@npm:3.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - upper-case-first: ^2.0.2 - checksum: 3cfe6c0143e649132365695706702d7f729f484fa7b25f43435876efe7af2478243eefb052bacbcce10babf9319fd6b5b6bc59b94c80a1c819bcbb40651465d5 - languageName: node - linkType: hard - "seq-queue@npm:^0.0.5": version: 0.0.5 resolution: "seq-queue@npm:0.0.5" @@ -43191,7 +38300,7 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.4, setimmediate@npm:^1.0.5": +"setimmediate@npm:^1.0.4": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd @@ -43289,13 +38398,6 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b - languageName: node - linkType: hard - "shelljs@npm:0.8.5": version: 0.8.5 resolution: "shelljs@npm:0.8.5" @@ -43370,13 +38472,6 @@ __metadata: languageName: node linkType: hard -"signedsource@npm:^1.0.0": - version: 1.0.0 - resolution: "signedsource@npm:1.0.0" - checksum: 64b2c8d7a48de9009cfd3aff62bb7c88abf3b8e0421f17ebb1d7f5ca9cc9c3ad10f5a1e3ae6cd804e4e6121c87b668202ae9057065f058ddfbf34ea65f63945d - languageName: node - linkType: hard - "simple-concat@npm:^1.0.0": version: 1.0.1 resolution: "simple-concat@npm:1.0.1" @@ -43534,25 +38629,6 @@ __metadata: languageName: node linkType: hard -"snake-case@npm:^2.1.0": - version: 2.1.0 - resolution: "snake-case@npm:2.1.0" - dependencies: - no-case: ^2.2.0 - checksum: 7e42b4841103be4dd050b2f57f5cb423d5164524c1cb3d81efda9809265a82a2d02ddf44361beae37d75a239308e6414be85fe441dc48cd70c708cb975387d10 - languageName: node - linkType: hard - -"snake-case@npm:^3.0.4": - version: 3.0.4 - resolution: "snake-case@npm:3.0.4" - dependencies: - dot-case: ^3.0.4 - tslib: ^2.0.3 - checksum: 0a7a79900bbb36f8aaa922cf111702a3647ac6165736d5dc96d3ef367efc50465cac70c53cd172c382b022dac72ec91710608e5393de71f76d7142e6fd80e8a3 - languageName: node - linkType: hard - "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -43685,13 +38761,6 @@ __metadata: languageName: node linkType: hard -"space-separated-tokens@npm:^2.0.0": - version: 2.0.2 - resolution: "space-separated-tokens@npm:2.0.2" - checksum: 202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 - languageName: node - linkType: hard - "spacetime@npm:^7.1.4": version: 7.1.4 resolution: "spacetime@npm:7.1.4" @@ -43708,13 +38777,6 @@ __metadata: languageName: node linkType: hard -"spawn-command@npm:^0.0.2-1": - version: 0.0.2 - resolution: "spawn-command@npm:0.0.2" - checksum: e35c5d28177b4d461d33c88cc11f6f3a5079e2b132c11e1746453bbb7a0c0b8a634f07541a2a234fa4758239d88203b758def509161b651e81958894c0b4b64b - languageName: node - linkType: hard - "spawndamnit@npm:^2.0.0": version: 2.0.0 resolution: "spawndamnit@npm:2.0.0" @@ -43791,15 +38853,6 @@ __metadata: languageName: node linkType: hard -"sponge-case@npm:^1.0.1": - version: 1.0.1 - resolution: "sponge-case@npm:1.0.1" - dependencies: - tslib: ^2.0.3 - checksum: 64f53d930f63c5a9e59d4cae487c1ffa87d25eab682833b01d572cc885e7e3fdbad4f03409a41f03ecb27f1f8959432253eb48332c7007c3388efddb24ba2792 - languageName: node - linkType: hard - "sprintf-js@npm:^1.1.2": version: 1.1.2 resolution: "sprintf-js@npm:1.1.2" @@ -44157,13 +39210,6 @@ __metadata: languageName: node linkType: hard -"string-env-interpolation@npm:^1.0.1": - version: 1.0.1 - resolution: "string-env-interpolation@npm:1.0.1" - checksum: d126329587f635bee65300e4451e7352b9b67e03daeb62f006ca84244cac12a1f6e45176b018653ba0c3ec3b5d980f9ca59d2eeed99cf799501cdaa7f871dc6f - languageName: node - linkType: hard - "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -44192,17 +39238,6 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.1, string-width@npm:^1.0.2": - version: 1.0.2 - resolution: "string-width@npm:1.0.2" - dependencies: - code-point-at: ^1.0.0 - is-fullwidth-code-point: ^1.0.0 - strip-ansi: ^3.0.0 - checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e - languageName: node - linkType: hard - "string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" @@ -44415,16 +39450,6 @@ __metadata: languageName: node linkType: hard -"stringify-entities@npm:^4.0.0": - version: 4.0.4 - resolution: "stringify-entities@npm:4.0.4" - dependencies: - character-entities-html4: ^2.0.0 - character-entities-legacy: ^3.0.0 - checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 - languageName: node - linkType: hard - "stringify-object@npm:^3.3.0": version: 3.3.0 resolution: "stringify-object@npm:3.3.0" @@ -44445,7 +39470,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": +"strip-ansi@npm:^3.0.0": version: 3.0.1 resolution: "strip-ansi@npm:3.0.1" dependencies: @@ -44479,15 +39504,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-bom@npm:2.0.0" - dependencies: - is-utf8: ^0.2.0 - checksum: 08efb746bc67b10814cd03d79eb31bac633393a782e3f35efbc1b61b5165d3806d03332a97f362822cf0d4dd14ba2e12707fcff44fe1c870c48a063a0c9e4944 - languageName: node - linkType: hard - "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -44610,15 +39626,6 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:^1.0.0": - version: 1.0.7 - resolution: "style-to-object@npm:1.0.7" - dependencies: - inline-style-parser: 0.2.3 - checksum: a399ab95aca9b57f9ce3883157d08289cb86e9f03c742ff1ee810440200da750829dd0c22f91890ae2e01e4940fb1338dea1b69da1ed120623fe392e7336cffa - languageName: node - linkType: hard - "styled-jsx@npm:5.1.1": version: 5.1.1 resolution: "styled-jsx@npm:5.1.1" @@ -44713,15 +39720,6 @@ __metadata: languageName: node linkType: hard -"superjson@npm:^1.9.1": - version: 1.13.3 - resolution: "superjson@npm:1.13.3" - dependencies: - copy-anything: ^3.0.2 - checksum: f5aeb010f24163cb871a4bc402d9164112201c059afc247a75b03131c274aea6eec9cf08be9e4a9465fe4961689009a011584528531d52f7cc91c077e07e5c75 - languageName: node - linkType: hard - "supertest@npm:^6.3.3": version: 6.3.4 resolution: "supertest@npm:6.3.4" @@ -44757,7 +39755,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -44940,15 +39938,6 @@ __metadata: languageName: node linkType: hard -"swap-case@npm:^2.0.2": - version: 2.0.2 - resolution: "swap-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 6e21c9e1b3cd5735eb2af679a99ec3efc78a14e3d4d5e3fd594e254b91cfd37185b3d1c6e41b22f53a2cdf5d1b963ce30c0fe8b78337e3fd43d0137084670a5f - languageName: node - linkType: hard - "swc-loader@npm:^0.2.3": version: 0.2.3 resolution: "swc-loader@npm:0.2.3" @@ -44959,15 +39948,6 @@ __metadata: languageName: node linkType: hard -"swr@npm:^1.2.2": - version: 1.3.0 - resolution: "swr@npm:1.3.0" - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 - checksum: e7a184f0d560e9c8be85c023cc8e65e56a88a6ed46f9394b301b07f838edca23d2e303685319a4fcd620b81d447a7bcb489c7fa0a752c259f91764903c690cdb - languageName: node - linkType: hard - "symbol-observable@npm:4.0.0": version: 4.0.0 resolution: "symbol-observable@npm:4.0.0" @@ -45558,34 +40538,6 @@ __metadata: languageName: node linkType: hard -"title-case@npm:^2.1.0": - version: 2.1.1 - resolution: "title-case@npm:2.1.1" - dependencies: - no-case: ^2.2.0 - upper-case: ^1.0.3 - checksum: e88ddfc4608a7fb18ed440139d9c42a5f8a50f916e07062be2aef5e2038720746ed51c4fdf9e7190d24a8cc10e6dec9773027fc44450b3a4a5e5c49b4a931fb1 - languageName: node - linkType: hard - -"title-case@npm:^3.0.3": - version: 3.0.3 - resolution: "title-case@npm:3.0.3" - dependencies: - tslib: ^2.0.3 - checksum: e8b7ea006b53cf3208d278455d9f1e22c409459d7f9878da324fa3b18cc0aef8560924c19c744e870394a5d9cddfdbe029ebae9875909ee7f4fc562e7cbfc53e - languageName: node - linkType: hard - -"tmp-promise@npm:^3.0.3": - version: 3.0.3 - resolution: "tmp-promise@npm:3.0.3" - dependencies: - tmp: ^0.2.0 - checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c - languageName: node - linkType: hard - "tmp@npm:0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" @@ -45604,13 +40556,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.0": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 - languageName: node - linkType: hard - "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -45728,7 +40673,7 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": +"tree-kill@npm:1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -45737,13 +40682,6 @@ __metadata: languageName: node linkType: hard -"trim-lines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-lines@npm:3.0.1" - checksum: e241da104682a0e0d807222cc1496b92e716af4db7a002f4aeff33ae6a0024fef93165d49eab11aa07c71e1347c42d46563f91dfaa4d3fb945aa535cdead53ed - languageName: node - linkType: hard - "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" @@ -45758,13 +40696,6 @@ __metadata: languageName: node linkType: hard -"trough@npm:^2.0.0": - version: 2.2.0 - resolution: "trough@npm:2.2.0" - checksum: 6097df63169aca1f9b08c263b1b501a9b878387f46e161dde93f6d0bba7febba93c95f876a293c5ea370f6cb03bcb687b2488c8955c3cfb66c2c0161ea8c00f6 - languageName: node - linkType: hard - "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" @@ -45901,13 +40832,6 @@ __metadata: languageName: node linkType: hard -"ts-log@npm:^2.2.3": - version: 2.2.5 - resolution: "ts-log@npm:2.2.5" - checksum: 28f78ab15b8555d56c089dbc243327d8ce4331219956242a29fc4cb3bad6bb0cb8234dd17a292381a1b1dba99a7e4849a2181b2e1a303e8247e9f4ca4e284f2d - languageName: node - linkType: hard - "ts-morph@npm:^13.0.2": version: 13.0.3 resolution: "ts-morph@npm:13.0.3" @@ -46115,20 +41039,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.1, tslib@npm:^2.6.2, tslib@npm:^2.6.3": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 - languageName: node - linkType: hard - -"tslib@npm:~2.6.0": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 - languageName: node - linkType: hard - "tslog@npm:^4.9.2": version: 4.9.2 resolution: "tslog@npm:4.9.2" @@ -46267,13 +41177,6 @@ __metadata: languageName: node linkType: hard -"tween-functions@npm:^1.2.0": - version: 1.2.0 - resolution: "tween-functions@npm:1.2.0" - checksum: 880708d680eff5c347ddcb9f922ad121703a91c78ce308ed309073e73a794b633eb0b80589a839365803f150515ad34c9646809ae8a0e90f09e62686eefb1ab6 - languageName: node - linkType: hard - "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -46281,25 +41184,6 @@ __metadata: languageName: node linkType: hard -"twemoji-parser@npm:13.1.0": - version: 13.1.0 - resolution: "twemoji-parser@npm:13.1.0" - checksum: 8046ce003c03dd92d68c2648cfbfa39c659fca4f05c10da8d14957985dc3c0c680f3ecf2de8245dc1ddffedc5b2a675f2032053e1e77cc7474301a88fe192ad3 - languageName: node - linkType: hard - -"twemoji@npm:^13.0.1": - version: 13.1.1 - resolution: "twemoji@npm:13.1.1" - dependencies: - fs-extra: ^8.0.1 - jsonfile: ^5.0.0 - twemoji-parser: 13.1.0 - universalify: ^0.1.2 - checksum: f60a8785ad6eb1a673c4f1bccb00a852ead13639db9f763c0e3e9dee6e3e67d88f1d2b481bcee34c35570ab060918b30b6ee68aa65ea1042ad35cd83212a102a - languageName: node - linkType: hard - "twilio@npm:^3.80.1": version: 3.80.1 resolution: "twilio@npm:3.80.1" @@ -46712,13 +41596,6 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.33, ua-parser-js@npm:^1.0.35": - version: 1.0.38 - resolution: "ua-parser-js@npm:1.0.38" - checksum: d0772b22b027338d806ab17d1ac2896ee7485bdf9217c526028159f3cd6bb10272bb18f6196d2f94dde83e3b36dc9d2533daf08a414764f6f4f1844842383838 - languageName: node - linkType: hard - "uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": version: 1.0.6 resolution: "uc.micro@npm:1.0.6" @@ -46782,14 +41659,7 @@ __metadata: languageName: node linkType: hard -"unc-path-regex@npm:^0.1.2": - version: 0.1.2 - resolution: "unc-path-regex@npm:0.1.2" - checksum: a05fa2006bf4606051c10fc7968f08ce7b28fa646befafa282813aeb1ac1a56f65cb1b577ca7851af2726198d59475bb49b11776036257b843eaacee2860a4ec - languageName: node - linkType: hard - -"undici@npm:^5.12.0, undici@npm:^5.28.2": +"undici@npm:^5.28.2": version: 5.28.4 resolution: "undici@npm:5.28.4" dependencies: @@ -46846,36 +41716,6 @@ __metadata: languageName: node linkType: hard -"unified@npm:^10.0.0": - version: 10.1.2 - resolution: "unified@npm:10.1.2" - dependencies: - "@types/unist": ^2.0.0 - bail: ^2.0.0 - extend: ^3.0.0 - is-buffer: ^2.0.0 - is-plain-obj: ^4.0.0 - trough: ^2.0.0 - vfile: ^5.0.0 - checksum: 053e7c65ede644607f87bd625a299e4b709869d2f76ec8138569e6e886903b6988b21cd9699e471eda42bee189527be0a9dac05936f1d069a5e65d0125d5d756 - languageName: node - linkType: hard - -"unified@npm:^11.0.0": - version: 11.0.5 - resolution: "unified@npm:11.0.5" - dependencies: - "@types/unist": ^3.0.0 - bail: ^2.0.0 - devlop: ^1.0.0 - extend: ^3.0.0 - is-plain-obj: ^4.0.0 - trough: ^2.0.0 - vfile: ^6.0.0 - checksum: b3bf7fd6f568cc261e074dae21188483b0f2a8ab858d62e6e85b75b96cc655f59532906ae3c64d56a9b257408722d71f1d4135292b3d7ee02907c8b592fb3cf0 - languageName: node - linkType: hard - "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -46912,22 +41752,6 @@ __metadata: languageName: node linkType: hard -"unist-builder@npm:^3.0.0": - version: 3.0.1 - resolution: "unist-builder@npm:3.0.1" - dependencies: - "@types/unist": ^2.0.0 - checksum: d8c42fe69aa55a3e9aed3c581007ec5371349bf9885bfa8b0b787634f8d12fa5081f066b205ded379b6d0aeaa884039bae9ebb65a3e71784005fb110aef30d0f - languageName: node - linkType: hard - -"unist-util-generated@npm:^2.0.0": - version: 2.0.1 - resolution: "unist-util-generated@npm:2.0.1" - checksum: 6221ad0571dcc9c8964d6b054f39ef6571ed59cc0ce3e88ae97ea1c70afe76b46412a5ffaa91f96814644ac8477e23fb1b477d71f8d70e625728c5258f5c0d99 - languageName: node - linkType: hard - "unist-util-is@npm:^4.0.0": version: 4.1.0 resolution: "unist-util-is@npm:4.1.0" @@ -46935,60 +41759,6 @@ __metadata: languageName: node linkType: hard -"unist-util-is@npm:^5.0.0": - version: 5.2.1 - resolution: "unist-util-is@npm:5.2.1" - dependencies: - "@types/unist": ^2.0.0 - checksum: ae76fdc3d35352cd92f1bedc3a0d407c3b9c42599a52ab9141fe89bdd786b51f0ec5a2ab68b93fb532e239457cae62f7e39eaa80229e1cb94875da2eafcbe5c4 - languageName: node - linkType: hard - -"unist-util-is@npm:^6.0.0": - version: 6.0.0 - resolution: "unist-util-is@npm:6.0.0" - dependencies: - "@types/unist": ^3.0.0 - checksum: f630a925126594af9993b091cf807b86811371e465b5049a6283e08537d3e6ba0f7e248e1e7dab52cfe33f9002606acef093441137181b327f6fe504884b20e2 - languageName: node - linkType: hard - -"unist-util-position@npm:^4.0.0": - version: 4.0.4 - resolution: "unist-util-position@npm:4.0.4" - dependencies: - "@types/unist": ^2.0.0 - checksum: e7487b6cec9365299695e3379ded270a1717074fa11fd2407c9b934fb08db6fe1d9077ddeaf877ecf1813665f8ccded5171693d3d9a7a01a125ec5cdd5e88691 - languageName: node - linkType: hard - -"unist-util-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-position@npm:5.0.0" - dependencies: - "@types/unist": ^3.0.0 - checksum: f89b27989b19f07878de9579cd8db2aa0194c8360db69e2c99bd2124a480d79c08f04b73a64daf01a8fb3af7cba65ff4b45a0b978ca243226084ad5f5d441dde - languageName: node - linkType: hard - -"unist-util-stringify-position@npm:^3.0.0": - version: 3.0.3 - resolution: "unist-util-stringify-position@npm:3.0.3" - dependencies: - "@types/unist": ^2.0.0 - checksum: dbd66c15183607ca942a2b1b7a9f6a5996f91c0d30cf8966fb88955a02349d9eefd3974e9010ee67e71175d784c5a9fea915b0aa0b0df99dcb921b95c4c9e124 - languageName: node - linkType: hard - -"unist-util-stringify-position@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-stringify-position@npm:4.0.0" - dependencies: - "@types/unist": ^3.0.0 - checksum: e2e7aee4b92ddb64d314b4ac89eef7a46e4c829cbd3ee4aee516d100772b490eb6b4974f653ba0717a0071ca6ea0770bf22b0a2ea62c65fcba1d071285e96324 - languageName: node - linkType: hard - "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -46999,26 +41769,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit-parents@npm:^5.1.1": - version: 5.1.3 - resolution: "unist-util-visit-parents@npm:5.1.3" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^5.0.0 - checksum: 8ecada5978994f846b64658cf13b4092cd78dea39e1ba2f5090a5de842ba4852712c02351a8ae95250c64f864635e7b02aedf3b4a093552bb30cf1bd160efbaa - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^6.0.0": - version: 6.0.1 - resolution: "unist-util-visit-parents@npm:6.0.1" - dependencies: - "@types/unist": ^3.0.0 - unist-util-is: ^6.0.0 - checksum: 08927647c579f63b91aafcbec9966dc4a7d0af1e5e26fc69f4e3e6a01215084835a2321b06f3cbe7bf7914a852830fc1439f0fc3d7153d8804ac3ef851ddfa20 - languageName: node - linkType: hard - "unist-util-visit@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-visit@npm:2.0.3" @@ -47030,35 +41780,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit@npm:^4.0.0": - version: 4.1.2 - resolution: "unist-util-visit@npm:4.1.2" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^5.0.0 - unist-util-visit-parents: ^5.1.1 - checksum: 95a34e3f7b5b2d4b68fd722b6229972099eb97b6df18913eda44a5c11df8b1e27efe7206dd7b88c4ed244a48c474a5b2e2629ab79558ff9eb936840295549cee - languageName: node - linkType: hard - -"unist-util-visit@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-visit@npm:5.0.0" - dependencies: - "@types/unist": ^3.0.0 - unist-util-is: ^6.0.0 - unist-util-visit-parents: ^6.0.0 - checksum: 9ec42e618e7e5d0202f3c191cd30791b51641285732767ee2e6bcd035931032e3c1b29093f4d7fd0c79175bbc1f26f24f26ee49770d32be76f8730a652a857e6 - languageName: node - linkType: hard - -"universal-base64@npm:^2.1.0": - version: 2.1.0 - resolution: "universal-base64@npm:2.1.0" - checksum: 03bc6f7de04aee83038c26038cd2639f470fd9665f99b3613934c4ccde5d59047d45e34ea4c843ac582da83ea1b050bf8defba8eb390e566f0be314646ddbc9b - languageName: node - linkType: hard - "universal-user-agent@npm:^6.0.0": version: 6.0.1 resolution: "universal-user-agent@npm:6.0.1" @@ -47066,7 +41787,7 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0, universalify@npm:^0.1.2": +"universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff @@ -47087,15 +41808,6 @@ __metadata: languageName: node linkType: hard -"unixify@npm:^1.0.0": - version: 1.0.0 - resolution: "unixify@npm:1.0.0" - dependencies: - normalize-path: ^2.1.1 - checksum: 3be30e48579fc6c7390bd59b4ab9e745fede0c164dfb7351cf710bd1dbef8484b1441186205af6bcb13b731c0c88caf9b33459f7bf8c89e79c046e656ae433f0 - languageName: node - linkType: hard - "unload@npm:2.2.0": version: 2.2.0 resolution: "unload@npm:2.2.0" @@ -47186,20 +41898,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" - dependencies: - escalade: ^3.1.2 - picocolors: ^1.0.1 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562 - languageName: node - linkType: hard - "update-input-width@npm:^1.2.2": version: 1.4.2 resolution: "update-input-width@npm:1.4.2" @@ -47227,7 +41925,7 @@ __metadata: languageName: node linkType: hard -"upper-case-first@npm:^1.1.0, upper-case-first@npm:^1.1.2": +"upper-case-first@npm:^1.1.0": version: 1.1.2 resolution: "upper-case-first@npm:1.1.2" dependencies: @@ -47236,31 +41934,13 @@ __metadata: languageName: node linkType: hard -"upper-case-first@npm:^2.0.2": - version: 2.0.2 - resolution: "upper-case-first@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 4487db4701effe3b54ced4b3e4aa4d9ab06c548f97244d04aafb642eedf96a76d5a03cf5f38f10f415531d5792d1ac6e1b50f2a76984dc6964ad530f12876409 - languageName: node - linkType: hard - -"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1, upper-case@npm:^1.1.3": +"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1": version: 1.1.3 resolution: "upper-case@npm:1.1.3" checksum: 991c845de75fa56e5ad983f15e58494dd77b77cadd79d273cc11e8da400067e9881ae1a52b312aed79b3d754496e2e0712e08d22eae799e35c7f9ba6f3d8a85d languageName: node linkType: hard -"upper-case@npm:^2.0.2": - version: 2.0.2 - resolution: "upper-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 508723a2b03ab90cf1d6b7e0397513980fab821cbe79c87341d0e96cedefadf0d85f9d71eac24ab23f526a041d585a575cfca120a9f920e44eb4f8a7cf89121c - languageName: node - linkType: hard - "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -47314,20 +41994,6 @@ __metadata: languageName: node linkType: hard -"urlpattern-polyfill@npm:^10.0.0": - version: 10.0.0 - resolution: "urlpattern-polyfill@npm:10.0.0" - checksum: 61d890f151ea4ecf34a3dcab32c65ad1f3cda857c9d154af198260c6e5b2ad96d024593409baaa6d4428dd1ab206c14799bf37fe011117ac93a6a44913ac5aa4 - languageName: node - linkType: hard - -"urlpattern-polyfill@npm:^8.0.0": - version: 8.0.2 - resolution: "urlpattern-polyfill@npm:8.0.2" - checksum: d2cc0905a613c77e330c426e8697ee522dd9640eda79ac51160a0f6350e103f09b8c327623880989f8ba7325e8d95267b745aa280fdcc2aead80b023e16bd09d - languageName: node - linkType: hard - "use-callback-ref@npm:^1.2.3": version: 1.2.5 resolution: "use-callback-ref@npm:1.2.5" @@ -47356,18 +42022,6 @@ __metadata: languageName: node linkType: hard -"use-deep-compare-effect@npm:^1.6.1": - version: 1.8.1 - resolution: "use-deep-compare-effect@npm:1.8.1" - dependencies: - "@babel/runtime": ^7.12.5 - dequal: ^2.0.2 - peerDependencies: - react: ">=16.13" - checksum: 2b9b6291df3f772f44d259b352e5d998963ccee0db2efeb76bb05525d928064aeeb69bb0dee5a5e428fea7cf3db67c097a770ebd30caa080662b565f6ef02b2e - languageName: node - linkType: hard - "use-isomorphic-layout-effect@npm:^1.1.2": version: 1.1.2 resolution: "use-isomorphic-layout-effect@npm:1.1.2" @@ -47429,15 +42083,6 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.2.0": - version: 1.2.2 - resolution: "use-sync-external-store@npm:1.2.2" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 - languageName: node - linkType: hard - "utif@npm:^2.0.1": version: 2.0.1 resolution: "utif@npm:2.0.1" @@ -47517,20 +42162,6 @@ __metadata: languageName: node linkType: hard -"uvu@npm:^0.5.0": - version: 0.5.6 - resolution: "uvu@npm:0.5.6" - dependencies: - dequal: ^2.0.0 - diff: ^5.0.0 - kleur: ^4.0.3 - sade: ^1.7.3 - bin: - uvu: bin.js - checksum: 09460a37975627de9fcad396e5078fb844d01aaf64a6399ebfcfd9e55f1c2037539b47611e8631f89be07656962af0cf48c334993db82b9ae9c3d25ce3862168 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -47566,13 +42197,6 @@ __metadata: languageName: node linkType: hard -"value-or-promise@npm:^1.0.11, value-or-promise@npm:^1.0.12": - version: 1.0.12 - resolution: "value-or-promise@npm:1.0.12" - checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 - languageName: node - linkType: hard - "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -47591,58 +42215,6 @@ __metadata: languageName: node linkType: hard -"vfile-location@npm:^4.0.0": - version: 4.1.0 - resolution: "vfile-location@npm:4.1.0" - dependencies: - "@types/unist": ^2.0.0 - vfile: ^5.0.0 - checksum: c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 - languageName: node - linkType: hard - -"vfile-message@npm:^3.0.0": - version: 3.1.4 - resolution: "vfile-message@npm:3.1.4" - dependencies: - "@types/unist": ^2.0.0 - unist-util-stringify-position: ^3.0.0 - checksum: d0ee7da1973ad76513c274e7912adbed4d08d180eaa34e6bd40bc82459f4b7bc50fcaff41556135e3339995575eac5f6f709aba9332b80f775618ea4880a1367 - languageName: node - linkType: hard - -"vfile-message@npm:^4.0.0": - version: 4.0.2 - resolution: "vfile-message@npm:4.0.2" - dependencies: - "@types/unist": ^3.0.0 - unist-util-stringify-position: ^4.0.0 - checksum: 964e7e119f4c0e0270fc269119c41c96da20afa01acb7c9809a88365c8e0c64aa692fafbd952669382b978002ecd7ad31ef4446d85e8a22cdb62f6df20186c2d - languageName: node - linkType: hard - -"vfile@npm:^5.0.0": - version: 5.3.7 - resolution: "vfile@npm:5.3.7" - dependencies: - "@types/unist": ^2.0.0 - is-buffer: ^2.0.0 - unist-util-stringify-position: ^3.0.0 - vfile-message: ^3.0.0 - checksum: 642cce703afc186dbe7cabf698dc954c70146e853491086f5da39e1ce850676fc96b169fcf7898aa3ff245e9313aeec40da93acd1e1fcc0c146dc4f6308b4ef9 - languageName: node - linkType: hard - -"vfile@npm:^6.0.0": - version: 6.0.3 - resolution: "vfile@npm:6.0.3" - dependencies: - "@types/unist": ^3.0.0 - vfile-message: ^4.0.0 - checksum: 152b6729be1af70df723efb65c1a1170fd483d41086557da3651eea69a1dd1f0c22ea4344834d56d30734b9185bcab63e22edc81d3f0e9bed8aa4660d61080af - languageName: node - linkType: hard - "victory-vendor@npm:^36.6.8": version: 36.9.2 resolution: "victory-vendor@npm:36.9.2" @@ -47995,21 +42567,6 @@ __metadata: languageName: node linkType: hard -"wait-on@npm:^7.0.1": - version: 7.2.0 - resolution: "wait-on@npm:7.2.0" - dependencies: - axios: ^1.6.1 - joi: ^17.11.0 - lodash: ^4.17.21 - minimist: ^1.2.8 - rxjs: ^7.8.1 - bin: - wait-on: bin/wait-on - checksum: 69ec1432bb4479363fdd71f2f3f501a98aa356a562781108a4a89ef8fdf1e3d5fd0c2fd56c4cc5902abbb662065f1f22d4e436a1e6fc9331ce8b575eb023325e - languageName: node - linkType: hard - "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -48019,15 +42576,6 @@ __metadata: languageName: node linkType: hard -"warning@npm:^4.0.3": - version: 4.0.3 - resolution: "warning@npm:4.0.3" - dependencies: - loose-envify: ^1.0.0 - checksum: 4f2cb6a9575e4faf71ddad9ad1ae7a00d0a75d24521c193fa464f30e6b04027bd97aa5d9546b0e13d3a150ab402eda216d59c1d0f2d6ca60124d96cd40dfa35c - languageName: node - linkType: hard - "watchpack@npm:2.4.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" @@ -48064,13 +42612,6 @@ __metadata: languageName: node linkType: hard -"web-namespaces@npm:^2.0.0": - version: 2.0.1 - resolution: "web-namespaces@npm:2.0.1" - checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 - languageName: node - linkType: hard - "web-push@npm:^3.6.7": version: 3.6.7 resolution: "web-push@npm:3.6.7" @@ -48093,33 +42634,13 @@ __metadata: languageName: node linkType: hard -"web-streams-polyfill@npm:4.0.0-beta.3": - version: 4.0.0-beta.3 - resolution: "web-streams-polyfill@npm:4.0.0-beta.3" - checksum: dfec1fbf52b9140e4183a941e380487b6c3d5d3838dd1259be81506c1c9f2abfcf5aeb670aeeecfd9dff4271a6d8fef931b193c7bedfb42542a3b05ff36c0d16 - languageName: node - linkType: hard - -"web-streams-polyfill@npm:^3.0.3, web-streams-polyfill@npm:^3.2.0, web-streams-polyfill@npm:^3.2.1": +"web-streams-polyfill@npm:^3.0.3": version: 3.3.3 resolution: "web-streams-polyfill@npm:3.3.3" checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb languageName: node linkType: hard -"webcrypto-core@npm:^1.8.0": - version: 1.8.0 - resolution: "webcrypto-core@npm:1.8.0" - dependencies: - "@peculiar/asn1-schema": ^2.3.8 - "@peculiar/json-schema": ^1.1.12 - asn1js: ^3.0.1 - pvtsutils: ^1.3.5 - tslib: ^2.6.2 - checksum: 4f128f5283b258eda34844ee804b7d4f102b151a7cb3ae5e722309ea7d37db704184c726afb67bf53cc9eb41279379b24626270b6f4ff08ec5be6b420ff70f18 - languageName: node - linkType: hard - "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -48400,13 +42921,6 @@ __metadata: languageName: node linkType: hard -"which-module@npm:^1.0.0": - version: 1.0.0 - resolution: "which-module@npm:1.0.0" - checksum: 98434f7deb36350cb543c1f15612188541737e1f12d39b23b1c371dff5cf4aa4746210f2bdec202d5fe9da8682adaf8e3f7c44c520687d30948cfc59d5534edb - languageName: node - linkType: hard - "which-module@npm:^2.0.0": version: 2.0.1 resolution: "which-module@npm:2.0.1" @@ -48518,15 +43032,6 @@ __metadata: languageName: node linkType: hard -"window-size@npm:^0.2.0": - version: 0.2.0 - resolution: "window-size@npm:0.2.0" - bin: - window-size: cli.js - checksum: a85e2acf156cfa194301294809867bdadd8a48ee5d972d9fa8e3e1b3420a1d0201b13ac8eb0348a0d14bbf2c3316565b6a749749c2384c5d286caf8a064c4f90 - languageName: node - linkType: hard - "windows-release@npm:^5.0.1": version: 5.1.1 resolution: "windows-release@npm:5.1.1" @@ -48591,16 +43096,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^2.0.0": - version: 2.1.0 - resolution: "wrap-ansi@npm:2.1.0" - dependencies: - string-width: ^1.0.1 - strip-ansi: ^3.0.1 - checksum: 2dacd4b3636f7a53ee13d4d0fe7fa2ed9ad81e9967e17231924ea88a286ec4619a78288de8d41881ee483f4449ab2c0287cde8154ba1bd0126c10271101b2ee3 - languageName: node - linkType: hard - "wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -48687,21 +43182,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.12.0, ws@npm:^8.17.1": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 - languageName: node - linkType: hard - "ws@npm:^8.13.0, ws@npm:^8.2.3": version: 8.16.0 resolution: "ws@npm:8.16.0" @@ -48792,7 +43272,7 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:0.6.2, xml2js@npm:^0.6.0": +"xml2js@npm:0.6.2": version: 0.6.2 resolution: "xml2js@npm:0.6.2" dependencies: @@ -48901,13 +43381,6 @@ __metadata: languageName: node linkType: hard -"y18n@npm:^3.2.1": - version: 3.2.2 - resolution: "y18n@npm:3.2.2" - checksum: 6154fd7544f8bbf5b18cdf77692ed88d389be49c87238ecb4e0d6a5276446cd2a5c29cc4bdbdddfc7e4e498b08df9d7e38df4a1453cf75eecfead392246ea74a - languageName: node - linkType: hard - "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -48943,13 +43416,6 @@ __metadata: languageName: node linkType: hard -"yaml-ast-parser@npm:^0.0.43": - version: 0.0.43 - resolution: "yaml-ast-parser@npm:0.0.43" - checksum: fb5df4c067b6ccbd00953a46faf6ff27f0e290d623c712dc41f330251118f110e22cfd184bbff498bd969cbcda3cd27e0f9d0adb9e6d90eb60ccafc0d8e28077 - languageName: node - linkType: hard - "yaml@npm:2.0.0-1": version: 2.0.0-1 resolution: "yaml@npm:2.0.0-1" @@ -48971,15 +43437,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.3.1": - version: 2.5.0 - resolution: "yaml@npm:2.5.0" - bin: - yaml: bin.mjs - checksum: a116dca5c61641d9bf1f1016c6e71daeb1ed4915f5930ed237d45ab7a605aa5d92c332ff64879a6cd088cabede008c778774e3060ffeb4cd617d28088e4b2d83 - languageName: node - linkType: hard - "yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -49004,16 +43461,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^3.2.0": - version: 3.2.0 - resolution: "yargs-parser@npm:3.2.0" - dependencies: - camelcase: ^3.0.0 - lodash.assign: ^4.1.0 - checksum: d86fd69816a28a617f4cad21f7bfe7f7c931b16d063c73449cd914db409b8d5981a0f29f9e2a05014a7229164aa47336adf5a8856fa9870ab892346d29138e9a - languageName: node - linkType: hard - "yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -49048,7 +43495,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.1, yargs@npm:^17.7.2": +"yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -49063,28 +43510,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^5.0.0": - version: 5.0.0 - resolution: "yargs@npm:5.0.0" - dependencies: - cliui: ^3.2.0 - decamelize: ^1.1.1 - get-caller-file: ^1.0.1 - lodash.assign: ^4.2.0 - os-locale: ^1.4.0 - read-pkg-up: ^1.0.1 - require-directory: ^2.1.1 - require-main-filename: ^1.0.1 - set-blocking: ^2.0.0 - string-width: ^1.0.2 - which-module: ^1.0.0 - window-size: ^0.2.0 - y18n: ^3.2.1 - yargs-parser: ^3.2.0 - checksum: 478e9c8562c5cf5b9c2efc7c917e0b00c489cc50153d5d911ab68767c2cfddaf0b5bd4e04d6fefc00cb1d8f6263eab1d73df79a24d650ba95f5d45c819a1585a - languageName: node - linkType: hard - "yarn@npm:^1.22.18": version: 1.22.19 resolution: "yarn@npm:1.22.19" @@ -49271,10 +43696,3 @@ __metadata: checksum: 160052a7faaefbaad1071e890a06e5d7a04f6ff6985def30a7b4471f4ddbdd1d30bb05b3688a2777cd0b717d1f0d98dad24883a5caa3deeb3afb4d83b6dabc55 languageName: node linkType: hard - -"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": - version: 2.0.4 - resolution: "zwitch@npm:2.0.4" - checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 - languageName: node - linkType: hard From 18a144db220a29f82373e0eb314a831ba8b02ade Mon Sep 17 00:00:00 2001 From: Hariom Date: Sun, 15 Sep 2024 14:21:19 +0530 Subject: [PATCH 03/61] new route --- TODO.md | 12 +- .../organizations/domain-wide-delegation.tsx | 24 ++ .../DomainWideDelegationList.tsx | 255 ++++++++++++++++++ .../settings/layouts/SettingsLayout.tsx | 4 + packages/prisma/schema.prisma | 44 ++- 5 files changed, 330 insertions(+), 9 deletions(-) create mode 100644 apps/web/pages/settings/organizations/domain-wide-delegation.tsx create mode 100644 packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx diff --git a/TODO.md b/TODO.md index 8b39a3600e0db4..9185cc642ddd82 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,11 @@ - TODO - - Google Meet App to handle Domain wide delegation - - Disable multiple installations of Google Calendar app if Domain wide delegation is enabled(If Domain wide delegation is enabled, should we disable multiple installations of Google Calendar app?) \ No newline at end of file + - [x] Google Meet App to handle Domain wide delegation - Nothing needed here + - [x] Disable multiple installations of Google Calendar app if Domain wide delegation is enabled + - [x] Disabled it for now. In future we should allow it. + - [ ] Where should we show the user the client ID to enable domain wide delegation? + - [ ] It must be shown to the organization owner/admin only + - [ ] There could be multiple checkboxes per domain to enable domain wide delegation for a domain + - [ ] Support multiple domains in DomainWideDelegation schema for an organization + - [ ] Use the domain as well to identify if the domain wide delegation is enabled + - [ ] Automatically mark a DomainWideDelegation to have status as "error" if there is an error during event creation using it. Note that we might not have a fallback to go to but we could inform the admin about it. + \ No newline at end of file diff --git a/apps/web/pages/settings/organizations/domain-wide-delegation.tsx b/apps/web/pages/settings/organizations/domain-wide-delegation.tsx new file mode 100644 index 00000000000000..5f6e076811c2ba --- /dev/null +++ b/apps/web/pages/settings/organizations/domain-wide-delegation.tsx @@ -0,0 +1,24 @@ +import DomainWideDelegationList from "@calcom/features/ee/organizations/pages/settings/domainWideDelegation/domainWideDelegationList"; +import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout"; +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { Meta } from "@calcom/ui"; + +import PageWrapper from "@components/PageWrapper"; + +const Page = () => { + const { t } = useLocale(); + return ( + <> + + + + ); +}; + +Page.getLayout = getLayout; +Page.PageWrapper = PageWrapper; +export default Page; diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx new file mode 100644 index 00000000000000..3644efee3f3b0e --- /dev/null +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx @@ -0,0 +1,255 @@ +import { useState } from "react"; +import { useForm, Controller } from "react-hook-form"; + +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { + Dropdown, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + Button, + Dialog, + DialogContent, + DialogFooter, + Form, + TextField, + SelectField, +} from "@calcom/ui"; + +interface DelegationItemProps { + delegation: { + id: number; + domain: string; + enabled: boolean; + workspacePlatform: { + name: string; + slug: string; + }; + clientId: string; + }; + toggleDelegation: (id: number) => void; + onEdit: (delegation: DelegationItemProps["delegation"]) => void; +} + +function DelegationListItemActions({ + delegation, + toggleDelegation, + onEdit, +}: { + delegation: DelegationItemProps["delegation"]; + toggleDelegation: (id: number) => void; + onEdit: (delegation: DelegationItemProps["delegation"]) => void; +}) { + const { t } = useLocale(); + + return ( + + + + + + + + {/* Add more menu items as needed */} + + + ); +} + +function DelegationListItem({ delegation, toggleDelegation, onEdit }: DelegationItemProps) { + const { t } = useLocale(); + + return ( +
  • +
    +
    + {delegation.domain} + {delegation.workspacePlatform.name} +
    + +
    +
  • + ); +} + +function CreateEditDelegationDialog({ + isOpen, + onClose, + delegation, + onSubmit, +}: { + isOpen: boolean; + onClose: () => void; + delegation: DelegationItemProps["delegation"] | null; + onSubmit: (data: { domain: string; clientId: string; workspacePlatform: string }) => void; +}) { + const { t } = useLocale(); + const form = useForm<{ domain: string; clientId: string; workspacePlatform: string }>({ + defaultValues: { + domain: delegation?.domain || "", + clientId: delegation?.clientId || "", + workspacePlatform: delegation?.workspacePlatform.slug || "", + }, + }); + + // TODO: Use tRPC route + const workspacePlatformOptions = [ + { value: "google", label: "Google" }, + { value: "microsoft", label: "Microsoft" }, + ]; + + return ( + + +
    + + ( + onChange(option?.value)} + value={workspacePlatformOptions.find((opt) => opt.value === value)} + options={workspacePlatformOptions} + /> + )} + /> + + + + + +
    +
    + ); +} + +export default function DomainWideDelegationList() { + const { t } = useLocale(); + // TODO: Use tRPC route + const [delegations, setDelegations] = useState([ + { + id: 1, + domain: "example.com", + enabled: true, + workspacePlatform: { + name: "Google", + slug: "google", + }, + clientId: "123", + }, + ]); + + const toggleDelegation = (id: number) => { + // TODO: Use tRPC route + setDelegations((prevDelegations) => + prevDelegations.map((delegation) => + delegation.id === id ? { ...delegation, enabled: !delegation.enabled } : delegation + ) + ); + }; + + const updateDelegation = (id: number, data: { domain: string; workspacePlatform: string }) => { + // TODO: Use tRPC route + setDelegations((prevDelegations) => + prevDelegations.map((delegation) => + delegation.id === id + ? { + ...delegation, + domain: data.domain, + workspacePlatform: { + name: data.workspacePlatform === "google" ? "Google" : "Microsoft", + slug: data.workspacePlatform, + }, + } + : delegation + ) + ); + }; + + const createDelegation = (data: { domain: string; workspacePlatform: string; clientId: string }) => { + const newDelegation = { + id: Date.now(), // Use a proper ID generation method in production + domain: data.domain, + clientId: data.clientId, + enabled: true, + workspacePlatform: { + name: data.workspacePlatform === "google" ? "Google" : "Microsoft", + slug: data.workspacePlatform, + }, + }; + setDelegations((prevDelegations) => [...prevDelegations, newDelegation]); + }; + + const [createEditDialog, setCreateEditDialog] = useState<{ + isOpen: boolean; + delegation: DelegationItemProps["delegation"] | null; + }>({ + isOpen: false, + delegation: null, + }); + + const onEditClick = (delegation: DelegationItemProps["delegation"]) => { + setCreateEditDialog({ isOpen: true, delegation }); + }; + + const onCreateClick = () => setCreateEditDialog({ isOpen: true, delegation: null }); + + const handleSubmit = (data: { domain: string; workspacePlatform: string }) => { + if (createEditDialog.delegation) { + updateDelegation(createEditDialog.delegation.id, data); + } else { + createDelegation(data); + } + setCreateEditDialog({ isOpen: false, delegation: null }); + }; + + return ( +
    +
      + {delegations.map((delegation) => ( + + ))} +
    + setCreateEditDialog({ isOpen: false, delegation: null })} + delegation={createEditDialog.delegation} + onSubmit={handleSubmit} + /> + +
    + ); +} diff --git a/packages/features/settings/layouts/SettingsLayout.tsx b/packages/features/settings/layouts/SettingsLayout.tsx index 2c73ff3f417440..19400582aa32dd 100644 --- a/packages/features/settings/layouts/SettingsLayout.tsx +++ b/packages/features/settings/layouts/SettingsLayout.tsx @@ -102,6 +102,10 @@ const tabs: VerticalTabItemProps[] = [ name: "admin_api", href: "https://cal.com/docs/enterprise-features/api/api-reference/bookings#admin-access", }, + { + name: "domain_wide_delegation", + href: "/settings/organizations/domain-wide-delegation", + }, ], }, { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 3b58ea87b4831e..c07a54c38b8a91 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1513,19 +1513,49 @@ model AttributeToUser { @@unique([memberId, attributeOptionId]) } -enum WorkspacePlatform { - GOOGLE @map("google") - MICROSOFT @map("microsoft") -} - model DomainWideDelegation { id String @id @default(uuid()) - workspacePlatform WorkspacePlatform + workspacePlatform WorkspacePlatform @relation(fields: [workspacePlatformId], references: [id], onDelete: Cascade) + workspacePlatformId Int + + // Provides possibility to have different service accounts for different organizations if the need arises, but normally they should be the same serviceAccountKey Json + serviceAccountClientId String + enabled Boolean @default(false) organizationId Int organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade) Credential Credential[] + domain String + inErrorState Boolean @default(false) - @@unique([organizationId, workspacePlatform]) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Should be fare to assume that one domain can be only on one workspace platform at a time. So, one can't have two different workspace platforms for the same domain + @@unique([organizationId, domain]) + // Ensures that two different organizations don't control the same domain + @@unique([domain]) } + + +// It is for domain-wide delegation +model WorkspacePlatform { + id Int @id @default(autoincrement()) + slug String + + name String + description String + + defaultServiceAccountKey Json + defaultServiceAccountClientId String + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + enabled Boolean @default(false) + + domainWideDelegations DomainWideDelegation[] + + @@unique([slug]) +} \ No newline at end of file From ddade888fc46a33ab9608670c9e23fadd34906db Mon Sep 17 00:00:00 2001 From: Hariom Date: Tue, 17 Sep 2024 14:13:00 +0530 Subject: [PATCH 04/61] Fixes --- TODO.md | 44 +- .../domain-wide-delegation/page.tsx | 11 + apps/web/components/apps/AppPage.tsx | 4 +- .../settings/admin/domainWideDelegation.tsx | 287 ------------ .../settings/admin/workspace-platforms.tsx | 414 ++++++++++++++++++ .../organizations/domain-wide-delegation.tsx | 8 +- apps/web/public/service-worker.js | 11 +- apps/web/public/static/locales/en/common.json | 17 + packages/app-store/_utils/installation.ts | 2 +- .../app-store/_utils/useAddAppMutation.ts | 2 +- packages/app-store/around/api/_getAdd.ts | 4 +- packages/app-store/closecom/api/_getAdd.ts | 4 +- .../app-store/googlecalendar/_metadata.ts | 3 + packages/app-store/googlecalendar/api/add.ts | 72 ++- .../googlecalendar/lib/CalendarService.ts | 32 +- .../app-store/googlecalendar/package.json | 1 - packages/app-store/ping/api/_getAdd.ts | 4 +- packages/app-store/riverside/api/_getAdd.ts | 4 +- packages/app-store/sendgrid/api/_getAdd.ts | 4 +- packages/app-store/whereby/api/_getAdd.ts | 4 +- packages/core/CalendarManager.ts | 5 + .../pages/settings/domainWideDelegation.tsx | 363 +++++++++++++++ .../DomainWideDelegationList.tsx | 250 ----------- .../settings/layouts/SettingsLayout.tsx | 1 + packages/lib/CalendarAppConfigurationError.ts | 13 + .../server/repository/domainWideDelegation.ts | 166 +++++-- .../lib/server/repository/organization.ts | 45 +- .../server/repository/workspacePlatform.ts | 92 ++++ .../SelectedCalendarsSettingsWebWrapper.tsx | 2 +- packages/prisma/schema.prisma | 39 +- .../server/routers/viewer/admin/_router.ts | 45 ++ .../admin/workspacePlatform/add.handler.ts | 18 + .../admin/workspacePlatform/list.handler.ts | 12 + .../viewer/admin/workspacePlatform/schema.ts | 25 ++ .../toggleEnabled.handler.ts | 20 + .../admin/workspacePlatform/update.handler.ts | 27 ++ .../updateServiceAccount.handler.ts | 26 ++ .../viewer/domainWideDelegation/_router.ts | 34 +- .../domainWideDelegation/add.handler.ts | 64 +++ .../domainWideDelegation/delete.handler.ts | 17 + .../domainWideDelegation.handler.ts | 207 --------- .../domainWideDelegation/list.handler.ts | 35 ++ .../listWorkspacePlatforms.handler.ts | 7 + ...mainWideDelegation.schema.ts => schema.ts} | 2 +- .../domainWideDelegation/update.handler.ts | 57 +++ .../viewer/domainWideDelegation/utils.ts | 62 +++ packages/trpc/server/trpc.ts | 15 +- packages/trpc/tsconfig.json | 3 +- packages/types/App.d.ts | 6 + 49 files changed, 1677 insertions(+), 913 deletions(-) create mode 100644 apps/web/app/future/settings/(settings)/organizations/domain-wide-delegation/page.tsx delete mode 100644 apps/web/pages/settings/admin/domainWideDelegation.tsx create mode 100644 apps/web/pages/settings/admin/workspace-platforms.tsx create mode 100644 packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx delete mode 100644 packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx create mode 100644 packages/lib/CalendarAppConfigurationError.ts create mode 100644 packages/lib/server/repository/workspacePlatform.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/delete.handler.ts delete mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.handler.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/listWorkspacePlatforms.handler.ts rename packages/trpc/server/routers/viewer/domainWideDelegation/{domainWideDelegation.schema.ts => schema.ts} (92%) create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts diff --git a/TODO.md b/TODO.md index 9185cc642ddd82..5fa3ad30de77a4 100644 --- a/TODO.md +++ b/TODO.md @@ -1,11 +1,35 @@ -- TODO - - [x] Google Meet App to handle Domain wide delegation - Nothing needed here - - [x] Disable multiple installations of Google Calendar app if Domain wide delegation is enabled - - [x] Disabled it for now. In future we should allow it. - - [ ] Where should we show the user the client ID to enable domain wide delegation? - - [ ] It must be shown to the organization owner/admin only - - [ ] There could be multiple checkboxes per domain to enable domain wide delegation for a domain - - [ ] Support multiple domains in DomainWideDelegation schema for an organization - - [ ] Use the domain as well to identify if the domain wide delegation is enabled +- Important + - [x] Where should we show the user the client ID to enable domain wide delegation? + - [x] It must be shown to the organization owner/admin only + - [x] There could be multiple checkboxes per domain to enable domain wide delegation for a domain + - [x] Which domain to allow + - Any domain can be added by a user + - [x] Support multiple domains in DomainWideDelegation schema for an organization + - [x] Use the domain as well to identify if the domain wide delegation is enabled - [ ] Automatically mark a DomainWideDelegation to have status as "error" if there is an error during event creation using it. Note that we might not have a fallback to go to but we could inform the admin about it. - \ No newline at end of file + +Not Important for first release + - [ ] Show the correct error in banner and on installed apps page(calendar_error translation key) if there is an error listing calendars + - [ ] If the error is due to the email not being part of the google workspace, we could highlight this error[Low Priority] + - [ ] When a user installs the app via DWD, user should be redirected to the installation page that would show errors if any + +To discuss + - [ ] 1. When the calendar is connect the first calendar isn't enabled to check for double bookings. Should we toggle that? + - [ ] 2. If admin disables DWD , what happens to already installed credentials? There will be no fallback for most users as they simply didn't have their own connection. In such a case, first of all we should make it really difficult to disable DWD, with clear confirmations from user. + Then, we should show an actionable error instead of calendar_error that would ask them + - Bigger Question is how do we ensure that users don't have to install the app. The connection should be preinstalled + - DB Update Approach - This is costly performance wise as there could be indexed on credentials and that makes inserts slow + - When DWD is enabled, we create the credentials for all the members of the organization(in batches) + - When DWD is disabled, we delete the credentials for all the members of the organization(in batches) + - When an org member is added, we add the credentials for them + - When an org member is removed, we delete the credentials for them + - In Memory Approach + - We refactor credential getting logic to be done through a service which would have all the logic to get the credentials. There we can have a way to return a dummy credential if DWD is enabled. + + +Security Testing +- [ ] Because a single credential controls all the emails calendars, can someone not authorized trick us into giving access to some other organization's calendars? + - [ ] We need to really make sure that service account key is NEVER exposed + - [x] We don't even let the admin user see the added service account key. + - [ ] We intend to implement Workload Identity Federation in the future. + \ No newline at end of file diff --git a/apps/web/app/future/settings/(settings)/organizations/domain-wide-delegation/page.tsx b/apps/web/app/future/settings/(settings)/organizations/domain-wide-delegation/page.tsx new file mode 100644 index 00000000000000..1b9704b6f1126f --- /dev/null +++ b/apps/web/app/future/settings/(settings)/organizations/domain-wide-delegation/page.tsx @@ -0,0 +1,11 @@ +import { _generateMetadata } from "app/_utils"; + +import Page from "@calcom/ee/organizations/pages/settings/domainWideDelegation"; + +export const generateMetadata = async () => + await _generateMetadata( + (t) => t("domain_wide_delegation"), + (t) => t("domain_wide_delegation_description") + ); + +export default Page; diff --git a/apps/web/components/apps/AppPage.tsx b/apps/web/components/apps/AppPage.tsx index 43cda33797b00a..33d2e938f81f95 100644 --- a/apps/web/components/apps/AppPage.tsx +++ b/apps/web/components/apps/AppPage.tsx @@ -26,7 +26,9 @@ function isAllowedMultipleInstalls({ categories: string[]; variant: string; }): boolean { - // TODO: We could disable it for Domain-wide delegation cases here but for now backend does it when someone tries to install the app + // TODO: We have disable multiple installs for Domain-wide delegation cases + // Right now the API route handles it but we should have it here as well + // Though we might want to enable it later. Because, Domain-wide Delegated credentials would be considered pre-installed const isCalendarApp = categories.includes("calendar"); const isOtherVariant = variant === "other"; return isCalendarApp && !isOtherVariant; diff --git a/apps/web/pages/settings/admin/domainWideDelegation.tsx b/apps/web/pages/settings/admin/domainWideDelegation.tsx deleted file mode 100644 index d414878c8a036c..00000000000000 --- a/apps/web/pages/settings/admin/domainWideDelegation.tsx +++ /dev/null @@ -1,287 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { useForm, Controller } from "react-hook-form"; - -import { useLocale } from "@calcom/lib/hooks/useLocale"; -import { trpc } from "@calcom/trpc/react"; -import { - Button, - Form, - Meta, - Switch, - showToast, - Dialog, - DialogContent, - DialogFooter, - DialogClose, - List, - TextField, - SelectField, - TextAreaField, -} from "@calcom/ui"; - -import PageWrapper from "@components/PageWrapper"; -import { getLayout } from "@components/auth/layouts/AdminLayout"; - -const DomainWideDelegationPage = () => { - const { t } = useLocale(); - const [isDialogOpen, setIsDialogOpen] = useState(false); - const [editingDelegation, setEditingDelegation] = useState(null); - - const { - data: domainWideDelegations, - isLoading, - error, - } = trpc.viewer.admin.domainWideDelegation.list.useQuery(); - - if (error) { - return ; - } - if (isLoading) return ; - const defaultValues = !editingDelegation - ? { - workspacePlatform: "GOOGLE", - serviceAccountKey: "", - organizationId: null, - enabled: true, - } - : editingDelegation; - return ( - <> - - - - - ); - - function handleAdd() { - setEditingDelegation(null); - setIsDialogOpen(true); - } - - function handleEdit(delegation) { - setEditingDelegation(delegation); - setIsDialogOpen(true); - } - - function handleToggle(delegation, checked) { - updateMutation.mutate({ ...delegation, enabled: checked }); - } -}; - -function LoadingState() { - return
    Loading...
    ; -} - -function ErrorState() { - return
    Some error occurred
    ; -} - -function PageContent({ domainWideDelegations, onAdd, onEdit, onToggle }) { - const { t } = useLocale(); - return ( -
    -
    -

    {t("domain_wide_delegation")}

    -

    {t("domain_wide_delegation_description")}

    -
    - {domainWideDelegations.length === 0 ? ( - - ) : ( - - )} -
    - ); -} - -function EmptyState({ onAdd }) { - const { t } = useLocale(); - - return ( -
    -

    {t("no_domain_wide_delegations")}

    - -
    - ); -} - -function DelegationList({ delegations, onEdit, onToggle, onAdd }) { - const { t } = useLocale(); - - return ( - <> - - {delegations.map((delegation) => ( - - ))} - -
    - -
    - - ); -} - -function DelegationListItem({ delegation, onEdit, onToggle }) { - const { t } = useLocale(); - const utils = trpc.useContext(); - const deleteMutation = trpc.viewer.admin.domainWideDelegation.delete.useMutation({ - onSuccess: () => { - showToast(t("domain_wide_delegation_deleted_successfully"), "success"); - utils.viewer.admin.domainWideDelegation.list.invalidate(); - }, - onError: (error) => { - showToast(error.message, "error"); - }, - }); - - const handleDelete = () => { - if (window.confirm(t("confirm_delete_domain_wide_delegation"))) { - deleteMutation.mutate({ id: delegation.id }); - } - }; - - return ( -
  • -
    -

    {delegation.organizationId}

    -

    {delegation.workspacePlatform}

    -
    -
    - onToggle(delegation, checked)} /> - - -
    -
  • - ); -} - -function CreateUpdateDelegationDialog({ isOpen, onOpenChange, editingDelegation, defaultValues }) { - const { t } = useLocale(); - const form = useForm({ - defaultValues, - }); - - const utils = trpc.useContext(); - - const updateMutation = trpc.viewer.admin.domainWideDelegation.update.useMutation({ - onSuccess: handleMutationSuccess, - onError: handleMutationError, - }); - - const addMutation = trpc.viewer.admin.domainWideDelegation.add.useMutation({ - onSuccess: handleMutationSuccess, - onError: handleMutationError, - }); - - function onSubmit(values) { - if (editingDelegation) { - updateMutation.mutate({ ...values, id: editingDelegation.id }); - } else { - addMutation.mutate(values); - } - } - - function handleMutationSuccess() { - showToast(t("domain_wide_delegation_updated_successfully"), "success"); - onOpenChange(false); - utils.viewer.admin.domainWideDelegation.list.invalidate(); - } - - function handleMutationError(error) { - showToast(error.message, "error"); - } - - return ( - - -
    -
    - - ( - { - onChange(option?.value); - }} - value={[ - { value: "GOOGLE", label: "Google" }, - { value: "MICROSOFT", label: "Microsoft" }, - ].find((opt) => opt.value === value)} - options={[ - { value: "GOOGLE", label: "Google" }, - { value: "MICROSOFT", label: "Microsoft" }, - ]} - /> - )} - /> - {!editingDelegation && ( - - )} - ( - - )} - /> -
    - - - - -
    -
    -
    - ); -} - -DomainWideDelegationPage.getLayout = getLayout; -DomainWideDelegationPage.PageWrapper = PageWrapper; - -export default DomainWideDelegationPage; diff --git a/apps/web/pages/settings/admin/workspace-platforms.tsx b/apps/web/pages/settings/admin/workspace-platforms.tsx new file mode 100644 index 00000000000000..e28ef10b174841 --- /dev/null +++ b/apps/web/pages/settings/admin/workspace-platforms.tsx @@ -0,0 +1,414 @@ +"use client"; + +import { useState } from "react"; +import type { SubmitHandler } from "react-hook-form"; +import { useForm, useFormContext } from "react-hook-form"; + +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { trpc, type RouterOutputs } from "@calcom/trpc"; +import { + Button, + Form, + Meta, + Switch, + showToast, + Dialog, + DialogContent, + DialogFooter, + DialogClose, + TextField, + TextAreaField, + Table, + DropdownActions, +} from "@calcom/ui"; + +import PageWrapper from "@components/PageWrapper"; +import { getLayout } from "@components/auth/layouts/AdminLayout"; + +const { Body, Cell, ColumnTitle, Header, Row } = Table; + +type WorkspacePlatform = RouterOutputs["viewer"]["admin"]["workspacePlatform"]["list"][number]; +type EditType = "meta" | "serviceAccount"; + +type Props = { + workspacePlatforms: WorkspacePlatform[]; + onAdd: () => void; + onEdit: (platform: WorkspacePlatform, editType: EditType) => void; + onToggle: (platform: WorkspacePlatform, checked: boolean) => void; + isOpen: boolean; + onOpenChange: (open: boolean) => void; + editingPlatform: WorkspacePlatform; + isCreate: boolean; + platform: WorkspacePlatform; + platformId: number; + platforms: WorkspacePlatform[]; +}; + +const WorkspacePlatformsPage = () => { + const { t } = useLocale(); + const [isDialogOpen, setIsDialogOpen] = useState(false); + + const [editing, setEditing] = useState< + { platform: WorkspacePlatform; editType: EditType } | { platform: null; editType: null } + >({ platform: null, editType: null }); + + const utils = trpc.useUtils(); + const { data: workspacePlatforms, isPending, error } = trpc.viewer.admin.workspacePlatform.list.useQuery(); + const toggleEnabledMutation = trpc.viewer.admin.workspacePlatform.toggleEnabled.useMutation({ + onSuccess: () => { + showToast(t("workspace_platform_updated_successfully"), "success"); + utils.viewer.admin.workspacePlatform.list.invalidate(); + }, + onError: (error) => { + console.error(error); + showToast(t("something_went_wrong"), "error"); + }, + }); + + if (error) { + return ; + } + + if (isPending || !workspacePlatforms) return ; + + return ( + <> + + + {editing.editType === "meta" && ( + + )} + {editing.editType === "serviceAccount" && ( + + )} + + ); + + function handleAdd() { + setEditing({ platform: null, editType: null }); + setIsDialogOpen(true); + } + + function handleEdit(platform: Props["platform"], editType: "meta" | "serviceAccount" = "meta") { + setEditing({ platform, editType }); + setIsDialogOpen(true); + } + + function handleToggle(platform: Props["platform"], checked: boolean) { + toggleEnabledMutation.mutate({ ...platform, enabled: checked }); + } +}; + +function LoadingState() { + const { t } = useLocale(); + return
    {t("loading")}...
    ; +} + +function ErrorState() { + const { t } = useLocale(); + return
    {t("something_went_wrong")}
    ; +} + +function PageContent({ + workspacePlatforms, + onAdd, + onEdit, + onToggle, +}: Pick) { + return ( +
    + {workspacePlatforms.length === 0 ? ( + + ) : ( + + )} +
    + ); +} + +function EmptyState({ onAdd }: Pick) { + const { t } = useLocale(); + + return ( +
    +

    {t("no_workspace_platforms")}

    + +
    + ); +} + +function PlatformList({ + platforms, + onEdit, + onToggle, + onAdd, +}: Pick) { + const { t } = useLocale(); + + return ( + <> + +
    + {t("platform")} + {t("slug")} + {t("status")} + + {t("actions")} + +
    + + {platforms.map((platform) => ( + + ))} + +
    +
    + +
    + + ); +} + +function ServiceAccountFields() { + const { t } = useLocale(); + const form = useFormContext(); + + return ( +
    + +
    + ); +} + +function UpdateServiceAccountFieldsDialog({ + isOpen, + onOpenChange, + platformId, +}: Pick) { + const { t } = useLocale(); + const utils = trpc.useUtils(); + type FormValues = { defaultServiceAccountKey: string }; + const form = useForm(); + + const updateServiceAccountMutation = trpc.viewer.admin.workspacePlatform.updateServiceAccount.useMutation({ + onSuccess: () => { + showToast(t("service_account_updated_successfully"), "success"); + utils.viewer.admin.workspacePlatform.list.invalidate(); + onOpenChange(false); + }, + onError: (error) => { + showToast(error.message || t("something_went_wrong"), "error"); + }, + }); + + const onSubmit: SubmitHandler = (values) => { + updateServiceAccountMutation.mutate({ id: platformId, ...values }); + }; + + return ( + + +
    + + + + + + +
    +
    + ); +} + +function PlatformListItem({ platform, onEdit, onToggle }: Pick) { + const { t } = useLocale(); + + return ( + + +
    + {platform.name} +
    +
    + +
    + {platform.slug} +
    +
    + + onToggle(platform, checked)} /> + + +
    + onEdit(platform, "meta"), + icon: "pencil", + }, + { + id: "edit-service-account", + label: t("edit_service_account"), + onClick: () => onEdit(platform, "serviceAccount"), + icon: "pencil", + }, + ]} + /> +
    +
    +
    + ); +} + +function CreatePlatformDialog({ isOpen, onOpenChange }: Pick) { + const { t } = useLocale(); + type FormValues = { name: string; description: string; slug: string; defaultServiceAccountKey: string }; + const form = useForm({ + defaultValues: { + name: "", + description: "", + slug: "", + defaultServiceAccountKey: "", + }, + }); + + const utils = trpc.useUtils(); + + const addMutation = trpc.viewer.admin.workspacePlatform.add.useMutation({ + onSuccess: async () => { + showToast(t("workspace_platform_added_successfully"), "success"); + onOpenChange(false); + await utils.viewer.admin.workspacePlatform.list.invalidate(); + }, + onError: (error) => { + showToast(error.message, "error"); + }, + }); + + const onSubmit: SubmitHandler = (values) => { + addMutation.mutate(values); + }; + + return ( + + +
    + + + + + + +
    +
    + ); +} + +function UpdatePlatformDialog({ + isOpen, + onOpenChange, + editingPlatform, +}: Pick) { + const { t } = useLocale(); + type FormValues = { name: string; description: string }; + const form = useForm({ + defaultValues: { + name: editingPlatform.name, + description: editingPlatform.description, + }, + }); + + const utils = trpc.useUtils(); + + const updateMutation = trpc.viewer.admin.workspacePlatform.update.useMutation({ + onSuccess: async () => { + showToast(t("workspace_platform_updated_successfully"), "success"); + onOpenChange(false); + await utils.viewer.admin.workspacePlatform.list.invalidate(); + }, + onError: function (error) { + showToast(error.message, "error"); + }, + }); + + const onSubmit: SubmitHandler = (values) => { + updateMutation.mutate({ ...values, id: editingPlatform.id }); + }; + + return ( + + +
    + + + + + + +
    +
    + ); +} + +function PlatformFormFields({ isCreate }: Pick) { + const { t } = useLocale(); + const form = useFormContext(); + + return ( +
    + + + {isCreate && } + {isCreate && } +
    + ); +} + +function CreateUpdatePlatformDialog({ + isOpen, + onOpenChange, + editingPlatform, +}: Pick) { + if (editingPlatform) { + return ( + + ); + } + return ; +} + +WorkspacePlatformsPage.getLayout = getLayout; +WorkspacePlatformsPage.PageWrapper = PageWrapper; + +export default WorkspacePlatformsPage; diff --git a/apps/web/pages/settings/organizations/domain-wide-delegation.tsx b/apps/web/pages/settings/organizations/domain-wide-delegation.tsx index 5f6e076811c2ba..c766f2e988902f 100644 --- a/apps/web/pages/settings/organizations/domain-wide-delegation.tsx +++ b/apps/web/pages/settings/organizations/domain-wide-delegation.tsx @@ -1,18 +1,16 @@ -import DomainWideDelegationList from "@calcom/features/ee/organizations/pages/settings/domainWideDelegation/domainWideDelegationList"; +import DomainWideDelegationList from "@calcom/features/ee/organizations/pages/settings/domainWideDelegation"; import { getLayout } from "@calcom/features/settings/layouts/SettingsLayout"; -import { useLocale } from "@calcom/lib/hooks/useLocale"; import { Meta } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; const Page = () => { - const { t } = useLocale(); return ( <> diff --git a/apps/web/public/service-worker.js b/apps/web/public/service-worker.js index 2403d15ff7d6b3..47cc9a72e60625 100644 --- a/apps/web/public/service-worker.js +++ b/apps/web/public/service-worker.js @@ -2,16 +2,15 @@ self.addEventListener("push", async (event) => { let notificationData = event.data.json(); const allClients = await clients.matchAll({ - type: 'window', - includeUncontrolled: true + type: "window", + includeUncontrolled: true, }); - if(!allClients.length) { + if (!allClients.length) { console.log("No open tabs, skipping the push notification."); return; } - const title = notificationData.title || "You have a new notification from Cal.com"; const image = "https://cal.com/api/logo?type=icon"; const newNotificationOptions = { @@ -27,7 +26,6 @@ self.addEventListener("push", async (event) => { tag: `notification-${Date.now()}-${Math.random()}`, }; - const existingNotifications = await self.registration.getNotifications(); // Display each existing notification again to make sure old ones can still be clicked @@ -45,7 +43,6 @@ self.addEventListener("push", async (event) => { self.registration.showNotification(notification.title, options); }); - // Show the new notification self.registration.showNotification(title, newNotificationOptions); }); @@ -59,7 +56,7 @@ self.addEventListener("notificationclick", (event) => { } switch (event.action) { - case 'connect-action': + case "connect-action": event.notification.close(); const url = event.notification.data.url; event.waitUntil(self.clients.openWindow(url)); diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index ce5b359fbfc604..96805cb9fe38da 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2608,5 +2608,22 @@ "reschedule_with_same_round_robin_host_description": "Rescheduled events will be assigned to the same host as initially scheduled", "disable_input_if_prefilled": "Disable input if the URL identifier is prefilled", "you_are_unauthorized_to_make_this_change_to_the_booking": "You are unauthorized to make this change to the booking", + "add_client_id_in_google_workspace_with_below_scope": "Add this Client Id in Google Workspace with the scope below", + "domain_wide_delegation": "Domain-wide Delegation", + "domain_wide_delegation_description": "Domain-wide delegation allows you to manage access to Google Workspace calendars for your organization.", + "add_domain_wide_delegation": "Add domain-wide delegation", + "edit_domain_wide_delegation": "Edit domain-wide delegation", + "domain": "Domain", + "workspace_platform": "Workspace platform", + "workspace_platforms": "Workspace platforms", + "workspace_platforms_description": "Manage workspace platforms that can be used for domain-wide delegation", + "edit_workspace_platform": "Edit workspace platform", + "edit_service_account": "Edit service account", + "add_workspace_platform": "Add workspace platform", + "slug": "Slug", + "service_account_key": "Service account key", + "edit_service_account_key": "Edit service account key", + "domain_wide_delegation_restricts_adding_more_than_one_installation": "Domain-wide delegation restricts adding more than one installation", + "app_successfully_installed_and_is_using_delegated_credentials": "App successfully installed and is using delegated credentials", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } diff --git a/packages/app-store/_utils/installation.ts b/packages/app-store/_utils/installation.ts index 6d8575266bd452..d04a11da3fa003 100644 --- a/packages/app-store/_utils/installation.ts +++ b/packages/app-store/_utils/installation.ts @@ -5,7 +5,7 @@ import { CredentialRepository } from "@calcom/lib/server/repository/credential"; import prisma from "@calcom/prisma"; import type { UserProfile } from "@calcom/types/UserProfile"; -export async function assertInstalled(slug: string, userId: number) { +export async function assertNotInstalled(slug: string, userId: number) { const alreadyInstalled = await CredentialRepository.findByAppIdAndUserId({ appId: slug, userId }); if (alreadyInstalled) { throw new HttpError({ statusCode: 422, message: "Already installed" }); diff --git a/packages/app-store/_utils/useAddAppMutation.ts b/packages/app-store/_utils/useAddAppMutation.ts index a929d53a0e4518..63dfead8289b5f 100644 --- a/packages/app-store/_utils/useAddAppMutation.ts +++ b/packages/app-store/_utils/useAddAppMutation.ts @@ -18,7 +18,7 @@ type CustomUseMutationOptions = | Omit, "mutationKey" | "mutationFn" | "onSuccess"> | undefined; -type AddAppMutationData = { setupPending: boolean } | void; +type AddAppMutationData = { setupPending: boolean; message?: string } | void; export type UseAddAppMutationOptions = CustomUseMutationOptions & { onSuccess?: (data: AddAppMutationData) => void; installGoogleVideo?: boolean; diff --git a/packages/app-store/around/api/_getAdd.ts b/packages/app-store/around/api/_getAdd.ts index 69ae895dba66b2..0a46311379e393 100644 --- a/packages/app-store/around/api/_getAdd.ts +++ b/packages/app-store/around/api/_getAdd.ts @@ -4,7 +4,7 @@ import { defaultResponder } from "@calcom/lib/server"; import checkSession from "../../_utils/auth"; import getInstalledAppPath from "../../_utils/getInstalledAppPath"; -import { checkInstalled, createDefaultInstallation } from "../../_utils/installation"; +import { assertNotInstalled, createDefaultInstallation } from "../../_utils/installation"; import appConfig from "../config.json"; export async function getHandler(req: NextApiRequest) { @@ -15,7 +15,7 @@ export async function getHandler(req: NextApiRequest) { const teamId = req.query.teamId ? Number(req.query.teamId) : undefined; const returnTo = req.query?.returnTo; - await assertInstalled(slug, session.user.id); + await assertNotInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/app-store/closecom/api/_getAdd.ts b/packages/app-store/closecom/api/_getAdd.ts index 556f8c13209255..72ac9e2f208f73 100644 --- a/packages/app-store/closecom/api/_getAdd.ts +++ b/packages/app-store/closecom/api/_getAdd.ts @@ -1,11 +1,11 @@ import type { NextApiRequest, NextApiResponse } from "next"; import checkSession from "../../_utils/auth"; -import { checkInstalled } from "../../_utils/installation"; +import { assertNotInstalled } from "../../_utils/installation"; export default async function handler(req: NextApiRequest, res: NextApiResponse) { const session = checkSession(req); - await assertInstalled("closecom", session.user?.id); + await assertNotInstalled("closecom", session.user?.id); const returnTo = req.query.returnTo; diff --git a/packages/app-store/googlecalendar/_metadata.ts b/packages/app-store/googlecalendar/_metadata.ts index 4701bde4356681..f83a98def47430 100644 --- a/packages/app-store/googlecalendar/_metadata.ts +++ b/packages/app-store/googlecalendar/_metadata.ts @@ -19,6 +19,9 @@ export const metadata = { email: "help@cal.com", dirName: "googlecalendar", isOAuth: true, + domainWideDelegation: { + workspacePlatformSlug: "google", + }, } as AppMeta; export default metadata; diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index 2e0610e8d5a59f..f6bafd66b7fa51 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -6,32 +6,80 @@ import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; import { HttpError } from "@calcom/lib/http-error"; import logger from "@calcom/lib/logger"; import { defaultHandler, defaultResponder } from "@calcom/lib/server"; +import { getTranslation } from "@calcom/lib/server/i18n"; import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import type { App } from "@calcom/types/App"; import { encodeOAuthState } from "../../_utils/oauth/encodeOAuthState"; import { metadata } from "../_metadata"; import { SCOPES } from "../lib/constants"; import { getGoogleAppKeys } from "../lib/getGoogleAppKeys"; +async function getDomainWideDelegationForApp({ + user, + appMetadata, +}: { + user: { + email: string; + }; + appMetadata: Pick; +}) { + const log = logger.getSubLogger({ prefix: ["getDomainWideDelegationForApp"] }); + + const domainWideDelegation = await DomainWideDelegationRepository.findUniqueByOrganizationMemberEmail({ + email: user.email, + }); + + if (!domainWideDelegation || !domainWideDelegation.enabled || !appMetadata.domainWideDelegation) { + log.debug("Domain-wide delegation isn't enabled for this app", { + domainWideDelegationEnabled: domainWideDelegation?.enabled, + metadataDomainWideDelegation: appMetadata.domainWideDelegation, + }); + return null; + } + + if ( + domainWideDelegation.workspacePlatform.slug !== appMetadata.domainWideDelegation.workspacePlatformSlug + ) { + log.info("Domain-wide delegation isn't compatible with this app", { + domainWideDelegation: domainWideDelegation.workspacePlatform.slug, + appSlug: metadata.slug, + }); + return null; + } + + log.debug("Domain-wide delegation is enabled"); + + return domainWideDelegation; +} + async function getHandler(req: NextApiRequest, res: NextApiResponse) { - if (!req.session?.user) { + const loggedInUser = req.session?.user; + + if (!loggedInUser) { throw new HttpError({ statusCode: 401, message: "You must be logged in to do this" }); } - const loggedInUser = req.session.user; - const domainWideDelegation = await DomainWideDelegationRepository.findByOrganizationMemberEmail({ - email: loggedInUser.email, - workspacePlatform: "GOOGLE", + const translate = await getTranslation(loggedInUser.locale ?? "en", "common"); + + // Ideally this should never happen, as email is there in session user but typings aren't accurate it seems + // TODO: So, confirm and later fix the typings + if (!loggedInUser.email) { + throw new HttpError({ statusCode: 400, message: "Session user must have an email" }); + } + + const domainWideDelegation = await getDomainWideDelegationForApp({ + user: { + email: loggedInUser.email, + }, + appMetadata: metadata, }); - if (domainWideDelegation && domainWideDelegation.enabled) { - logger.debug("Domain-wide delegation is enabled"); - // FIXME: How about if the app is installed for a team? Is that possible? I think not. - // We should figure it out and add appropriate comment here. + if (domainWideDelegation) { if (await isAppInstalled({ appId: metadata.slug, userId: loggedInUser.id })) { throw new HttpError({ statusCode: 422, - message: "Domain-wide delegation restricts adding more than one installation", + message: translate("domain_wide_delegation_restricts_adding_more_than_one_installation"), }); } @@ -45,7 +93,9 @@ async function getHandler(req: NextApiRequest, res: NextApiResponse) { access_token: "NOT_A_TOKEN", }, }); - res.status(200).json({ message: "App successfully installed and is using delegated credentials" }); + res + .status(200) + .json({ message: translate("app_successfully_installed_and_is_using_delegated_credentials") }); return; } diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index bf28ed10ae5bf7..8b78ed27695ed6 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -9,6 +9,7 @@ import { MeetLocationType } from "@calcom/app-store/locations"; import dayjs from "@calcom/dayjs"; import { getFeatureFlag } from "@calcom/features/flags/server/utils"; import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser"; +import { CalendarAppConfigurationClientIdNotAuthorizedError } from "@calcom/lib/CalendarAppConfigurationError"; import type CalendarService from "@calcom/lib/CalendarService"; import { APP_CREDENTIAL_SHARING_ENABLED, @@ -184,11 +185,20 @@ export default class GoogleCalendarService implements Calendar { }; private getAuthedCalendarFromDomainWideDelegation = async () => { + const user = this.credential.user; + if (!user) { + this.log.error( + "Couldn't check for domain wide delegation without user", + safeStringify(this.credential) + ); + return null; + } + //TODO: Compute it once and save it - const domainWideDelegation = await DomainWideDelegationRepository.findByCredential({ - credential: this.credential, - workspacePlatform: "GOOGLE", - }); + const domainWideDelegation = + await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ + user, + }); if (domainWideDelegation && domainWideDelegation.enabled && domainWideDelegation.serviceAccountKey) { const emailToImpersonate = this.credential.user?.email; @@ -200,6 +210,7 @@ export default class GoogleCalendarService implements Calendar { "Using domain wide delegation with service account email", safeStringify({ serviceAccountEmail: domainWideDelegation.serviceAccountKey.client_email, + privateKey: domainWideDelegation.serviceAccountKey.private_key, emailToImpersonate, }) ); @@ -209,7 +220,18 @@ export default class GoogleCalendarService implements Calendar { scopes: ["https://www.googleapis.com/auth/calendar"], subject: emailToImpersonate, }); - await authClient.authorize(); + + try { + await authClient.authorize(); + } catch (error) { + if ((error as any).response?.data?.error === "unauthorized_client") { + throw new CalendarAppConfigurationClientIdNotAuthorizedError( + "Make sure that the Client ID for the domain wide delegation is added to the Google Workspace Admin Console" + ); + } + throw error; + } + return google.calendar({ version: "v3", auth: authClient, diff --git a/packages/app-store/googlecalendar/package.json b/packages/app-store/googlecalendar/package.json index 64b7cd5339af4c..c8fe2c97a71c53 100644 --- a/packages/app-store/googlecalendar/package.json +++ b/packages/app-store/googlecalendar/package.json @@ -7,7 +7,6 @@ "description": "Google Calendar is a time management and scheduling service developed by Google. Allows users to create and edit events, with options available for type and time. Available to anyone that has a Gmail account on both mobile and web versions.", "dependencies": { "@calcom/prisma": "*", - "@vercel/functions": "^1.4.1", "googleapis": "^84.0.0" }, "devDependencies": { diff --git a/packages/app-store/ping/api/_getAdd.ts b/packages/app-store/ping/api/_getAdd.ts index 191a888bafbf50..269c97767b97c5 100644 --- a/packages/app-store/ping/api/_getAdd.ts +++ b/packages/app-store/ping/api/_getAdd.ts @@ -4,7 +4,7 @@ import { defaultResponder } from "@calcom/lib/server"; import checkSession from "../../_utils/auth"; import getInstalledAppPath from "../../_utils/getInstalledAppPath"; -import { checkInstalled, createDefaultInstallation } from "../../_utils/installation"; +import { assertNotInstalled, createDefaultInstallation } from "../../_utils/installation"; import appConfig from "../config.json"; export async function getHandler(req: NextApiRequest) { @@ -13,7 +13,7 @@ export async function getHandler(req: NextApiRequest) { const appType = appConfig.type; const returnTo = req.query?.returnTo; - await assertInstalled(slug, session.user.id); + await assertNotInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/app-store/riverside/api/_getAdd.ts b/packages/app-store/riverside/api/_getAdd.ts index c5300fa9abab6d..c6e28990c28503 100644 --- a/packages/app-store/riverside/api/_getAdd.ts +++ b/packages/app-store/riverside/api/_getAdd.ts @@ -4,7 +4,7 @@ import { defaultResponder } from "@calcom/lib/server"; import checkSession from "../../_utils/auth"; import getInstalledAppPath from "../../_utils/getInstalledAppPath"; -import { checkInstalled, createDefaultInstallation } from "../../_utils/installation"; +import { assertNotInstalled, createDefaultInstallation } from "../../_utils/installation"; import appConfig from "../config.json"; export async function getHandler(req: NextApiRequest) { @@ -13,7 +13,7 @@ export async function getHandler(req: NextApiRequest) { const appType = appConfig.type; const returnTo = req.query?.returnTo; - await assertInstalled(slug, session.user.id); + await assertNotInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/app-store/sendgrid/api/_getAdd.ts b/packages/app-store/sendgrid/api/_getAdd.ts index a4152252cb5fbf..9b5024c46a027b 100644 --- a/packages/app-store/sendgrid/api/_getAdd.ts +++ b/packages/app-store/sendgrid/api/_getAdd.ts @@ -3,11 +3,11 @@ import type { NextApiRequest } from "next"; import { defaultResponder } from "@calcom/lib/server"; import checkSession from "../../_utils/auth"; -import { checkInstalled } from "../../_utils/installation"; +import { assertNotInstalled } from "../../_utils/installation"; export async function getHandler(req: NextApiRequest) { const session = checkSession(req); - await assertInstalled("sendgrid", session.user?.id); + await assertNotInstalled("sendgrid", session.user?.id); return { url: "/apps/sendgrid/setup" }; } diff --git a/packages/app-store/whereby/api/_getAdd.ts b/packages/app-store/whereby/api/_getAdd.ts index 2aa3a5bc18b98a..6f09ab21147ac9 100644 --- a/packages/app-store/whereby/api/_getAdd.ts +++ b/packages/app-store/whereby/api/_getAdd.ts @@ -4,7 +4,7 @@ import { defaultResponder } from "@calcom/lib/server"; import checkSession from "../../_utils/auth"; import getInstalledAppPath from "../../_utils/getInstalledAppPath"; -import { checkInstalled, createDefaultInstallation } from "../../_utils/installation"; +import { assertNotInstalled, createDefaultInstallation } from "../../_utils/installation"; import appConfig from "../config.json"; export async function getHandler(req: NextApiRequest) { @@ -13,7 +13,7 @@ export async function getHandler(req: NextApiRequest) { const appType = appConfig.type; const returnTo = req.query?.returnTo; - await assertInstalled(slug, session.user.id); + await assertNotInstalled(slug, session.user.id); await createDefaultInstallation({ appType, user: session.user, diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index 3fbdcd2a87ceea..b8ec7b6c884160 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -6,6 +6,7 @@ import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; import getApps from "@calcom/app-store/utils"; import dayjs from "@calcom/dayjs"; import { getUid } from "@calcom/lib/CalEventParser"; +import { CalendarAppConfigurationClientIdNotAuthorizedError } from "@calcom/lib/CalendarAppConfigurationError"; import logger from "@calcom/lib/logger"; import { getPiiFreeCalendarEvent, getPiiFreeCredential } from "@calcom/lib/piiFreeData"; import { safeStringify } from "@calcom/lib/safeStringify"; @@ -104,6 +105,10 @@ export const getConnectedCalendars = async ( } } + if (error instanceof CalendarAppConfigurationClientIdNotAuthorizedError) { + errorMessage = error.message; + } + log.error("getConnectedCalendars failed", safeStringify(error), safeStringify({ item })); return { diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx new file mode 100644 index 00000000000000..5f133bf5d0e638 --- /dev/null +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -0,0 +1,363 @@ +"use client"; + +import { useState } from "react"; +import { useForm, Controller, useFormContext } from "react-hook-form"; + +import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { trpc } from "@calcom/trpc/react"; +import { + DropdownActions, + Button, + Dialog, + DialogContent, + DialogFooter, + Form, + TextField, + SelectField, + showToast, + Badge, + Switch, + InfoBadge, +} from "@calcom/ui"; + +interface DelegationItemProps { + delegation: { + id: string; + domain: string; + enabled: boolean; + serviceAccountClientId: string; + workspacePlatform: { + name: string; + slug: string; + }; + }; + toggleDelegation: (id: string) => void; + onEdit: (delegation: DelegationItemProps["delegation"]) => void; + onDelete: (id: string) => void; +} + +type WorkspacePlatform = { + id: number; + name: string; + slug: string; +}; + +function getWorkspacePlatformOptions(workspacePlatforms: WorkspacePlatform[]) { + return workspacePlatforms.map((platform) => ({ + value: platform.slug, + label: platform.name, + })); +} + +function DelegationListItemActions({ + delegation, + toggleDelegation, + onEdit, + onDelete, +}: { + delegation: DelegationItemProps["delegation"]; + toggleDelegation: (id: string) => void; + onEdit: (delegation: DelegationItemProps["delegation"]) => void; + onDelete: (id: string) => void; +}) { + const { t } = useLocale(); + + return ( +
    + toggleDelegation(delegation.id)} /> + onEdit(delegation), + icon: "pencil", + }, + { + id: "delete", + label: t("delete"), + onClick: () => onDelete(delegation.id), + icon: "trash", + }, + ]} + /> +
    + ); +} + +function DelegationListItem({ delegation, toggleDelegation, onEdit, onDelete }: DelegationItemProps) { + const { t } = useLocale(); + return ( +
  • +
    +
    +
    + {delegation.serviceAccountClientId} + +
    + https://www.googleapis.com/auth/calendar +
    + {delegation.workspacePlatform.name} + {delegation.domain} +
    +
    + +
    +
  • + ); +} + +function CreateDelegationDialog({ + isOpen, + onClose, + onSubmit, + workspacePlatforms, +}: { + isOpen: boolean; + onClose: () => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; + workspacePlatforms: WorkspacePlatform[]; +}) { + const { t } = useLocale(); + + const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ + defaultValues: { + domain: "", + workspacePlatformSlug: "", + }, + }); + + return ( + + +
    + + + + + + +
    +
    + ); +} + +function EditDelegationDialog({ + isOpen, + onClose, + delegation, + onSubmit, + workspacePlatforms, +}: { + isOpen: boolean; + onClose: () => void; + delegation: DelegationItemProps["delegation"]; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; + workspacePlatforms: WorkspacePlatform[]; +}) { + const { t } = useLocale(); + + const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ + defaultValues: { + domain: delegation.domain, + workspacePlatformSlug: delegation.workspacePlatform.slug, + }, + }); + + return ( + + +
    + + + + + + +
    +
    + ); +} + +function DelegationFormFields({ workspacePlatforms }: { workspacePlatforms: WorkspacePlatform[] }) { + const { t } = useLocale(); + const form = useFormContext(); + return ( + <> + + { + const platformOptions = getWorkspacePlatformOptions(workspacePlatforms); + const selectedPlatform = platformOptions.find((opt) => opt.value === value); + return ( + onChange(option?.value)} + value={selectedPlatform} + options={platformOptions} + /> + ); + }} + /> + + ); +} + +function CreateEditDelegationDialog({ + isOpen, + onClose, + delegation, + onSubmit, + workspacePlatforms, +}: { + isOpen: boolean; + onClose: () => void; + delegation: DelegationItemProps["delegation"] | null; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; + workspacePlatforms: WorkspacePlatform[]; +}) { + if (delegation) { + return ( + + ); + } + return ( + + ); +} + +function DomainWideDelegationList() { + const { t } = useLocale(); + const utils = trpc.useContext(); + const { data: delegations, isLoading } = trpc.viewer.domainWideDelegation.list.useQuery(); + + const updateMutation = trpc.viewer.domainWideDelegation.update.useMutation({ + onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), + onError: (error) => { + showToast(error.message, "error"); + }, + }); + + const createMutation = trpc.viewer.domainWideDelegation.add.useMutation({ + onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), + onError: (error) => { + showToast(error.message, "error"); + }, + }); + + const deleteMutation = trpc.viewer.domainWideDelegation.delete.useMutation({ + onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), + onError: (error) => { + showToast(error.message, "error"); + }, + }); + + const onDelete = (id: string) => { + deleteMutation.mutate({ id }); + }; + + const toggleDelegation = (id: string) => { + const delegation = delegations?.find((d) => d.id === id); + if (delegation) { + updateMutation.mutate({ + id, + workspacePlatformSlug: delegation.workspacePlatform.slug, + enabled: !delegation.enabled, + domain: delegation.domain, + }); + } + }; + + const [createEditDialog, setCreateEditDialog] = useState<{ + isOpen: boolean; + delegation: DelegationItemProps["delegation"] | null; + }>({ + isOpen: false, + delegation: null, + }); + + const { data: workspacePlatforms, isLoading: isLoadingWorkspacePlatforms } = + trpc.viewer.domainWideDelegation.listWorkspacePlatforms.useQuery(); + + const onEditClick = (delegation: DelegationItemProps["delegation"]) => { + setCreateEditDialog({ isOpen: true, delegation }); + }; + + const onCreateClick = () => setCreateEditDialog({ isOpen: true, delegation: null }); + + const handleSubmit = (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => { + if (createEditDialog.delegation) { + updateMutation.mutate({ + id: createEditDialog.delegation.id, + ...data, + }); + } else { + createMutation.mutate(data); + } + setCreateEditDialog({ isOpen: false, delegation: null }); + }; + + if (isLoading || isLoadingWorkspacePlatforms) { + return null; + } + + if (!delegations || !workspacePlatforms) { + return
    {t("something_went_wrong")}
    ; + } + + return ( +
    +
      + {delegations.map((delegation) => ( + + ))} +
    + setCreateEditDialog({ isOpen: false, delegation: null })} + delegation={createEditDialog.delegation} + onSubmit={handleSubmit} + workspacePlatforms={workspacePlatforms} + /> + +
    + ); +} + +export default function DomainWideDelegationListPage() { + return ( +
    + +
    + ); +} diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx deleted file mode 100644 index bd5f8bf89d043b..00000000000000 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation/DomainWideDelegationList.tsx +++ /dev/null @@ -1,250 +0,0 @@ -import { useState } from "react"; -import { useForm, Controller } from "react-hook-form"; - -import { useLocale } from "@calcom/lib/hooks/useLocale"; -import { trpc } from "@calcom/trpc/react"; -import { - Dropdown, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuItem, - Button, - Dialog, - DialogContent, - DialogFooter, - Form, - TextField, - SelectField, - showToast, -} from "@calcom/ui"; - -interface DelegationItemProps { - delegation: { - id: string; - domain: string; - enabled: boolean; - workspacePlatform: { - name: string; - slug: string; - }; - clientId: string; - organizationId: number; - }; - toggleDelegation: (id: string) => void; - onEdit: (delegation: DelegationItemProps["delegation"]) => void; -} - -function DelegationListItemActions({ - delegation, - toggleDelegation, - onEdit, -}: { - delegation: DelegationItemProps["delegation"]; - toggleDelegation: (id: string) => void; - onEdit: (delegation: DelegationItemProps["delegation"]) => void; -}) { - const { t } = useLocale(); - - return ( - - - - - - - - {/* Add more menu items as needed */} - - - ); -} - -function DelegationListItem({ delegation, toggleDelegation, onEdit }: DelegationItemProps) { - const { t } = useLocale(); - - return ( -
  • -
    -
    - {delegation.domain} - {delegation.workspacePlatform.name} -
    - -
    -
  • - ); -} - -function CreateEditDelegationDialog({ - isOpen, - onClose, - delegation, - onSubmit, -}: { - isOpen: boolean; - onClose: () => void; - delegation: DelegationItemProps["delegation"] | null; - onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; -}) { - const { t } = useLocale(); - const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ - defaultValues: { - domain: delegation?.domain || "", - workspacePlatformSlug: delegation?.workspacePlatform.slug || "", - enabled: delegation?.enabled ?? true, - }, - }); - - // TODO: Use tRPC route - const workspacePlatformOptions = [ - { value: "google", label: "Google" }, - { value: "microsoft", label: "Microsoft" }, - ]; - - return ( - - -
    - - ( - onChange(option?.value)} - value={workspacePlatformOptions.find((opt) => opt.value === value)} - options={workspacePlatformOptions} - /> - )} - /> - - - - - -
    -
    - ); -} - -export default function DomainWideDelegationList() { - const { t } = useLocale(); - const utils = trpc.useContext(); - const { data: delegations, isLoading } = trpc.viewer.domainWideDelegation.list.useQuery(); - - const updateMutation = trpc.viewer.domainWideDelegation.update.useMutation({ - onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), - onError: (error) => { - showToast(error.message, "error"); - }, - }); - - const createMutation = trpc.viewer.domainWideDelegation.add.useMutation({ - onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), - onError: (error) => { - showToast(error.message, "error"); - }, - }); - - const deleteMutation = trpc.viewer.domainWideDelegation.delete.useMutation({ - onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), - onError: (error) => { - showToast(error.message, "error"); - }, - }); - - const toggleDelegation = (id: string) => { - const delegation = delegations?.find((d) => d.id === id); - if (delegation) { - updateMutation.mutate({ - id, - workspacePlatformSlug: delegation.workspacePlatform.slug, - enabled: !delegation.enabled, - organizationId: delegation.organizationId, - }); - } - }; - - const [createEditDialog, setCreateEditDialog] = useState<{ - isOpen: boolean; - delegation: DelegationItemProps["delegation"] | null; - }>({ - isOpen: false, - delegation: null, - }); - - const onEditClick = (delegation: DelegationItemProps["delegation"]) => { - setCreateEditDialog({ isOpen: true, delegation }); - }; - - const onCreateClick = () => setCreateEditDialog({ isOpen: true, delegation: null }); - - const handleSubmit = (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => { - if (createEditDialog.delegation) { - updateMutation.mutate({ - id: createEditDialog.delegation.id, - ...data, - organizationId: createEditDialog.delegation.organizationId, - }); - } else { - createMutation.mutate({ - ...data, - organizationId: 0, // You might need to get the correct organizationId here - }); - } - setCreateEditDialog({ isOpen: false, delegation: null }); - }; - - if (isLoading) { - return
    {t("loading")}
    ; - } - - return ( -
    -
      - {delegations?.map((delegation) => ( - - ))} -
    - setCreateEditDialog({ isOpen: false, delegation: null })} - delegation={createEditDialog.delegation} - onSubmit={handleSubmit} - /> - -
    - ); -} diff --git a/packages/features/settings/layouts/SettingsLayout.tsx b/packages/features/settings/layouts/SettingsLayout.tsx index 19400582aa32dd..66e30f148a0ae4 100644 --- a/packages/features/settings/layouts/SettingsLayout.tsx +++ b/packages/features/settings/layouts/SettingsLayout.tsx @@ -134,6 +134,7 @@ const tabs: VerticalTabItemProps[] = [ { name: "organizations", href: "/settings/admin/organizations" }, { name: "lockedSMS", href: "/settings/admin/lockedSMS" }, { name: "oAuth", href: "/settings/admin/oAuth" }, + { name: "Workspace Platforms", href: "/settings/admin/workspace-platforms" }, ], }, ]; diff --git a/packages/lib/CalendarAppConfigurationError.ts b/packages/lib/CalendarAppConfigurationError.ts new file mode 100644 index 00000000000000..5ee28e2880cbc8 --- /dev/null +++ b/packages/lib/CalendarAppConfigurationError.ts @@ -0,0 +1,13 @@ +export class CalendarAppConfigurationError extends Error { + constructor(message: string) { + super(message); + this.name = "CalendarAppConfigurationError"; + } +} + +export class CalendarAppConfigurationClientIdNotAuthorizedError extends CalendarAppConfigurationError { + constructor(message: string) { + super(message); + this.name = "CalendarAppConfigurationClientIdNotAuthorizedError"; + } +} diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index de2a29020963d5..f4e2211c3721a5 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -4,7 +4,6 @@ import z from "zod"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; import { prisma } from "@calcom/prisma"; -import type { WorkspacePlatform } from "@calcom/prisma/enums"; import { OrganizationRepository } from "./organization"; @@ -12,15 +11,38 @@ const serviceAccountKeySchema = z .object({ client_email: z.string(), private_key: z.string(), + client_id: z.string(), }) .passthrough(); const repositoryLogger = logger.getSubLogger({ prefix: ["DomainWideDelegationRepository"] }); +const domainWideDelegationSafeSelect = { + id: true, + enabled: true, + domain: true, + createdAt: true, + updatedAt: true, + organizationId: true, + serviceAccountKey: true, + workspacePlatform: { + select: { + name: true, + slug: true, + }, + }, +}; + +const domainWideDelegationSelectIncludesServiceAccountKey = { + ...domainWideDelegationSafeSelect, + serviceAccountKey: true, +}; export class DomainWideDelegationRepository { - private static parsed(domainWideDelegation: T) { + private static withParsedServiceAccountKey( + domainWideDelegation: T + ) { if (!domainWideDelegation) { - return domainWideDelegation; + return null; } return { ...domainWideDelegation, @@ -28,63 +50,149 @@ export class DomainWideDelegationRepository { }; } - static async findByOrganizationMemberEmail({ - email, - workspacePlatform, - }: { - email: string; - workspacePlatform: WorkspacePlatform; + static async create(data: { + domain: string; + enabled: boolean; + organizationId: number; + workspacePlatformId: number; + serviceAccountKey: Exclude; }) { - const log = repositoryLogger.getSubLogger({ prefix: ["findByOrganizationMemberEmail"] }); + return await prisma.domainWideDelegation.create({ + data: { + workspacePlatform: { + connect: { + id: data.workspacePlatformId, + }, + }, + domain: data.domain, + enabled: data.enabled, + organization: { + connect: { + id: data.organizationId, + }, + }, + serviceAccountKey: data.serviceAccountKey, + }, + select: domainWideDelegationSafeSelect, + }); + } + + static async findUniqueByOrganizationMemberEmail({ email }: { email: string }) { + const log = repositoryLogger.getSubLogger({ prefix: ["findUniqueByOrganizationMemberEmail"] }); + log.debug("called with", { email }); const organization = await OrganizationRepository.findByMemberEmail({ email }); if (!organization) { log.debug("Email not found in any organization:", email); return null; } + const emailDomain = email.split("@")[1]; const domainWideDelegation = await prisma.domainWideDelegation.findUnique({ where: { - organizationId_workspacePlatform: { + organizationId_domain: { organizationId: organization.id, - workspacePlatform, + domain: emailDomain, }, }, + select: domainWideDelegationSafeSelect, }); - return DomainWideDelegationRepository.parsed(domainWideDelegation); + return DomainWideDelegationRepository.withParsedServiceAccountKey(domainWideDelegation); } - static async findByCredential({ - credential, - workspacePlatform, + static async findByUserIncludeSensitiveServiceAccountKey({ + user, }: { - credential: { - userId?: string | null; - teamId?: string | null; + user: { + email: string; }; - workspacePlatform: WorkspacePlatform; }) { - const log = repositoryLogger.getSubLogger({ prefix: ["findByCredential"] }); - log.debug("called with", { safeCredential: credential, workspacePlatform }); - const organization = await OrganizationRepository.findByCredentialOfMember({ - userId: credential.userId, - teamId: credential.teamId, + const log = repositoryLogger.getSubLogger({ prefix: ["findByUser"] }); + log.debug("called with", { user }); + const organization = await OrganizationRepository.findByMemberEmailId({ + email: user.email, }); if (!organization) { - log.debug("Credential isn't found for any organization:", credential); + log.debug("No organization found for user", safeStringify(user)); return null; } + const emailDomain = user.email.split("@")[1]; log.debug("organization found", safeStringify({ organizationId: organization.id })); const domainWideDelegation = await prisma.domainWideDelegation.findUnique({ where: { - organizationId_workspacePlatform: { + organizationId_domain: { organizationId: organization.id, - workspacePlatform, + domain: emailDomain, }, }, + select: domainWideDelegationSelectIncludesServiceAccountKey, + }); + + return DomainWideDelegationRepository.withParsedServiceAccountKey(domainWideDelegation); + } + + static async findFirstByDomain({ domain }: { domain: string }) { + return await prisma.domainWideDelegation.findFirst({ + where: { domain }, }); + } - return DomainWideDelegationRepository.parsed(domainWideDelegation); + static async updateById({ + id, + data, + }: { + id: string; + data: { + workspacePlatformId: number; + domain: string; + enabled: boolean; + organizationId: number; + }; + }) { + return await prisma.domainWideDelegation.update({ + where: { id }, + data: { + workspacePlatform: { + connect: { + id: data.workspacePlatformId, + }, + }, + domain: data.domain, + enabled: data.enabled, + organization: { + connect: { + id: data.organizationId, + }, + }, + }, + select: domainWideDelegationSafeSelect, + }); + } + + static async deleteById({ id }: { id: string }) { + return await prisma.domainWideDelegation.delete({ + where: { id }, + }); + } + + static async findManyByOrganizationIdIncludeWorkspacePlatformAndSensitiveServiceAccountKey({ + organizationId, + }: { + organizationId: number; + }) { + return await prisma.domainWideDelegation.findMany({ + where: { organizationId }, + select: { + ...domainWideDelegationSelectIncludesServiceAccountKey, + workspacePlatform: { + select: { + id: true, + name: true, + slug: true, + }, + }, + }, + }); } } diff --git a/packages/lib/server/repository/organization.ts b/packages/lib/server/repository/organization.ts index 46e0cc18358c74..ae0a5725aeef95 100644 --- a/packages/lib/server/repository/organization.ts +++ b/packages/lib/server/repository/organization.ts @@ -313,41 +313,22 @@ export class OrganizationRepository { return organization ?? null; } - static async findByCredentialOfMember({ - userId, - teamId, - }: { - userId?: number | null; - teamId?: number | null; - }) { - const log = logger.getSubLogger({ prefix: "findByCredentialOfMember" }); - if (userId) { - const organization = await prisma.team.findFirst({ - where: { - isOrganization: true, - members: { - some: { - userId, + static async findByMemberEmailId({ email }: { email: string }) { + const log = logger.getSubLogger({ prefix: ["findByMemberEmailId"] }); + log.debug("called with", { email }); + const organization = await prisma.team.findFirst({ + where: { + isOrganization: true, + members: { + some: { + user: { + email, }, }, }, - }); - return organization; - } - - if (teamId) { - const organization = await prisma.team.findUnique({ - where: { - id: teamId, - }, - select: { - parent: true, - }, - }); - return organization?.parent ?? null; - } + }, + }); - log.error("No userId or teamId in credential"); - return null; + return organization; } } diff --git a/packages/lib/server/repository/workspacePlatform.ts b/packages/lib/server/repository/workspacePlatform.ts new file mode 100644 index 00000000000000..8e3064c0c8f8fa --- /dev/null +++ b/packages/lib/server/repository/workspacePlatform.ts @@ -0,0 +1,92 @@ +import type { Prisma } from "@prisma/client"; +import { z } from "zod"; + +import { prisma } from "@calcom/prisma"; + +const safeWorkspacePlatformSelect = { + id: true, + name: true, + enabled: true, + slug: true, + description: true, +}; + +const workspacePlatformSelectWithServiceAccountKey = { + ...safeWorkspacePlatformSelect, + defaultServiceAccountKey: true, +}; + +const serviceAccountKeySchema = z + .object({ + client_email: z.string(), + private_key: z.string(), + client_id: z.string(), + }) + .passthrough(); + +export class WorkspacePlatformRepository { + private static withParsedServiceAccountKey( + data: T + ) { + return { + ...data, + defaultServiceAccountKey: serviceAccountKeySchema.parse(data.defaultServiceAccountKey), + }; + } + + static async create(data: { + slug: string; + name: string; + description: string; + defaultServiceAccountKey: string; + enabled: boolean; + }) { + return await prisma.workspacePlatform.create({ + data, + select: safeWorkspacePlatformSelect, + }); + } + + static async findAll() { + return await prisma.workspacePlatform.findMany({ + select: safeWorkspacePlatformSelect, + }); + } + + static async findBySlug({ slug }: { slug: string }) { + return await prisma.workspacePlatform.findUnique({ + where: { slug }, + select: safeWorkspacePlatformSelect, + }); + } + + static async findBySlugIncludeSensitiveServiceAccountKey({ slug }: { slug: string }) { + const workspacePlatform = await prisma.workspacePlatform.findUnique({ + where: { slug }, + select: workspacePlatformSelectWithServiceAccountKey, + }); + if (!workspacePlatform) { + return null; + } + return this.withParsedServiceAccountKey(workspacePlatform); + } + + static async updateById({ + id, + data, + }: { + id: number; + data: Partial<{ + slug: string; + name: string; + description: string; + defaultServiceAccountKey: string; + enabled: boolean; + }>; + }) { + return await prisma.workspacePlatform.update({ + where: { id }, + data, + }); + } +} diff --git a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx index ffe36056df300e..48c6b5aba9f1ec 100644 --- a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx +++ b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx @@ -104,7 +104,7 @@ export const SelectedCalendarsSettingsWebWrapper = (props: SelectedCalendarsSett {connectedCalendar.integration.name} - : {t("calendar_error")} + : {connectedCalendar.error?.message || t("calendar_error")} } iconClassName="h-10 w-10 ml-2 mr-1 mt-0.5" diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index a7d45a01f1e1b0..54645fe80bb75a 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -184,8 +184,8 @@ model Credential { invalid Boolean? @default(false) CalendarCache CalendarCache[] - delegatedTo DomainWideDelegation? @relation(fields: [delegatedToId], references: [id], onDelete: Cascade) - delegatedToId String? + delegatedTo DomainWideDelegation? @relation(fields: [delegatedToId], references: [id], onDelete: Cascade) + delegatedToId String? @@index([userId]) @@index([appId]) @@ -1516,42 +1516,41 @@ model AttributeToUser { } model DomainWideDelegation { - id String @id @default(uuid()) - workspacePlatform WorkspacePlatform @relation(fields: [workspacePlatformId], references: [id], onDelete: Cascade) + id String @id @default(uuid()) + workspacePlatform WorkspacePlatform @relation(fields: [workspacePlatformId], references: [id], onDelete: Cascade) workspacePlatformId Int // Provides possibility to have different service accounts for different organizations if the need arises, but normally they should be the same serviceAccountKey Json - serviceAccountClientId String - enabled Boolean @default(false) - organizationId Int - organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade) - Credential Credential[] - domain String - inErrorState Boolean @default(false) + enabled Boolean @default(false) + organizationId Int + organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade) + Credential Credential[] + domain String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Should be fare to assume that one domain can be only on one workspace platform at a time. So, one can't have two different workspace platforms for the same domain + // Because we don't know which domain the organization might have, we couldn't make it unique as that would prevent an authorized owner to prevent using that domain. @@unique([organizationId, domain]) - // Ensures that two different organizations don't control the same domain - @@unique([domain]) } - // It is for domain-wide delegation model WorkspacePlatform { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + + /// @zod.min(1) slug String - + + /// @zod.min(1) name String + description String - + defaultServiceAccountKey Json - defaultServiceAccountClientId String - + createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -1560,4 +1559,4 @@ model WorkspacePlatform { domainWideDelegations DomainWideDelegation[] @@unique([slug]) -} \ No newline at end of file +} diff --git a/packages/trpc/server/routers/viewer/admin/_router.ts b/packages/trpc/server/routers/viewer/admin/_router.ts index a99df03afb11e0..479c31c12461a2 100644 --- a/packages/trpc/server/routers/viewer/admin/_router.ts +++ b/packages/trpc/server/routers/viewer/admin/_router.ts @@ -8,6 +8,12 @@ import { ZAdminLockUserAccountSchema } from "./lockUserAccount.schema"; import { ZAdminRemoveTwoFactor } from "./removeTwoFactor.schema"; import { ZAdminPasswordResetSchema } from "./sendPasswordReset.schema"; import { ZSetSMSLockState } from "./setSMSLockState.schema"; +import { + workspacePlatformCreateSchema, + workspacePlatformUpdateSchema, + workspacePlatformUpdateServiceAccountSchema, + workspacePlatformToggleEnabledSchema, +} from "./workspacePlatform/schema"; const NAMESPACE = "admin"; @@ -72,4 +78,43 @@ export const adminRouter = router({ ); return handler(opts); }), + workspacePlatform: router({ + list: authedAdminProcedure.query(async () => { + const handler = await importHandler( + namespaced("workspacePlatforms.list"), + () => import("./workspacePlatform/list.handler") + ); + return handler(); + }), + add: authedAdminProcedure.input(workspacePlatformCreateSchema).mutation(async (opts) => { + const handler = await importHandler( + namespaced("workspacePlatforms.add"), + () => import("./workspacePlatform/add.handler") + ); + return handler(opts); + }), + update: authedAdminProcedure.input(workspacePlatformUpdateSchema).mutation(async (opts) => { + const handler = await importHandler( + namespaced("workspacePlatforms.update"), + () => import("./workspacePlatform/update.handler") + ); + return handler(opts); + }), + updateServiceAccount: authedAdminProcedure + .input(workspacePlatformUpdateServiceAccountSchema) + .mutation(async (opts) => { + const handler = await importHandler( + namespaced("workspacePlatforms.updateServiceAccount"), + () => import("./workspacePlatform/updateServiceAccount.handler") + ); + return handler(opts); + }), + toggleEnabled: authedAdminProcedure.input(workspacePlatformToggleEnabledSchema).mutation(async (opts) => { + const handler = await importHandler( + namespaced("workspacePlatforms.toggleEnabled"), + () => import("./workspacePlatform/toggleEnabled.handler") + ); + return handler(opts); + }), + }), }); diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts new file mode 100644 index 00000000000000..732da3a852e9d5 --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts @@ -0,0 +1,18 @@ +import type { z } from "zod"; + +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; +import { workspacePlatformCreateSchema } from "./schema"; +import { TRPCError } from "@trpc/server"; + +export default async function addHandler({ + input, +}: { + input: z.infer; +}) { + try { + return await WorkspacePlatformRepository.create(input); + } catch (error) { + console.error(error); + throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to add workspace platform" }); + } +} diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts new file mode 100644 index 00000000000000..eee263e0373685 --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts @@ -0,0 +1,12 @@ +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; + +import { TRPCError } from "@trpc/server"; + +export default async function listHandler() { + try { + return await WorkspacePlatformRepository.findAll(); + } catch (error) { + console.error(error); + throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to fetch workspace platforms" }); + } +} diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts new file mode 100644 index 00000000000000..01181e8b134782 --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; + +export const workspacePlatformCreateSchema = z.object({ + slug: z.string().min(1), + name: z.string().min(1), + description: z.string().min(1), + defaultServiceAccountKey: z.string(), + enabled: z.boolean().optional().default(true), +}); + +export const workspacePlatformUpdateSchema = z.object({ + id: z.number(), + name: z.string().min(1), + description: z.string().min(1), +}); + +export const workspacePlatformUpdateServiceAccountSchema = z.object({ + id: z.number(), + defaultServiceAccountKey: z.string(), +}); + +export const workspacePlatformToggleEnabledSchema = z.object({ + id: z.number(), + enabled: z.boolean(), +}); diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts new file mode 100644 index 00000000000000..5291a5fe096d7f --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts @@ -0,0 +1,20 @@ +import type { z } from "zod"; + +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; + +import type { workspacePlatformToggleEnabledSchema } from "./schema"; + +export default async function toggleEnabledHandler({ + input, +}: { + input: z.infer; +}) { + const updatedWorkspacePlatform = await WorkspacePlatformRepository.updateById({ + id: input.id, + data: { + enabled: input.enabled, + }, + }); + + return updatedWorkspacePlatform; +} diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts new file mode 100644 index 00000000000000..2434112dd1016b --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts @@ -0,0 +1,27 @@ +import type { z } from "zod"; + +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; + +import { TRPCError } from "@trpc/server"; + +import type { workspacePlatformUpdateSchema } from "./schema"; + +export default async function updateHandler({ + input, +}: { + input: z.infer; +}) { + try { + const updatedWorkspacePlatform = await WorkspacePlatformRepository.updateById({ + id: input.id, + data: { + name: input.name, + description: input.description, + }, + }); + return { workspacePlatform: updatedWorkspacePlatform }; + } catch (error) { + console.error(error); + throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to update workspace platform" }); + } +} diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts new file mode 100644 index 00000000000000..cc72c89fedde57 --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts @@ -0,0 +1,26 @@ +import type { z } from "zod"; + +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; + +import { TRPCError } from "@trpc/server"; + +import type { workspacePlatformUpdateServiceAccountSchema } from "./schema"; + +export default async function updateServiceAccountHandler({ + input, +}: { + input: z.infer; +}) { + try { + const updatedWorkspacePlatform = await WorkspacePlatformRepository.updateById({ + id: input.id, + data: { + defaultServiceAccountKey: input.defaultServiceAccountKey, + }, + }); + return { workspacePlatform: updatedWorkspacePlatform }; + } catch (error) { + console.error(error); + throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to update service account" }); + } +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts index 1b150fd12feac1..afd1985fb55d2f 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts @@ -1,46 +1,36 @@ -import { authedOrgAdminProcedure } from "../../../procedures/authedProcedure"; +import authedProcedure, { authedOrgAdminProcedure } from "../../../procedures/authedProcedure"; import { router, importHandler } from "../../../trpc"; import { DomainWideDelegationCreateSchema, DomainWideDelegationUpdateSchema, DomainWideDelegationDeleteSchema, -} from "./domainWideDelegation.schema"; +} from "./schema"; const NAMESPACE = "domainWideDelegation"; - const namespaced = (s: string) => `${NAMESPACE}.${s}`; export const domainWideDelegationRouter = router({ list: authedOrgAdminProcedure.query(async (opts) => { - const handler = await importHandler( - namespaced("listDomainWideDelegationsHandler"), - () => import("./domainWideDelegation.handler"), - "listDomainWideDelegationsHandler" - ); + const handler = await importHandler(namespaced("list"), () => import("./list.handler")); return handler(opts); }), update: authedOrgAdminProcedure.input(DomainWideDelegationUpdateSchema).mutation(async (opts) => { - const handler = await importHandler( - namespaced("updateDomainWideDelegationHandler"), - () => import("./domainWideDelegation.handler"), - "updateDomainWideDelegationHandler" - ); + const handler = await importHandler(namespaced("update"), () => import("./update.handler")); return handler(opts); }), add: authedOrgAdminProcedure.input(DomainWideDelegationCreateSchema).mutation(async (opts) => { - const handler = await importHandler( - namespaced("createDomainWideDelegationHandler"), - () => import("./domainWideDelegation.handler"), - "createDomainWideDelegationHandler" - ); + const handler = await importHandler(namespaced("add"), () => import("./add.handler")); return handler(opts); }), delete: authedOrgAdminProcedure.input(DomainWideDelegationDeleteSchema).mutation(async (opts) => { + const handler = await importHandler(namespaced("delete"), () => import("./delete.handler")); + return handler(opts); + }), + listWorkspacePlatforms: authedProcedure.query(async () => { const handler = await importHandler( - namespaced("deleteDomainWideDelegationHandler"), - () => import("./domainWideDelegation.handler"), - "deleteDomainWideDelegationHandler" + namespaced("listWorkspacePlatforms"), + () => import("./listWorkspacePlatforms.handler") ); - return handler(opts); + return handler(); }), }); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts new file mode 100644 index 00000000000000..aa8b696ef86521 --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts @@ -0,0 +1,64 @@ +import type { z } from "zod"; + +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; + +import { TRPCError } from "@trpc/server"; + +import type { DomainWideDelegationCreateSchema } from "./schema"; +import { ensureNoServiceAccountKey, handleDomainWideDelegationError } from "./utils"; + +export default async function handler({ + input, + ctx, +}: { + input: z.infer; + ctx: { user: { id: number; organizationId: number | null } }; +}) { + const { workspacePlatformSlug, domain } = input; + const { user } = ctx; + const { organizationId } = user; + + if (!organizationId) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "You must be part of an organization to add a domain-wide delegation", + }); + } + + try { + const workspacePlatform = await WorkspacePlatformRepository.findBySlugIncludeSensitiveServiceAccountKey({ + slug: workspacePlatformSlug, + }); + + if (!workspacePlatform) { + throw new TRPCError({ + code: "NOT_FOUND", + message: `Workspace platform ${workspacePlatformSlug} not found`, + }); + } + + const existingDelegationForDomain = await DomainWideDelegationRepository.findFirstByDomain({ + domain, + }); + + if (existingDelegationForDomain) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: `Domain ${domain} already has a domain-wide delegation`, + }); + } + + const createdDelegation = await DomainWideDelegationRepository.create({ + workspacePlatformId: workspacePlatform.id, + domain, + enabled: true, + organizationId, + serviceAccountKey: workspacePlatform.defaultServiceAccountKey, + }); + + return ensureNoServiceAccountKey(createdDelegation); + } catch (error) { + handleDomainWideDelegationError(error); + } +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/delete.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/delete.handler.ts new file mode 100644 index 00000000000000..95a2db33b4110d --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/delete.handler.ts @@ -0,0 +1,17 @@ +import type z from "zod"; + +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; + +import type { DomainWideDelegationDeleteSchema } from "./schema"; + +export default async function handler({ + input, +}: { + input: z.infer; +}) { + const { id } = input; + + await DomainWideDelegationRepository.deleteById({ id }); + + return { id }; +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.handler.ts deleted file mode 100644 index 9194c68c49a0fc..00000000000000 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.handler.ts +++ /dev/null @@ -1,207 +0,0 @@ -import type { PrismaClient } from "@prisma/client"; -import type { z } from "zod"; - -import { prisma } from "@calcom/prisma"; - -import { TRPCError } from "@trpc/server"; - -import type { - DomainWideDelegationCreateSchema, - DomainWideDelegationUpdateSchema, - DomainWideDelegationDeleteSchema, -} from "./domainWideDelegation.schema"; - -class InvalidServiceAccountKeyError extends Error { - constructor(message: string) { - super(message); - this.name = "InvalidServiceAccountKeyError"; - } -} - -const domainWideDelegationSafeSelect = { - id: true, - workspacePlatform: true, - enabled: true, - organizationId: true, - serviceAccountClientId: true, -}; - -async function findWorkspacePlatformBySlug({ slug }: { slug: string }) { - const workspacePlatform = await prisma.workspacePlatform.findUnique({ - where: { slug }, - }); - - if (!workspacePlatform) { - return null; - } - const parsedServiceAccountKey = parseServiceAccountKey(workspacePlatform.defaultServiceAccountKey); - - return { ...workspacePlatform, defaultServiceAccountKey: parsedServiceAccountKey }; -} - -function parseServiceAccountKey(serviceAccountKey?: string) { - if (!serviceAccountKey) { - return null; - } - - const trimmedServiceAccountKey = serviceAccountKey.trim(); - - let parsedServiceAccountKey; - try { - parsedServiceAccountKey = JSON.parse(trimmedServiceAccountKey); - } catch (error) { - console.error("Error parsing service account key:", error); - throw new InvalidServiceAccountKeyError("Service account key is not valid JSON"); - } - - if (!parsedServiceAccountKey.private_key || !parsedServiceAccountKey.client_email) { - throw new InvalidServiceAccountKeyError("Service account key must contain private_key and client_email"); - } - - return parsedServiceAccountKey; -} - -export const createDomainWideDelegationHandler = async ({ - input, - ctx, -}: { - input: z.infer; - ctx: { prisma: PrismaClient; user: { id: number; organizationId: number } }; -}) => { - const { workspacePlatformSlug, domain } = input; - const { prisma, user } = ctx; - const { organizationId } = user; - - try { - const workspacePlatform = await findWorkspacePlatformBySlug({ - slug: workspacePlatformSlug, - }); - - if (!workspacePlatform) { - throw new TRPCError({ - code: "NOT_FOUND", - message: `Workspace platform ${workspacePlatformSlug} not found`, - }); - } - - const createdDelegation = await prisma.domainWideDelegation.create({ - data: { - workspacePlatform: { - connect: { - id: workspacePlatform.id, - }, - }, - domain, - enabled: true, - organization: { - connect: { - id: organizationId, - }, - }, - - // Copy service account key and client id from workspace platform to allow us to change the default service account key if needed without changing the service account client ID for existing delegations - serviceAccountKey: workspacePlatform.defaultServiceAccountKey, - serviceAccountClientId: workspacePlatform.defaultServiceAccountClientId, - }, - }); - - return { - ...createdDelegation, - serviceAccountKey: undefined, - }; - } catch (error) { - handleDomainWideDelegationError(error); - } -}; - -export const updateDomainWideDelegationHandler = async ({ - input, - ctx, -}: { - input: z.infer; - ctx: { prisma: PrismaClient; user: { id: number; organizationId: number } }; -}) => { - const { id, workspacePlatformSlug, domain, enabled } = input; - const { prisma, user } = ctx; - const { organizationId } = user; - - try { - const workspacePlatform = await findWorkspacePlatformBySlug({ - slug: workspacePlatformSlug, - }); - - const updatedDelegation = await prisma.domainWideDelegation.update({ - where: { id }, - data: { - workspacePlatform: { - connect: { - id: workspacePlatform.id, - }, - }, - domain, - enabled, - organizationId, - }, - }); - - return { - ...updatedDelegation, - serviceAccountKey: undefined, - }; - } catch (error) { - handleDomainWideDelegationError(error); - } -}; - -const handleDomainWideDelegationError = (error: unknown) => { - if (error instanceof InvalidServiceAccountKeyError) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: error.message, - }); - } - - if (error instanceof TRPCError) { - throw error; - } - - console.error("Error handling domain-wide delegation:", error); - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: "An error occurred while handling domain-wide delegation settings.", - }); -}; - -export const listDomainWideDelegationsHandler = async ({ - ctx, -}: { - ctx: { prisma: PrismaClient; user: { id: number } }; -}) => { - const { prisma, user } = ctx; - - const domainWideDelegations = await prisma.domainWideDelegation.findMany({ - where: { - organizationId: user.organization.id, - }, - select: domainWideDelegationSafeSelect, - }); - - return domainWideDelegations; -}; - -export const deleteDomainWideDelegationHandler = async ({ - input, - ctx, -}: { - input: z.infer; - ctx: { prisma: PrismaClient; user: { id: number } }; -}) => { - const { id } = input; - const { prisma } = ctx; - - await prisma.domainWideDelegation.delete({ - where: { id }, - }); - - return { id }; -}; diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts new file mode 100644 index 00000000000000..82c243f3f48f18 --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts @@ -0,0 +1,35 @@ +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import type { PrismaClient } from "@calcom/prisma"; + +import { ensureNoServiceAccountKey } from "./utils"; + +export default async function handler({ + ctx, +}: { + ctx: { prisma: PrismaClient; user: { id: number; organization: { id: number | null } } }; +}) { + const { user } = ctx; + + const organizationId = user.organization?.id; + + if (!organizationId) { + throw new Error("You must be in an organization to list domain wide delegations"); + } + + const domainWideDelegations = + await DomainWideDelegationRepository.findManyByOrganizationIdIncludeWorkspacePlatformAndSensitiveServiceAccountKey( + { + organizationId, + } + ); + + return domainWideDelegations.map((delegation) => { + // Let's not parse the service account key here, we should be able to fix the item with the problem, so we always try to return the complete list + const serviceAccountKey = delegation.serviceAccountKey; + return ensureNoServiceAccountKey({ + ...delegation, + // @ts-expect-error - serviceAccountKey is not typed + serviceAccountClientId: serviceAccountKey?.client_id || null, + }); + }); +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/listWorkspacePlatforms.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/listWorkspacePlatforms.handler.ts new file mode 100644 index 00000000000000..712661dfeec40e --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/listWorkspacePlatforms.handler.ts @@ -0,0 +1,7 @@ +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; + +export default async function handler() { + const workspacePlatforms = await WorkspacePlatformRepository.findAll(); + + return workspacePlatforms; +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.schema.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts similarity index 92% rename from packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.schema.ts rename to packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts index 772f2e298df0e7..e137282c913ac0 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/domainWideDelegation.schema.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts @@ -6,7 +6,7 @@ export const DomainWideDelegationCreateSchema = z.object({ }); export const DomainWideDelegationUpdateSchema = z.object({ - id: z.string().optional(), + id: z.string(), workspacePlatformSlug: z.string(), domain: z.string(), enabled: z.boolean(), diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts new file mode 100644 index 00000000000000..59f45727b184bd --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts @@ -0,0 +1,57 @@ +import type { z } from "zod"; + +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; +import { TRPCError } from "@calcom/trpc/server"; + +import type { DomainWideDelegationUpdateSchema } from "./schema"; +import { handleDomainWideDelegationError } from "./utils"; + +export default async function handler({ + input, + ctx, +}: { + input: z.infer; + ctx: { user: { id: number; organizationId: number | null } }; +}) { + const { id, workspacePlatformSlug, domain, enabled } = input; + const { user } = ctx; + const { organizationId } = user; + + if (!organizationId) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "You must be part of an organization to update a domain wide delegation", + }); + } + + try { + const workspacePlatform = await WorkspacePlatformRepository.findBySlugIncludeSensitiveServiceAccountKey({ + slug: workspacePlatformSlug, + }); + + if (!workspacePlatform) { + throw new TRPCError({ + code: "NOT_FOUND", + message: `Workspace platform ${workspacePlatformSlug} not found`, + }); + } + + const updatedDelegation = await DomainWideDelegationRepository.updateById({ + id, + data: { + workspacePlatformId: workspacePlatform.id, + domain, + enabled, + organizationId, + }, + }); + + return { + ...updatedDelegation, + serviceAccountKey: undefined, + }; + } catch (error) { + handleDomainWideDelegationError(error); + } +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts new file mode 100644 index 00000000000000..b35df50e04e290 --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; + +import type { Prisma } from "@calcom/prisma/client"; + +import { TRPCError } from "@trpc/server"; + +export class InvalidServiceAccountKeyError extends Error { + constructor(message: string) { + super(message); + this.name = "InvalidServiceAccountKeyError"; + } +} + +export function parseServiceAccountKey(serviceAccountKey: Prisma.JsonValue) { + if (!serviceAccountKey) { + return null; + } + const schema = z.object({ + client_id: z.string(), + private_key: z.string(), + client_email: z.string(), + }); + + const parsedServiceAccountKey = schema.safeParse(serviceAccountKey); + + if (!parsedServiceAccountKey.success) { + console.error("Invalid service account key", parsedServiceAccountKey.error); + throw new InvalidServiceAccountKeyError( + "Service account key must contain private_key, client_email and client_id" + ); + } + + return parsedServiceAccountKey.data; +} + +export const handleDomainWideDelegationError = (error: unknown) => { + if (error instanceof InvalidServiceAccountKeyError) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: error.message, + }); + } + + if (error instanceof TRPCError) { + throw error; + } + + console.error("Error handling domain-wide delegation:", error); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "An error occurred while handling domain-wide delegation settings.", + }); +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const ensureNoServiceAccountKey = (domainWideDelegation: T) => { + const { serviceAccountKey, ...rest } = domainWideDelegation; + return { + ...rest, + serviceAccountKey: undefined, + }; +}; diff --git a/packages/trpc/server/trpc.ts b/packages/trpc/server/trpc.ts index d081eeb86fe6be..3f2709e3ea8cb5 100644 --- a/packages/trpc/server/trpc.ts +++ b/packages/trpc/server/trpc.ts @@ -33,26 +33,23 @@ return handler({ ctx, input }); */ export const importHandler = async < T extends { - // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any - [key: string]: any; + // eslint-disable-next-line @typescript-eslint/ban-types + default: Function; } >( /** * The name of the handler in cache. It has to be unique across all routes */ name: string, - importer: () => Promise, - exportName = "default" + importer: () => Promise ) => { const nameInCache = name as keyof typeof UNSTABLE_HANDLER_CACHE; if (!UNSTABLE_HANDLER_CACHE[nameInCache]) { const importedModule = await importer(); - UNSTABLE_HANDLER_CACHE[nameInCache] = importedModule[exportName]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return importedModule[exportName] as unknown as (...args: any[]) => any; + UNSTABLE_HANDLER_CACHE[nameInCache] = importedModule.default; + return importedModule.default as T["default"]; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return UNSTABLE_HANDLER_CACHE[nameInCache] as unknown as (...args: any[]) => any; + return UNSTABLE_HANDLER_CACHE[nameInCache] as unknown as T["default"]; }; diff --git a/packages/trpc/tsconfig.json b/packages/trpc/tsconfig.json index e75cc122266758..3659a687b306da 100644 --- a/packages/trpc/tsconfig.json +++ b/packages/trpc/tsconfig.json @@ -15,7 +15,8 @@ "@calcom/platform-types": ["../platform/types/index.ts"], "@calcom/platform-utils": ["../platform/utils/index.ts"], "@calcom/prisma": ["../prisma"], - "@calcom/prisma/*": ["../prisma/*"] + "@calcom/prisma/*": ["../prisma/*"], + "@calcom/repository/*": ["../lib/server/repository/*"] }, "include": [ "../types/@wojtekmaj__react-daterange-picker.d.ts", diff --git a/packages/types/App.d.ts b/packages/types/App.d.ts index 62b14dcc8904e8..1ea589feb332d4 100644 --- a/packages/types/App.d.ts +++ b/packages/types/App.d.ts @@ -167,6 +167,12 @@ export interface App { createdAt?: string; /** Specifies if the App uses an OAuth flow */ isOAuth?: boolean; + /** + * Specifies if the App supports domain-wide delegation + */ + domainWideDelegation?: { + workspacePlatformSlug: string; + }; } export type AppFrontendPayload = Omit & { From 77fba8754702cd0683b93fcc2d44b3c756ec2dfc Mon Sep 17 00:00:00 2001 From: Hariom Date: Fri, 20 Sep 2024 14:09:50 +0530 Subject: [PATCH 05/61] Fixes --- TODO.md | 5 +- apps/web/pages/api/availability/calendar.ts | 9 ++- packages/app-store/googlecalendar/api/add.ts | 60 +++++++++---------- .../googlecalendar/lib/CalendarService.ts | 15 ++++- packages/core/CalendarManager.ts | 10 +++- packages/core/EventManager.ts | 13 ++-- .../getAllCredentials.ts | 11 ++-- .../features/calendars/CalendarSwitch.tsx | 6 +- .../pages/settings/domainWideDelegation.tsx | 22 ++++--- packages/lib/CalendarAppConfigurationError.ts | 7 +++ .../lib/getConnectedDestinationCalendars.ts | 17 ++++-- packages/lib/server/domainWideDelegation.ts | 54 +++++++++++++++++ packages/lib/server/getUsersCredentials.ts | 6 +- .../server/repository/domainWideDelegation.ts | 34 ++++++----- .../server/repository/workspacePlatform.ts | 1 + .../SelectedCalendarsSettingsWebWrapper.tsx | 20 ++++--- packages/prisma/schema.prisma | 8 ++- packages/prisma/selects/credential.ts | 1 + .../appCredentialsByType.handler.ts | 5 +- .../setDestinationCalendar.handler.ts | 17 ++++-- .../admin/workspacePlatform/add.handler.ts | 11 +++- .../admin/workspacePlatform/list.handler.ts | 5 +- .../toggleEnabled.handler.ts | 4 +- .../admin/workspacePlatform/update.handler.ts | 6 +- .../updateServiceAccount.handler.ts | 4 +- .../viewer/admin/workspacePlatform/utils.ts | 9 +++ .../viewer/domainWideDelegation/_router.ts | 5 ++ .../viewer/domainWideDelegation/schema.ts | 4 ++ .../toggleEnabled.handler.ts | 21 +++++++ .../domainWideDelegation/update.handler.ts | 11 ++-- .../viewer/domainWideDelegation/utils.ts | 5 +- packages/types/Credential.d.ts | 4 +- 32 files changed, 295 insertions(+), 115 deletions(-) create mode 100644 packages/lib/server/domainWideDelegation.ts create mode 100644 packages/trpc/server/routers/viewer/admin/workspacePlatform/utils.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts diff --git a/TODO.md b/TODO.md index 5fa3ad30de77a4..67292da078539f 100644 --- a/TODO.md +++ b/TODO.md @@ -32,4 +32,7 @@ Security Testing - [ ] We need to really make sure that service account key is NEVER exposed - [x] We don't even let the admin user see the added service account key. - [ ] We intend to implement Workload Identity Federation in the future. - \ No newline at end of file + + +Version-2.0 +- Workload Identity Federation to ensure that the service account key is never stored in DB. \ No newline at end of file diff --git a/apps/web/pages/api/availability/calendar.ts b/apps/web/pages/api/availability/calendar.ts index ce084da3cc77be..8fca441117f61c 100644 --- a/apps/web/pages/api/availability/calendar.ts +++ b/apps/web/pages/api/availability/calendar.ts @@ -11,6 +11,7 @@ const selectedCalendarSelectSchema = z.object({ integration: z.string(), externalId: z.string(), credentialId: z.number().optional(), + domainWideDelegationCredentialId: z.string().nullable(), }); export default async function handler(req: NextApiRequest, res: NextApiResponse) { @@ -41,7 +42,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const { credentials, ...user } = userWithCredentials; if (req.method === "POST") { - const { integration, externalId, credentialId } = selectedCalendarSelectSchema.parse(req.body); + const { integration, externalId, credentialId, domainWideDelegationCredentialId } = selectedCalendarSelectSchema.parse(req.body); await prisma.selectedCalendar.upsert({ where: { userId_integration_externalId: { @@ -54,7 +55,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) userId: user.id, integration, externalId, - credentialId, + ...(credentialId && credentialId > 0 ? { + credentialId, + } : { + domainWideDelegationCredentialId, + }), }, // already exists update: {}, diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index f6bafd66b7fa51..0c85c09cee87af 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -68,36 +68,36 @@ async function getHandler(req: NextApiRequest, res: NextApiResponse) { throw new HttpError({ statusCode: 400, message: "Session user must have an email" }); } - const domainWideDelegation = await getDomainWideDelegationForApp({ - user: { - email: loggedInUser.email, - }, - appMetadata: metadata, - }); - - if (domainWideDelegation) { - if (await isAppInstalled({ appId: metadata.slug, userId: loggedInUser.id })) { - throw new HttpError({ - statusCode: 422, - message: translate("domain_wide_delegation_restricts_adding_more_than_one_installation"), - }); - } - - await createDefaultInstallation({ - appType: metadata.type, - user: loggedInUser, - slug: metadata.slug, - delegatedToId: domainWideDelegation.id, - key: { - // FIXME: zod validation somewhere requires access_token, when infact it isn't needed for domain-wide delegation - access_token: "NOT_A_TOKEN", - }, - }); - res - .status(200) - .json({ message: translate("app_successfully_installed_and_is_using_delegated_credentials") }); - return; - } + // const domainWideDelegation = await getDomainWideDelegationForApp({ + // user: { + // email: loggedInUser.email, + // }, + // appMetadata: metadata, + // }); + + // if (domainWideDelegation) { + // if (await isAppInstalled({ appId: metadata.slug, userId: loggedInUser.id })) { + // throw new HttpError({ + // statusCode: 422, + // message: translate("domain_wide_delegation_restricts_adding_more_than_one_installation"), + // }); + // } + + // await createDefaultInstallation({ + // appType: metadata.type, + // user: loggedInUser, + // slug: metadata.slug, + // delegatedToId: domainWideDelegation.id, + // key: { + // // FIXME: zod validation somewhere requires access_token, when infact it isn't needed for domain-wide delegation + // access_token: "NOT_A_TOKEN", + // }, + // }); + // res + // .status(200) + // .json({ message: translate("app_successfully_installed_and_is_using_delegated_credentials") }); + // return; + // } const { client_id, client_secret } = await getGoogleAppKeys(); const redirect_uri = `${WEBAPP_URL_FOR_OAUTH}/api/integrations/googlecalendar/callback`; diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 8b78ed27695ed6..894dbb7f1ead86 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -9,7 +9,7 @@ import { MeetLocationType } from "@calcom/app-store/locations"; import dayjs from "@calcom/dayjs"; import { getFeatureFlag } from "@calcom/features/flags/server/utils"; import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser"; -import { CalendarAppConfigurationClientIdNotAuthorizedError } from "@calcom/lib/CalendarAppConfigurationError"; +import { CalendarAppConfigurationClientIdNotAuthorizedError, CalendarAppConfigurationDomainWideDelegationNotEnabledError } from "@calcom/lib/CalendarAppConfigurationError"; import type CalendarService from "@calcom/lib/CalendarService"; import { APP_CREDENTIAL_SHARING_ENABLED, @@ -199,8 +199,16 @@ export default class GoogleCalendarService implements Calendar { await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ user, }); + + const isDomainWideDelegationEnabled = domainWideDelegation && domainWideDelegation.enabled; - if (domainWideDelegation && domainWideDelegation.enabled && domainWideDelegation.serviceAccountKey) { + if (this.credential.delegatedToId && !isDomainWideDelegationEnabled) { + throw new CalendarAppConfigurationDomainWideDelegationNotEnabledError( + "Credential needs domain wide delegation enabled" + ); + } + + if (domainWideDelegation && domainWideDelegation.enabled) { const emailToImpersonate = this.credential.user?.email; if (!emailToImpersonate) { this.log.error("No email to impersonate found for domain wide delegation"); @@ -210,7 +218,7 @@ export default class GoogleCalendarService implements Calendar { "Using domain wide delegation with service account email", safeStringify({ serviceAccountEmail: domainWideDelegation.serviceAccountKey.client_email, - privateKey: domainWideDelegation.serviceAccountKey.private_key, + clientId: domainWideDelegation.serviceAccountKey.client_id, emailToImpersonate, }) ); @@ -245,6 +253,7 @@ export default class GoogleCalendarService implements Calendar { }, serviceAccountKeyIsSet: !!domainWideDelegation?.serviceAccountKey, credential: { + id: this.credential.id, userId: this.credential.userId, teamId: this.credential.teamId, }, diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index b8ec7b6c884160..8a7c1d044afa62 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -6,7 +6,7 @@ import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; import getApps from "@calcom/app-store/utils"; import dayjs from "@calcom/dayjs"; import { getUid } from "@calcom/lib/CalEventParser"; -import { CalendarAppConfigurationClientIdNotAuthorizedError } from "@calcom/lib/CalendarAppConfigurationError"; +import { CalendarAppConfigurationClientIdNotAuthorizedError, CalendarAppConfigurationError } from "@calcom/lib/CalendarAppConfigurationError"; import logger from "@calcom/lib/logger"; import { getPiiFreeCalendarEvent, getPiiFreeCredential } from "@calcom/lib/piiFreeData"; import { safeStringify } from "@calcom/lib/safeStringify"; @@ -49,13 +49,16 @@ export const getConnectedCalendars = async ( calendarCredentials.map(async (item) => { try { const { integration, credential } = item; + console.log("credential", credential); const calendar = await item.calendar; // Don't leak credentials to the client const credentialId = credential.id; + const domainWideDelegationCredentialId = credential.delegatedToId; if (!calendar) { return { integration, credentialId, + domainWideDelegationCredentialId, }; } const cals = await calendar.listCalendars(); @@ -68,6 +71,7 @@ export const getConnectedCalendars = async ( primary: cal.primary || null, isSelected: selectedCalendars.some((selected) => selected.externalId === cal.externalId), credentialId, + domainWideDelegationCredentialId, }; }), ["primary"] @@ -92,6 +96,7 @@ export const getConnectedCalendars = async ( return { integration: cleanIntegrationKeys(integration), credentialId, + domainWideDelegationCredentialId, primary, calendars, }; @@ -105,7 +110,7 @@ export const getConnectedCalendars = async ( } } - if (error instanceof CalendarAppConfigurationClientIdNotAuthorizedError) { + if (error instanceof CalendarAppConfigurationError) { errorMessage = error.message; } @@ -114,6 +119,7 @@ export const getConnectedCalendars = async ( return { integration: cleanIntegrationKeys(item.integration), credentialId: item.credential.id, + domainWideDelegationCredentialId: item.credential.delegatedToId, error: { message: errorMessage, }, diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 40799a2c308247..2601a14cd5130e 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -3,7 +3,6 @@ import type { DestinationCalendar, BookingReference } from "@prisma/client"; import { cloneDeep, merge } from "lodash"; import { v5 as uuidv5 } from "uuid"; import type { z } from "zod"; - import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; import { FAKE_DAILY_CREDENTIAL } from "@calcom/app-store/dailyvideo/lib/VideoApiAdapter"; import { appKeysSchema as calVideoKeysSchema } from "@calcom/app-store/dailyvideo/zod"; @@ -56,6 +55,10 @@ const latestCredentialFirst = (a: T, b: T) => { return b.id - a.id; }; +const delegatedCredentialFirst = (a: T, b: T) => { + return (b.delegatedToId ? 1: 0) - (a.delegatedToId ? 1: 0); +}; + export const getLocationRequestFromIntegration = (location: string) => { const eventLocationType = getLocationFromApp(location); if (eventLocationType) { @@ -101,7 +104,6 @@ export default class EventManager { videoCredentials: CredentialPayload[]; crmCredentials: CredentialPayload[]; appOptions: AppOptions; - /** * Takes an array of credentials and initializes a new instance of the EventManager. * @@ -121,7 +123,8 @@ export default class EventManager { (cred) => cred.type.endsWith("_calendar") && !cred.type.includes("other_calendar") ) //see https://github.com/calcom/cal.com/issues/11671#issue-1923600672 - .sort(latestCredentialFirst); + .sort(latestCredentialFirst).sort(delegatedCredentialFirst) + this.videoCredentials = appCredentials .filter((cred) => cred.type.endsWith("_video") || cred.type.endsWith("_conferencing")) // Whenever a new video connection is added, latest credentials are added with the highest ID. @@ -630,7 +633,7 @@ export default class EventManager { const [credential] = this.calendarCredentials.filter((cred) => !cred.type.endsWith("other_calendar")); if (credential) { const createdEvent = await createEvent(credential, event); - log.silly("Created Calendar event", safeStringify({ createdEvent })); + log.silly("Created Calendar event using credential", safeStringify({ credentialId:credential.id, createdEvent })); if (createdEvent) { createdEvents.push(createdEvent); } @@ -680,6 +683,7 @@ export default class EventManager { invalid: credentialFromDB.invalid, appId: credentialFromDB.appId, user: credentialFromDB.user, + delegatedToId: credentialFromDB.delegatedToId, }; } } @@ -870,6 +874,7 @@ export default class EventManager { invalid: credentialFromDB.invalid, appId: credentialFromDB.appId, user: credentialFromDB.user, + delegatedToId: credentialFromDB.delegatedToId, }; } } diff --git a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts index fc697f154eafd2..7dc319057351dd 100644 --- a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts +++ b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts @@ -5,13 +5,13 @@ import prisma from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import type { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import type { CredentialPayload } from "@calcom/types/Credential"; - +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; /** * Gets credentials from the user, team, and org if applicable * */ export const getAllCredentials = async ( - user: { id: number; username: string | null; credentials: CredentialPayload[] }, + user: { id: number; username: string | null; email: string ; credentials: CredentialPayload[] }, eventType: { userId?: number | null; team?: { id: number | null; parentId: number | null } | null; @@ -117,5 +117,8 @@ export const getAllCredentials = async ( } }); - return allCredentials; -}; + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({user: { + email: user.email, + }}); + return allCredentials.concat(domainWideDelegationCredentials); +}; \ No newline at end of file diff --git a/packages/features/calendars/CalendarSwitch.tsx b/packages/features/calendars/CalendarSwitch.tsx index 25c3c5a09c0437..bbdae5c8e7f266 100644 --- a/packages/features/calendars/CalendarSwitch.tsx +++ b/packages/features/calendars/CalendarSwitch.tsx @@ -17,9 +17,10 @@ export type ICalendarSwitchProps = { isLastItemInList?: boolean; destination?: boolean; credentialId: number; + domainWideDelegationCredentialId: string; }; const CalendarSwitch = (props: ICalendarSwitchProps) => { - const { title, externalId, type, isChecked, name, isLastItemInList = false, credentialId } = props; + const { title, externalId, type, isChecked, name, isLastItemInList = false, credentialId, domainWideDelegationCredentialId } = props; const [checkedInternal, setCheckedInternal] = useState(isChecked); const utils = trpc.useUtils(); const { t } = useLocale(); @@ -28,6 +29,7 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => { const body = { integration: type, externalId: externalId, + domainWideDelegationCredentialId: domainWideDelegationCredentialId ?? null }; if (isOn) { @@ -36,7 +38,7 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => { headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ ...body, credentialId }), + body: JSON.stringify({ ...body, credentialId, domainWideDelegationCredentialId: domainWideDelegationCredentialId ?? null }), }); if (!res.ok) { diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx index 5f133bf5d0e638..7c5d12c22aec61 100644 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -31,7 +31,7 @@ interface DelegationItemProps { slug: string; }; }; - toggleDelegation: (id: string) => void; + toggleDelegation: (delegation: DelegationItemProps["delegation"]) => void; onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; } @@ -56,7 +56,7 @@ function DelegationListItemActions({ onDelete, }: { delegation: DelegationItemProps["delegation"]; - toggleDelegation: (id: string) => void; + toggleDelegation: DelegationItemProps["toggleDelegation"] onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; }) { @@ -64,7 +64,7 @@ function DelegationListItemActions({ return (
    - toggleDelegation(delegation.id)} /> + toggleDelegation(delegation)} /> utils.viewer.domainWideDelegation.list.invalidate(), + onError: (error) => { + showToast(error.message, "error"); + }, + }); + const createMutation = trpc.viewer.domainWideDelegation.add.useMutation({ onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), onError: (error) => { @@ -278,14 +285,11 @@ function DomainWideDelegationList() { deleteMutation.mutate({ id }); }; - const toggleDelegation = (id: string) => { - const delegation = delegations?.find((d) => d.id === id); + const toggleDelegation = (delegation: DelegationItemProps["delegation"]) => { if (delegation) { - updateMutation.mutate({ - id, - workspacePlatformSlug: delegation.workspacePlatform.slug, + toggleEnabledMutation.mutate({ + id: delegation.id, enabled: !delegation.enabled, - domain: delegation.domain, }); } }; diff --git a/packages/lib/CalendarAppConfigurationError.ts b/packages/lib/CalendarAppConfigurationError.ts index 5ee28e2880cbc8..c8e134533276ca 100644 --- a/packages/lib/CalendarAppConfigurationError.ts +++ b/packages/lib/CalendarAppConfigurationError.ts @@ -11,3 +11,10 @@ export class CalendarAppConfigurationClientIdNotAuthorizedError extends Calendar this.name = "CalendarAppConfigurationClientIdNotAuthorizedError"; } } + +export class CalendarAppConfigurationDomainWideDelegationNotEnabledError extends CalendarAppConfigurationError { + constructor(message: string) { + super(message); + this.name = "CalendarAppConfigurationDomainWideDelegationNotEnabledError"; + } +} \ No newline at end of file diff --git a/packages/lib/getConnectedDestinationCalendars.ts b/packages/lib/getConnectedDestinationCalendars.ts index aaa05c1b367e92..bba87ab7bae7c9 100644 --- a/packages/lib/getConnectedDestinationCalendars.ts +++ b/packages/lib/getConnectedDestinationCalendars.ts @@ -3,8 +3,8 @@ import type { PrismaClient } from "@calcom/prisma"; import type { DestinationCalendar, SelectedCalendar, User } from "@calcom/prisma/client"; import { AppCategories } from "@calcom/prisma/enums"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; - -export type UserWithCalendars = Pick & { +import { getAllDomainWideDelegationCalendarCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; +export type UserWithCalendars = Pick & { selectedCalendars: Pick[]; destinationCalendar: DestinationCalendar | null; }; @@ -27,8 +27,11 @@ export async function getConnectedDestinationCalendars( select: credentialForCalendarServiceSelect, }); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCalendarCredentialsForUser({ user }); + const allCredentials = [...userCredentials, ...domainWideDelegationCredentials]; + // get user's credentials + their connected integrations - const calendarCredentials = getCalendarCredentials(userCredentials); + const calendarCredentials = getCalendarCredentials(allCredentials); // get all the connected integrations' calendars (from third party) const { connectedCalendars, destinationCalendar } = await getConnectedCalendars( @@ -60,6 +63,7 @@ export async function getConnectedDestinationCalendars( integration = "", externalId = "", credentialId, + domainWideDelegationCredentialId, email: primaryEmail, } = connectedCalendars[0].primary ?? {}; // Select the first calendar matching the primary by default since that will also be the destination calendar @@ -75,13 +79,18 @@ export async function getConnectedDestinationCalendars( }; } } + user.destinationCalendar = await prisma.destinationCalendar.create({ data: { userId: user.id, integration, externalId, - credentialId, primaryEmail, + ...(credentialId && credentialId > 0 ? { + credentialId, + } : { + domainWideDelegationCredentialId, + }), }, }); } else { diff --git a/packages/lib/server/domainWideDelegation.ts b/packages/lib/server/domainWideDelegation.ts new file mode 100644 index 00000000000000..639dfaba93ba84 --- /dev/null +++ b/packages/lib/server/domainWideDelegation.ts @@ -0,0 +1,54 @@ +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; +import logger from "@calcom/lib/logger"; +import { metadata as googleCalendarMetadata } from "@calcom/app-store/googlecalendar/_metadata"; + +export async function getAllDomainWideDelegationCredentialsForUser({ user }: { user: { email: string; id: number } }) { + const log = logger.getSubLogger({ prefix: ["getAllDomainWideDelegationCredentialsForUser"] }); + const domainWideDelegation = await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ + user: { + email: user.email, + }, + }); + + + if (!domainWideDelegation || !domainWideDelegation.enabled) { + return []; + } + + const workspacePlatforms = await WorkspacePlatformRepository.findAll(); + + const domainWideDelegationCredentials = workspacePlatforms + .map((workspacePlatform) => { + if (workspacePlatform.slug !== domainWideDelegation.workspacePlatform.slug) { + return null; + } + + return { + // A negative ID confirms it isn't in DB and workspace platform ID informs for which platform it is created. + // ID value shouldn't matter though as it is mainly for retrieving from DB only. + id: -workspacePlatform.id, + type: googleCalendarMetadata.type, + delegatedToId: domainWideDelegation.id, + appId: googleCalendarMetadata.slug, + userId: user.id, + user: { + email: user.email, + }, + key: { + access_token: "NOOP_UNUSED_DELEGATION_TOKEN", + }, + invalid: false, + teamId: null, + }; + }) + .filter((credential): credential is NonNullable => credential !== null); + + log.silly("getAllDomainWideDelegationCredentialsForUser", { domainWideDelegationCredentials }); + return domainWideDelegationCredentials; +} + +export async function getAllDomainWideDelegationCalendarCredentialsForUser({ user }: { user: { email: string; id: number } }) { + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + return domainWideDelegationCredentials.filter((credential) => credential.type.endsWith("_calendar")); +} \ No newline at end of file diff --git a/packages/lib/server/getUsersCredentials.ts b/packages/lib/server/getUsersCredentials.ts index 77560e97cf1420..ee9f9cbaee5dc7 100644 --- a/packages/lib/server/getUsersCredentials.ts +++ b/packages/lib/server/getUsersCredentials.ts @@ -1,7 +1,7 @@ import { prisma } from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; - +import { getAllDomainWideDelegationCredentialsForUser } from "./domainWideDelegation"; type SessionUser = NonNullable; type User = { id: SessionUser["id"] }; @@ -15,5 +15,7 @@ export async function getUsersCredentials(user: User) { id: "asc", }, }); - return credentials; + + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + return [...credentials, ...domainWideDelegationCredentials]; } diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index f4e2211c3721a5..979623c49f7270 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -23,7 +23,6 @@ const domainWideDelegationSafeSelect = { createdAt: true, updatedAt: true, organizationId: true, - serviceAccountKey: true, workspacePlatform: { select: { name: true, @@ -97,7 +96,7 @@ export class DomainWideDelegationRepository { select: domainWideDelegationSafeSelect, }); - return DomainWideDelegationRepository.withParsedServiceAccountKey(domainWideDelegation); + return domainWideDelegation } static async findByUserIncludeSensitiveServiceAccountKey({ @@ -107,7 +106,7 @@ export class DomainWideDelegationRepository { email: string; }; }) { - const log = repositoryLogger.getSubLogger({ prefix: ["findByUser"] }); + const log = repositoryLogger.getSubLogger({ prefix: ["findByUserIncludeSensitiveServiceAccountKey"] }); log.debug("called with", { user }); const organization = await OrganizationRepository.findByMemberEmailId({ email: user.email, @@ -143,28 +142,33 @@ export class DomainWideDelegationRepository { data, }: { id: string; - data: { + data: Partial<{ workspacePlatformId: number; domain: string; enabled: boolean; organizationId: number; - }; + }>; }) { + + const { workspacePlatformId, organizationId, ...rest } = data; return await prisma.domainWideDelegation.update({ where: { id }, data: { - workspacePlatform: { - connect: { - id: data.workspacePlatformId, + ...(workspacePlatformId && { + workspacePlatform: { + connect: { + id: workspacePlatformId, + }, }, - }, - domain: data.domain, - enabled: data.enabled, - organization: { - connect: { - id: data.organizationId, + }), + ...(organizationId && { + organization: { + connect: { + id: organizationId, + }, }, - }, + }), + ...rest, }, select: domainWideDelegationSafeSelect, }); diff --git a/packages/lib/server/repository/workspacePlatform.ts b/packages/lib/server/repository/workspacePlatform.ts index 8e3064c0c8f8fa..cbbd076b55e144 100644 --- a/packages/lib/server/repository/workspacePlatform.ts +++ b/packages/lib/server/repository/workspacePlatform.ts @@ -87,6 +87,7 @@ export class WorkspacePlatformRepository { return await prisma.workspacePlatform.update({ where: { id }, data, + select: safeWorkspacePlatformSelect, }); } } diff --git a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx index 48c6b5aba9f1ec..9cc2d0123dc48c 100644 --- a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx +++ b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx @@ -58,15 +58,16 @@ export const SelectedCalendarsSettingsWebWrapper = (props: SelectedCalendarsSett connectedCalendar.primary?.email ?? connectedCalendar.integration.description } className="border-subtle mt-4 rounded-lg border" - actions={ -
    - -
    + actions={!connectedCalendar.domainWideDelegationCredentialId && ( +
    + +
    + ) }>
    {!fromOnboarding && ( @@ -85,6 +86,7 @@ export const SelectedCalendarsSettingsWebWrapper = (props: SelectedCalendarsSett isChecked={cal.isSelected} destination={cal.externalId === props.destinationCalendarId} credentialId={cal.credentialId} + domainWideDelegationCredentialId={connectedCalendar.domainWideDelegationCredentialId} /> ))} diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index df28fb291f9f79..46854196f3dcaf 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -211,7 +211,8 @@ model DestinationCalendar { eventTypeId Int? @unique credentialId Int? credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade) - + domainWideDelegation DomainWideDelegation? @relation(fields: [domainWideDelegationCredentialId], references: [id], onDelete: Cascade) + domainWideDelegationCredentialId String? @@index([userId]) @@index([eventTypeId]) @@index([credentialId]) @@ -668,6 +669,8 @@ model SelectedCalendar { externalId String credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade) credentialId Int? + domainWideDelegationCredential DomainWideDelegation? @relation(fields: [domainWideDelegationCredentialId], references: [id], onDelete: Cascade) + domainWideDelegationCredentialId String? @@id([userId, integration, externalId]) @@index([userId]) @@ -1556,6 +1559,9 @@ model DomainWideDelegation { Credential Credential[] domain String + selectedCalendars SelectedCalendar[] + destinationCalendar DestinationCalendar[] + createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/packages/prisma/selects/credential.ts b/packages/prisma/selects/credential.ts index ad0730ccad1ced..c6c7916e409f35 100644 --- a/packages/prisma/selects/credential.ts +++ b/packages/prisma/selects/credential.ts @@ -13,6 +13,7 @@ export const credentialForCalendarServiceSelect = Prisma.validator()({ diff --git a/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts b/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts index 114c25e4c31739..a941433c94c394 100644 --- a/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts @@ -3,6 +3,7 @@ import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; import type { TAppCredentialsByTypeInputSchema } from "./appCredentialsByType.schema"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; type AppCredentialsByTypeOptions = { ctx: { @@ -31,10 +32,12 @@ export const appCredentialsByTypeHandler = async ({ ctx, input }: AppCredentials }, }); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + // For app pages need to return which teams the user can install the app on // return user.credentials.filter((app) => app.type == input.appType).map((credential) => credential.id); return { - credentials, + credentials: [...credentials, ...domainWideDelegationCredentials], userAdminTeams: userAdminTeamsIds, }; }; diff --git a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts b/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts index 2c6655dca929b2..3990588fe06787 100644 --- a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts @@ -28,9 +28,10 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati const { connectedCalendars } = await getConnectedCalendars(calendarCredentials, user.selectedCalendars); const allCals = connectedCalendars.map((cal) => cal.calendars ?? []).flat(); - const credentialId = allCals.find( + const cal = allCals.find( (cal) => cal.externalId === externalId && cal.integration === integration && cal.readOnly === false - )?.credentialId; + ) + const { credentialId, domainWideDelegationCredentialId } = cal || {}; if (!credentialId) { throw new TRPCError({ code: "BAD_REQUEST", message: `Could not find calendar ${input.externalId}` }); @@ -63,14 +64,22 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati update: { integration, externalId, - credentialId, + ...(credentialId && credentialId > 0 ? { + credentialId, + } : { + domainWideDelegationCredentialId, + }), primaryEmail, }, create: { ...where, integration, externalId, - credentialId, + ...(credentialId && credentialId > 0 ? { + credentialId, + } : { + domainWideDelegationCredentialId, + }), primaryEmail, }, }); diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts index 732da3a852e9d5..07fe5ee263537d 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/add.handler.ts @@ -1,18 +1,23 @@ import type { z } from "zod"; +import logger from "@calcom/lib/logger"; import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; -import { workspacePlatformCreateSchema } from "./schema"; + import { TRPCError } from "@trpc/server"; +import type { workspacePlatformCreateSchema } from "./schema"; +import { ensureNoServiceAccountKey } from "./utils"; + export default async function addHandler({ input, }: { input: z.infer; }) { try { - return await WorkspacePlatformRepository.create(input); + const workspacePlatform = await WorkspacePlatformRepository.create(input); + return ensureNoServiceAccountKey(workspacePlatform); } catch (error) { - console.error(error); + logger.error(error); throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to add workspace platform" }); } } diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts index eee263e0373685..94ffb3461143bf 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts @@ -1,10 +1,11 @@ import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; - +import { ensureNoServiceAccountKey } from "./utils"; import { TRPCError } from "@trpc/server"; export default async function listHandler() { try { - return await WorkspacePlatformRepository.findAll(); + const workspacePlatforms = await WorkspacePlatformRepository.findAll(); + return workspacePlatforms.map(ensureNoServiceAccountKey); } catch (error) { console.error(error); throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to fetch workspace platforms" }); diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts index 5291a5fe096d7f..55b861d3619fc9 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/toggleEnabled.handler.ts @@ -3,7 +3,7 @@ import type { z } from "zod"; import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; import type { workspacePlatformToggleEnabledSchema } from "./schema"; - +import { ensureNoServiceAccountKey } from "./utils"; export default async function toggleEnabledHandler({ input, }: { @@ -16,5 +16,5 @@ export default async function toggleEnabledHandler({ }, }); - return updatedWorkspacePlatform; + return ensureNoServiceAccountKey(updatedWorkspacePlatform); } diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts index 2434112dd1016b..9528ff0499d521 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/update.handler.ts @@ -5,7 +5,7 @@ import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/works import { TRPCError } from "@trpc/server"; import type { workspacePlatformUpdateSchema } from "./schema"; - +import { ensureNoServiceAccountKey } from "./utils"; export default async function updateHandler({ input, }: { @@ -19,9 +19,11 @@ export default async function updateHandler({ description: input.description, }, }); - return { workspacePlatform: updatedWorkspacePlatform }; + + return ensureNoServiceAccountKey(updatedWorkspacePlatform); } catch (error) { console.error(error); throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to update workspace platform" }); } } + \ No newline at end of file diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts index cc72c89fedde57..fd7516b3cd83bc 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts @@ -5,7 +5,7 @@ import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/works import { TRPCError } from "@trpc/server"; import type { workspacePlatformUpdateServiceAccountSchema } from "./schema"; - +import { ensureNoServiceAccountKey } from "./utils"; export default async function updateServiceAccountHandler({ input, }: { @@ -18,7 +18,7 @@ export default async function updateServiceAccountHandler({ defaultServiceAccountKey: input.defaultServiceAccountKey, }, }); - return { workspacePlatform: updatedWorkspacePlatform }; + return ensureNoServiceAccountKey(updatedWorkspacePlatform); } catch (error) { console.error(error); throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "Failed to update service account" }); diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/utils.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/utils.ts new file mode 100644 index 00000000000000..5679025bc4cec6 --- /dev/null +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/utils.ts @@ -0,0 +1,9 @@ +export function ensureNoServiceAccountKey( + workspacePlatform: T +) { + const { defaultServiceAccountKey: _1, ...rest } = workspacePlatform; + return { + ...rest, + defaultServiceAccountKey: undefined, + }; +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts index afd1985fb55d2f..96e6700bb8eaee 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts @@ -4,6 +4,7 @@ import { DomainWideDelegationCreateSchema, DomainWideDelegationUpdateSchema, DomainWideDelegationDeleteSchema, + DomainWideDelegationToggleEnabledSchema } from "./schema"; const NAMESPACE = "domainWideDelegation"; @@ -22,6 +23,10 @@ export const domainWideDelegationRouter = router({ const handler = await importHandler(namespaced("add"), () => import("./add.handler")); return handler(opts); }), + toggleEnabled: authedOrgAdminProcedure.input(DomainWideDelegationToggleEnabledSchema).mutation(async (opts) => { + const handler = await importHandler(namespaced("toggleEnabled"), () => import("./toggleEnabled.handler")); + return handler(opts); + }), delete: authedOrgAdminProcedure.input(DomainWideDelegationDeleteSchema).mutation(async (opts) => { const handler = await importHandler(namespaced("delete"), () => import("./delete.handler")); return handler(opts); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts index e137282c913ac0..29fda5aa31fefc 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts @@ -9,6 +9,10 @@ export const DomainWideDelegationUpdateSchema = z.object({ id: z.string(), workspacePlatformSlug: z.string(), domain: z.string(), +}); + +export const DomainWideDelegationToggleEnabledSchema = z.object({ + id: z.string(), enabled: z.boolean(), }); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts new file mode 100644 index 00000000000000..73b491be52d2da --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts @@ -0,0 +1,21 @@ +import type { z } from "zod"; + +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; + +import type { DomainWideDelegationToggleEnabledSchema } from "./schema"; +import { ensureNoServiceAccountKey } from "./utils"; + +export default async function toggleEnabledHandler({ + input, +}: { + input: z.infer; +}) { + const updatedDomainWideDelegation = await DomainWideDelegationRepository.updateById({ + id: input.id, + data: { + enabled: input.enabled, + }, + }); + + return ensureNoServiceAccountKey(updatedDomainWideDelegation); +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts index 59f45727b184bd..cb242d3b2aaade 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts @@ -5,7 +5,7 @@ import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/works import { TRPCError } from "@calcom/trpc/server"; import type { DomainWideDelegationUpdateSchema } from "./schema"; -import { handleDomainWideDelegationError } from "./utils"; +import { handleDomainWideDelegationError, ensureNoServiceAccountKey } from "./utils"; export default async function handler({ input, @@ -14,7 +14,7 @@ export default async function handler({ input: z.infer; ctx: { user: { id: number; organizationId: number | null } }; }) { - const { id, workspacePlatformSlug, domain, enabled } = input; + const { id, workspacePlatformSlug, domain } = input; const { user } = ctx; const { organizationId } = user; @@ -42,15 +42,12 @@ export default async function handler({ data: { workspacePlatformId: workspacePlatform.id, domain, - enabled, + enabled: true, organizationId, }, }); - return { - ...updatedDelegation, - serviceAccountKey: undefined, - }; + return ensureNoServiceAccountKey(updatedDelegation); } catch (error) { handleDomainWideDelegationError(error); } diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts index b35df50e04e290..375cca25089d3a 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts @@ -52,9 +52,8 @@ export const handleDomainWideDelegationError = (error: unknown) => { }); }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const ensureNoServiceAccountKey = (domainWideDelegation: T) => { - const { serviceAccountKey, ...rest } = domainWideDelegation; +export const ensureNoServiceAccountKey = (domainWideDelegation: T) => { + const { serviceAccountKey: _1, ...rest } = domainWideDelegation; return { ...rest, serviceAccountKey: undefined, diff --git a/packages/types/Credential.d.ts b/packages/types/Credential.d.ts index b794bbee3f30b7..c12e8fe0d48fa5 100644 --- a/packages/types/Credential.d.ts +++ b/packages/types/Credential.d.ts @@ -7,7 +7,9 @@ import type { Prisma } from "@prisma/client"; */ export type CredentialPayload = Prisma.CredentialGetPayload<{ select: typeof import("@calcom/prisma/selects/credential").credentialForCalendarServiceSelect; -}>; +}> & { + delegatedToId: string | null; +} export type CredentialFrontendPayload = Omit & { /** We should type error if keys are leaked to the frontend */ From c29e729206cd1fa063f9c9ce0cf148ef1577d60b Mon Sep 17 00:00:00 2001 From: Hariom Date: Sat, 21 Sep 2024 18:59:10 +0530 Subject: [PATCH 06/61] Remove enable toggle support from domainWideDelegation --- packages/app-store/googlecalendar/api/add.ts | 4 +- .../googlecalendar/lib/CalendarService.ts | 9 ++--- packages/core/CalendarManager.ts | 2 + .../pages/settings/domainWideDelegation.tsx | 37 ++++--------------- packages/lib/server/domainWideDelegation.ts | 2 +- .../server/repository/domainWideDelegation.ts | 4 -- packages/prisma/schema.prisma | 1 - .../viewer/domainWideDelegation/_router.ts | 5 --- .../domainWideDelegation/add.handler.ts | 1 - .../viewer/domainWideDelegation/schema.ts | 5 --- .../toggleEnabled.handler.ts | 21 ----------- .../domainWideDelegation/update.handler.ts | 1 - 12 files changed, 15 insertions(+), 77 deletions(-) delete mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index 0c85c09cee87af..fa2260825173f1 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -30,9 +30,9 @@ async function getDomainWideDelegationForApp({ email: user.email, }); - if (!domainWideDelegation || !domainWideDelegation.enabled || !appMetadata.domainWideDelegation) { + if (!domainWideDelegation || !appMetadata.domainWideDelegation) { log.debug("Domain-wide delegation isn't enabled for this app", { - domainWideDelegationEnabled: domainWideDelegation?.enabled, + domainWideDelegationIsThere: !!domainWideDelegation, metadataDomainWideDelegation: appMetadata.domainWideDelegation, }); return null; diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 894dbb7f1ead86..b44de769579c92 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -200,15 +200,14 @@ export default class GoogleCalendarService implements Calendar { user, }); - const isDomainWideDelegationEnabled = domainWideDelegation && domainWideDelegation.enabled; - if (this.credential.delegatedToId && !isDomainWideDelegationEnabled) { + if (this.credential.delegatedToId && !domainWideDelegation) { throw new CalendarAppConfigurationDomainWideDelegationNotEnabledError( "Credential needs domain wide delegation enabled" ); } - if (domainWideDelegation && domainWideDelegation.enabled) { + if (domainWideDelegation) { const emailToImpersonate = this.credential.user?.email; if (!emailToImpersonate) { this.log.error("No email to impersonate found for domain wide delegation"); @@ -248,9 +247,7 @@ export default class GoogleCalendarService implements Calendar { this.log.debug( "Not using domain wide delegation, using default OAuth2 client for Google Calendar", safeStringify({ - domainWideDelegation: { - enabled: domainWideDelegation?.enabled, - }, + domainWideDelegationIsThere: !!domainWideDelegation, serviceAccountKeyIsSet: !!domainWideDelegation?.serviceAccountKey, credential: { id: this.credential.id, diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index 8a7c1d044afa62..981f962c289203 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -128,6 +128,8 @@ export const getConnectedCalendars = async ( }) ); + console.log("connectedCalendars", JSON.stringify(connectedCalendars, null, 2)); + return { connectedCalendars, destinationCalendar }; }; diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx index 7c5d12c22aec61..3fd8dede6d8cd5 100644 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -24,14 +24,12 @@ interface DelegationItemProps { delegation: { id: string; domain: string; - enabled: boolean; serviceAccountClientId: string; workspacePlatform: { name: string; slug: string; }; }; - toggleDelegation: (delegation: DelegationItemProps["delegation"]) => void; onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; } @@ -51,12 +49,10 @@ function getWorkspacePlatformOptions(workspacePlatforms: WorkspacePlatform[]) { function DelegationListItemActions({ delegation, - toggleDelegation, onEdit, onDelete, }: { delegation: DelegationItemProps["delegation"]; - toggleDelegation: DelegationItemProps["toggleDelegation"] onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; }) { @@ -64,7 +60,6 @@ function DelegationListItemActions({ return (
    - toggleDelegation(delegation)} /> @@ -103,7 +98,6 @@ function DelegationListItem({ delegation, toggleDelegation, onEdit, onDelete }:
    @@ -120,12 +114,12 @@ function CreateDelegationDialog({ }: { isOpen: boolean; onClose: () => void; - onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string;}) => void; workspacePlatforms: WorkspacePlatform[]; }) { const { t } = useLocale(); - const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ + const form = useForm<{ domain: string; workspacePlatformSlug: string; }>({ defaultValues: { domain: "", workspacePlatformSlug: "", @@ -159,12 +153,12 @@ function EditDelegationDialog({ isOpen: boolean; onClose: () => void; delegation: DelegationItemProps["delegation"]; - onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; }) => void; workspacePlatforms: WorkspacePlatform[]; }) { const { t } = useLocale(); - const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ + const form = useForm<{ domain: string; workspacePlatformSlug: string;}>({ defaultValues: { domain: delegation.domain, workspacePlatformSlug: delegation.workspacePlatform.slug, @@ -224,7 +218,7 @@ function CreateEditDelegationDialog({ isOpen: boolean; onClose: () => void; delegation: DelegationItemProps["delegation"] | null; - onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; }) => void; workspacePlatforms: WorkspacePlatform[]; }) { if (delegation) { @@ -260,13 +254,6 @@ function DomainWideDelegationList() { }, }); - const toggleEnabledMutation = trpc.viewer.domainWideDelegation.toggleEnabled.useMutation({ - onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), - onError: (error) => { - showToast(error.message, "error"); - }, - }); - const createMutation = trpc.viewer.domainWideDelegation.add.useMutation({ onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), onError: (error) => { @@ -285,15 +272,6 @@ function DomainWideDelegationList() { deleteMutation.mutate({ id }); }; - const toggleDelegation = (delegation: DelegationItemProps["delegation"]) => { - if (delegation) { - toggleEnabledMutation.mutate({ - id: delegation.id, - enabled: !delegation.enabled, - }); - } - }; - const [createEditDialog, setCreateEditDialog] = useState<{ isOpen: boolean; delegation: DelegationItemProps["delegation"] | null; @@ -311,7 +289,7 @@ function DomainWideDelegationList() { const onCreateClick = () => setCreateEditDialog({ isOpen: true, delegation: null }); - const handleSubmit = (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => { + const handleSubmit = (data: { domain: string; workspacePlatformSlug: string; }) => { if (createEditDialog.delegation) { updateMutation.mutate({ id: createEditDialog.delegation.id, @@ -338,7 +316,6 @@ function DomainWideDelegationList() { diff --git a/packages/lib/server/domainWideDelegation.ts b/packages/lib/server/domainWideDelegation.ts index 639dfaba93ba84..19b45421f7b282 100644 --- a/packages/lib/server/domainWideDelegation.ts +++ b/packages/lib/server/domainWideDelegation.ts @@ -12,7 +12,7 @@ export async function getAllDomainWideDelegationCredentialsForUser({ user }: { u }); - if (!domainWideDelegation || !domainWideDelegation.enabled) { + if (!domainWideDelegation) { return []; } diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index 979623c49f7270..d2f7695fc8fe4f 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -18,7 +18,6 @@ const serviceAccountKeySchema = z const repositoryLogger = logger.getSubLogger({ prefix: ["DomainWideDelegationRepository"] }); const domainWideDelegationSafeSelect = { id: true, - enabled: true, domain: true, createdAt: true, updatedAt: true, @@ -51,7 +50,6 @@ export class DomainWideDelegationRepository { static async create(data: { domain: string; - enabled: boolean; organizationId: number; workspacePlatformId: number; serviceAccountKey: Exclude; @@ -64,7 +62,6 @@ export class DomainWideDelegationRepository { }, }, domain: data.domain, - enabled: data.enabled, organization: { connect: { id: data.organizationId, @@ -145,7 +142,6 @@ export class DomainWideDelegationRepository { data: Partial<{ workspacePlatformId: number; domain: string; - enabled: boolean; organizationId: number; }>; }) { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 46854196f3dcaf..53127353ba1d34 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1553,7 +1553,6 @@ model DomainWideDelegation { // Provides possibility to have different service accounts for different organizations if the need arises, but normally they should be the same serviceAccountKey Json - enabled Boolean @default(false) organizationId Int organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade) Credential Credential[] diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts index 96e6700bb8eaee..afd1985fb55d2f 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts @@ -4,7 +4,6 @@ import { DomainWideDelegationCreateSchema, DomainWideDelegationUpdateSchema, DomainWideDelegationDeleteSchema, - DomainWideDelegationToggleEnabledSchema } from "./schema"; const NAMESPACE = "domainWideDelegation"; @@ -23,10 +22,6 @@ export const domainWideDelegationRouter = router({ const handler = await importHandler(namespaced("add"), () => import("./add.handler")); return handler(opts); }), - toggleEnabled: authedOrgAdminProcedure.input(DomainWideDelegationToggleEnabledSchema).mutation(async (opts) => { - const handler = await importHandler(namespaced("toggleEnabled"), () => import("./toggleEnabled.handler")); - return handler(opts); - }), delete: authedOrgAdminProcedure.input(DomainWideDelegationDeleteSchema).mutation(async (opts) => { const handler = await importHandler(namespaced("delete"), () => import("./delete.handler")); return handler(opts); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts index aa8b696ef86521..548f92b8ebadef 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts @@ -52,7 +52,6 @@ export default async function handler({ const createdDelegation = await DomainWideDelegationRepository.create({ workspacePlatformId: workspacePlatform.id, domain, - enabled: true, organizationId, serviceAccountKey: workspacePlatform.defaultServiceAccountKey, }); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts index 29fda5aa31fefc..e4238aa1420933 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts @@ -11,11 +11,6 @@ export const DomainWideDelegationUpdateSchema = z.object({ domain: z.string(), }); -export const DomainWideDelegationToggleEnabledSchema = z.object({ - id: z.string(), - enabled: z.boolean(), -}); - export const DomainWideDelegationDeleteSchema = z.object({ id: z.string(), }); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts deleted file mode 100644 index 73b491be52d2da..00000000000000 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { z } from "zod"; - -import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; - -import type { DomainWideDelegationToggleEnabledSchema } from "./schema"; -import { ensureNoServiceAccountKey } from "./utils"; - -export default async function toggleEnabledHandler({ - input, -}: { - input: z.infer; -}) { - const updatedDomainWideDelegation = await DomainWideDelegationRepository.updateById({ - id: input.id, - data: { - enabled: input.enabled, - }, - }); - - return ensureNoServiceAccountKey(updatedDomainWideDelegation); -} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts index cb242d3b2aaade..bea925d00fc122 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts @@ -42,7 +42,6 @@ export default async function handler({ data: { workspacePlatformId: workspacePlatform.id, domain, - enabled: true, organizationId, }, }); From 3ece0d510f5de19b6b8644131f03748fcffdecc6 Mon Sep 17 00:00:00 2001 From: Hariom Date: Mon, 23 Sep 2024 12:53:38 +0530 Subject: [PATCH 07/61] Fixes --- TODO.md | 50 +++++++++++-------- apps/web/components/apps/AppPage.tsx | 18 +------ packages/app-store/_appRegistry.ts | 11 +++- .../googlecalendar/lib/CalendarService.ts | 37 ++++++++------ packages/core/CalendarManager.ts | 5 +- packages/core/EventManager.ts | 4 ++ packages/lib/CalendarAppConfigurationError.ts | 20 -------- packages/lib/defaultEvents.ts | 1 + packages/lib/server/domainWideDelegation.ts | 5 +- .../SelectedCalendarsSettingsWebWrapper.tsx | 12 +++-- .../viewer/domainWideDelegation/utils.ts | 5 +- 11 files changed, 82 insertions(+), 86 deletions(-) delete mode 100644 packages/lib/CalendarAppConfigurationError.ts diff --git a/TODO.md b/TODO.md index 67292da078539f..6fb2a488190158 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,5 @@ -- Important +## Version 1.0 +### Important - [x] Where should we show the user the client ID to enable domain wide delegation? - [x] It must be shown to the organization owner/admin only - [x] There could be multiple checkboxes per domain to enable domain wide delegation for a domain @@ -6,33 +7,40 @@ - Any domain can be added by a user - [x] Support multiple domains in DomainWideDelegation schema for an organization - [x] Use the domain as well to identify if the domain wide delegation is enabled - - [ ] Automatically mark a DomainWideDelegation to have status as "error" if there is an error during event creation using it. Note that we might not have a fallback to go to but we could inform the admin about it. + - [ ] Confirmation for DwD deletion + - [ ] Don't allow disabled platform to be selected in the UI for creation. + - We can restrict updating as well with that platform(i.e. show it in the list but not let it save) + - But we shouldn't stop showing it in the UI, otherwise it might get changed to some other platform due to Select's nature. + - [ ] If the user doesn't exist in Google Workspace, and the user has connected personal account, should we correctly use the personal account? + - [ ] Fix installed status not showing correctly on apps/index.tsx. Install button isn't disabled there. -Not Important for first release - - [ ] Show the correct error in banner and on installed apps page(calendar_error translation key) if there is an error listing calendars - - [ ] If the error is due to the email not being part of the google workspace, we could highlight this error[Low Priority] - - [ ] When a user installs the app via DWD, user should be redirected to the installation page that would show errors if any +### Follow-up release +- [ ] Just after creating Domain-wide delegation, there should be a check to ensure that the clientID has been added to the Workspace Platform and then only show it as enabled. -To discuss + +### To discuss - [ ] 1. When the calendar is connect the first calendar isn't enabled to check for double bookings. Should we toggle that? - - [ ] 2. If admin disables DWD , what happens to already installed credentials? There will be no fallback for most users as they simply didn't have their own connection. In such a case, first of all we should make it really difficult to disable DWD, with clear confirmations from user. - Then, we should show an actionable error instead of calendar_error that would ask them - - Bigger Question is how do we ensure that users don't have to install the app. The connection should be preinstalled - - DB Update Approach - This is costly performance wise as there could be indexed on credentials and that makes inserts slow - - When DWD is enabled, we create the credentials for all the members of the organization(in batches) - - When DWD is disabled, we delete the credentials for all the members of the organization(in batches) - - When an org member is added, we add the credentials for them - - When an org member is removed, we delete the credentials for them - - In Memory Approach - - We refactor credential getting logic to be done through a service which would have all the logic to get the credentials. There we can have a way to return a dummy credential if DWD is enabled. - - -Security Testing + +### Security Testing - [ ] Because a single credential controls all the emails calendars, can someone not authorized trick us into giving access to some other organization's calendars? - [ ] We need to really make sure that service account key is NEVER exposed - [x] We don't even let the admin user see the added service account key. - [ ] We intend to implement Workload Identity Federation in the future. +### Testing +- [ ] Inviting a new user. + - Verified that Google Calendar is shown pre-installed. + - How about Google Meet? +- [ ] Troubleshooter. Seems to be not working + +### Documentation +- After enabling domain-wide delegation, the credential is shown pre-installed and the connection can't be removed(or the app can't be uninstalled by user) +- Steps + - App admin will first create a Workspace Platform and then organization owner/admin can enable domain-wide delegation for a domain + - As soon as domain-wide delegation is created, it would start taking preference over the personal credentials of the organization members and it would be used for that. Version-2.0 -- Workload Identity Federation to ensure that the service account key is never stored in DB. \ No newline at end of file +- Workload Identity Federation to ensure that the service account key is never stored in DB. + + + diff --git a/apps/web/components/apps/AppPage.tsx b/apps/web/components/apps/AppPage.tsx index 47be2d57c2ace6..ea4fe26af9e58c 100644 --- a/apps/web/components/apps/AppPage.tsx +++ b/apps/web/components/apps/AppPage.tsx @@ -18,22 +18,6 @@ import type { App as AppType } from "@calcom/types/App"; import { Badge, Button, Icon, SkeletonButton, SkeletonText, showToast } from "@calcom/ui"; import { InstallAppButtonChild } from "./InstallAppButtonChild"; - -function isAllowedMultipleInstalls({ - categories, - variant, -}: { - categories: string[]; - variant: string; -}): boolean { - // TODO: We have disable multiple installs for Domain-wide delegation cases - // Right now the API route handles it but we should have it here as well - // Though we might want to enable it later. Because, Domain-wide Delegated credentials would be considered pre-installed - const isCalendarApp = categories.includes("calendar"); - const isOtherVariant = variant === "other"; - return isCalendarApp && !isOtherVariant; -} - export type AppPageProps = { name: string; description: AppType["description"]; @@ -179,7 +163,7 @@ export const AppPage = ({ // variant not other allows, an app to be shown in calendar category without requiring an actual calendar connection e.g. vimcal // Such apps, can only be installed once. - const allowedMultipleInstalls = isAllowedMultipleInstalls({ categories, variant }); + const allowedMultipleInstalls = categories.indexOf("calendar") > -1 && variant !== "other"; useEffect(() => { if (searchParams?.get("defaultInstall") === "true") { mutation.mutate({ type, variant, slug, defaultInstall: true }); diff --git a/packages/app-store/_appRegistry.ts b/packages/app-store/_appRegistry.ts index 0999a76e53debf..9bfbe1378c2f2d 100644 --- a/packages/app-store/_appRegistry.ts +++ b/packages/app-store/_appRegistry.ts @@ -6,6 +6,7 @@ import prisma, { safeAppSelect, safeCredentialSelect } from "@calcom/prisma"; import { userMetadata } from "@calcom/prisma/zod-utils"; import type { AppFrontendPayload as App } from "@calcom/types/App"; import type { CredentialFrontendPayload as Credential } from "@calcom/types/Credential"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; export type TDependencyData = { name?: string; @@ -79,15 +80,22 @@ export async function getAppRegistryWithCredentials(userId: number, userAdminTea }, }, }); + + const user = await prisma.user.findUnique({ where: { id: userId, }, select: { + email: true, + id: true, metadata: true, }, }); + + const domainWideDelegationCredentials = user ? await getAllDomainWideDelegationCredentialsForUser({ user: {id:userId, email: user.email} }) : []; + const usersDefaultApp = userMetadata.parse(user?.metadata)?.defaultConferencingApp?.appSlug; const apps = [] as (App & { credentials: Credential[]; @@ -95,6 +103,7 @@ export async function getAppRegistryWithCredentials(userId: number, userAdminTea })[]; const installCountPerApp = await getInstallCountPerApp(); for await (const dbapp of dbApps) { + const allCredentials = [...dbapp.credentials, ...domainWideDelegationCredentials]; const app = await getAppWithMetadata(dbapp); if (!app) continue; // Skip if app isn't installed @@ -116,7 +125,7 @@ export async function getAppRegistryWithCredentials(userId: number, userAdminTea apps.push({ ...app, categories: dbapp.categories, - credentials: dbapp.credentials, + credentials: allCredentials, installed: true, installCount: installCountPerApp[dbapp.slug] || 0, isDefault: usersDefaultApp === dbapp.slug, diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index b44de769579c92..6f3021b1f4d944 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -9,7 +9,7 @@ import { MeetLocationType } from "@calcom/app-store/locations"; import dayjs from "@calcom/dayjs"; import { getFeatureFlag } from "@calcom/features/flags/server/utils"; import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser"; -import { CalendarAppConfigurationClientIdNotAuthorizedError, CalendarAppConfigurationDomainWideDelegationNotEnabledError } from "@calcom/lib/CalendarAppConfigurationError"; +import { CalendarAppDomainWideDelegationClientIdNotAuthorizedError, CalendarAppDomainWideDelegationNotSetupError, CalendarAppDomainWideDelegationInvalidGrantError, CalendarAppDomainWideDelegationError } from "@calcom/lib/CalendarAppError"; import type CalendarService from "@calcom/lib/CalendarService"; import { APP_CREDENTIAL_SHARING_ENABLED, @@ -202,8 +202,8 @@ export default class GoogleCalendarService implements Calendar { if (this.credential.delegatedToId && !domainWideDelegation) { - throw new CalendarAppConfigurationDomainWideDelegationNotEnabledError( - "Credential needs domain wide delegation enabled" + throw new CalendarAppDomainWideDelegationNotSetupError( + "Credential needs domain wide delegation to be setup" ); } @@ -213,14 +213,7 @@ export default class GoogleCalendarService implements Calendar { this.log.error("No email to impersonate found for domain wide delegation"); return null; } - this.log.debug( - "Using domain wide delegation with service account email", - safeStringify({ - serviceAccountEmail: domainWideDelegation.serviceAccountKey.client_email, - clientId: domainWideDelegation.serviceAccountKey.client_id, - emailToImpersonate, - }) - ); + const authClient = new JWT({ email: domainWideDelegation.serviceAccountKey.client_email, key: domainWideDelegation.serviceAccountKey.private_key, @@ -231,14 +224,30 @@ export default class GoogleCalendarService implements Calendar { try { await authClient.authorize(); } catch (error) { + this.log.error("Error authorizing domain wide delegation", JSON.stringify(error)); + if ((error as any).response?.data?.error === "unauthorized_client") { - throw new CalendarAppConfigurationClientIdNotAuthorizedError( + throw new CalendarAppDomainWideDelegationClientIdNotAuthorizedError( "Make sure that the Client ID for the domain wide delegation is added to the Google Workspace Admin Console" ); } - throw error; - } + + if (error.response?.data?.error === "invalid_grant") { + throw new CalendarAppDomainWideDelegationInvalidGrantError("User might not exist in Google Workspace"); + } + // Catch all error + throw new CalendarAppDomainWideDelegationError("Error authorizing domain wide delegation"); + } + + this.log.debug( + "Using domain wide delegation with service account email", + safeStringify({ + serviceAccountEmail: domainWideDelegation.serviceAccountKey.client_email, + clientId: domainWideDelegation.serviceAccountKey.client_id, + emailToImpersonate, + }) + ); return google.calendar({ version: "v3", auth: authClient, diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index 981f962c289203..42406926d25ca6 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -6,7 +6,7 @@ import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; import getApps from "@calcom/app-store/utils"; import dayjs from "@calcom/dayjs"; import { getUid } from "@calcom/lib/CalEventParser"; -import { CalendarAppConfigurationClientIdNotAuthorizedError, CalendarAppConfigurationError } from "@calcom/lib/CalendarAppConfigurationError"; +import { CalendarAppDomainWideDelegationClientIdNotAuthorizedError, CalendarAppDomainWideDelegationError } from "@calcom/lib/CalendarAppError"; import logger from "@calcom/lib/logger"; import { getPiiFreeCalendarEvent, getPiiFreeCredential } from "@calcom/lib/piiFreeData"; import { safeStringify } from "@calcom/lib/safeStringify"; @@ -110,7 +110,7 @@ export const getConnectedCalendars = async ( } } - if (error instanceof CalendarAppConfigurationError) { + if (error instanceof CalendarAppDomainWideDelegationError) { errorMessage = error.message; } @@ -128,7 +128,6 @@ export const getConnectedCalendars = async ( }) ); - console.log("connectedCalendars", JSON.stringify(connectedCalendars, null, 2)); return { connectedCalendars, destinationCalendar }; }; diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 2601a14cd5130e..2d13700cc1c162 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -138,6 +138,10 @@ export default class EventManager { this.appOptions = this.generateAppOptions(eventTypeAppMetadata); } + private async getCalendarCredentials () { + return this.calendarCredentials; + } + /** * Takes a CalendarEvent and creates all necessary integration entries for it. * When a video integration is chosen as the event's location, a video integration diff --git a/packages/lib/CalendarAppConfigurationError.ts b/packages/lib/CalendarAppConfigurationError.ts deleted file mode 100644 index c8e134533276ca..00000000000000 --- a/packages/lib/CalendarAppConfigurationError.ts +++ /dev/null @@ -1,20 +0,0 @@ -export class CalendarAppConfigurationError extends Error { - constructor(message: string) { - super(message); - this.name = "CalendarAppConfigurationError"; - } -} - -export class CalendarAppConfigurationClientIdNotAuthorizedError extends CalendarAppConfigurationError { - constructor(message: string) { - super(message); - this.name = "CalendarAppConfigurationClientIdNotAuthorizedError"; - } -} - -export class CalendarAppConfigurationDomainWideDelegationNotEnabledError extends CalendarAppConfigurationError { - constructor(message: string) { - super(message); - this.name = "CalendarAppConfigurationDomainWideDelegationNotEnabledError"; - } -} \ No newline at end of file diff --git a/packages/lib/defaultEvents.ts b/packages/lib/defaultEvents.ts index f28cebcaf1f4c9..28bfec4ca12bd2 100644 --- a/packages/lib/defaultEvents.ts +++ b/packages/lib/defaultEvents.ts @@ -52,6 +52,7 @@ const user: User & { credentials: CredentialPayload[] } = { travelSchedules: [], }; + const customInputs: CustomInputSchema[] = []; const commons = { diff --git a/packages/lib/server/domainWideDelegation.ts b/packages/lib/server/domainWideDelegation.ts index 19b45421f7b282..0468116caeab47 100644 --- a/packages/lib/server/domainWideDelegation.ts +++ b/packages/lib/server/domainWideDelegation.ts @@ -25,9 +25,8 @@ export async function getAllDomainWideDelegationCredentialsForUser({ user }: { u } return { - // A negative ID confirms it isn't in DB and workspace platform ID informs for which platform it is created. - // ID value shouldn't matter though as it is mainly for retrieving from DB only. - id: -workspacePlatform.id, + // A negative ID confirms it isn't in DB. The code using this credential would check for -1 and use delegatedToId instead + id: -1, type: googleCalendarMetadata.type, delegatedToId: domainWideDelegation.id, appId: googleCalendarMetadata.slug, diff --git a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx index 9cc2d0123dc48c..abe2e8be76d9a4 100644 --- a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx +++ b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsWebWrapper.tsx @@ -111,14 +111,16 @@ export const SelectedCalendarsSettingsWebWrapper = (props: SelectedCalendarsSett } iconClassName="h-10 w-10 ml-2 mr-1 mt-0.5" actions={ -
    - + -
    + buttonProps={{ className: "border border-default" }} + /> +
    + ) } /> ); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts index 375cca25089d3a..03be51aeb7ec1e 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts @@ -3,7 +3,8 @@ import { z } from "zod"; import type { Prisma } from "@calcom/prisma/client"; import { TRPCError } from "@trpc/server"; - +import logger from "@calcom/lib/logger"; +const log = logger.getSubLogger({ prefix: ["domainWideDelegation/utils"] }); export class InvalidServiceAccountKeyError extends Error { constructor(message: string) { super(message); @@ -45,7 +46,7 @@ export const handleDomainWideDelegationError = (error: unknown) => { throw error; } - console.error("Error handling domain-wide delegation:", error); + log.error("Error handling domain-wide delegation:", safeStringify(error)); throw new TRPCError({ code: "INTERNAL_SERVER_ERROR", message: "An error occurred while handling domain-wide delegation settings.", From cc0b5ea5e2486634231c25987215ec88b76572ff Mon Sep 17 00:00:00 2001 From: Hariom Date: Mon, 23 Sep 2024 12:55:35 +0530 Subject: [PATCH 08/61] Revert "Remove enable toggle support from domainWideDelegation" This reverts commit c29e729206cd1fa063f9c9ce0cf148ef1577d60b. --- packages/app-store/googlecalendar/api/add.ts | 4 +- .../googlecalendar/lib/CalendarService.ts | 11 +++-- packages/core/CalendarManager.ts | 1 - .../pages/settings/domainWideDelegation.tsx | 37 +++++++++++++---- packages/lib/CalendarAppError.ts | 41 +++++++++++++++++++ packages/lib/server/domainWideDelegation.ts | 2 +- .../server/repository/domainWideDelegation.ts | 4 ++ packages/prisma/schema.prisma | 1 + .../viewer/domainWideDelegation/_router.ts | 5 +++ .../domainWideDelegation/add.handler.ts | 1 + .../viewer/domainWideDelegation/schema.ts | 5 +++ .../toggleEnabled.handler.ts | 21 ++++++++++ .../domainWideDelegation/update.handler.ts | 1 + 13 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 packages/lib/CalendarAppError.ts create mode 100644 packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index fa2260825173f1..0c85c09cee87af 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -30,9 +30,9 @@ async function getDomainWideDelegationForApp({ email: user.email, }); - if (!domainWideDelegation || !appMetadata.domainWideDelegation) { + if (!domainWideDelegation || !domainWideDelegation.enabled || !appMetadata.domainWideDelegation) { log.debug("Domain-wide delegation isn't enabled for this app", { - domainWideDelegationIsThere: !!domainWideDelegation, + domainWideDelegationEnabled: domainWideDelegation?.enabled, metadataDomainWideDelegation: appMetadata.domainWideDelegation, }); return null; diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 6f3021b1f4d944..ba2c7a2b771ae3 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -200,14 +200,15 @@ export default class GoogleCalendarService implements Calendar { user, }); + const isDomainWideDelegationEnabled = domainWideDelegation && domainWideDelegation.enabled; - if (this.credential.delegatedToId && !domainWideDelegation) { + if (this.credential.delegatedToId && !isDomainWideDelegationEnabled) { throw new CalendarAppDomainWideDelegationNotSetupError( - "Credential needs domain wide delegation to be setup" + "Credential needs domain wide delegation to be setup and enabled" ); } - if (domainWideDelegation) { + if (domainWideDelegation && domainWideDelegation.enabled) { const emailToImpersonate = this.credential.user?.email; if (!emailToImpersonate) { this.log.error("No email to impersonate found for domain wide delegation"); @@ -256,7 +257,9 @@ export default class GoogleCalendarService implements Calendar { this.log.debug( "Not using domain wide delegation, using default OAuth2 client for Google Calendar", safeStringify({ - domainWideDelegationIsThere: !!domainWideDelegation, + domainWideDelegation: { + enabled: domainWideDelegation?.enabled, + }, serviceAccountKeyIsSet: !!domainWideDelegation?.serviceAccountKey, credential: { id: this.credential.id, diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index 42406926d25ca6..3ffc3c800cbe6f 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -128,7 +128,6 @@ export const getConnectedCalendars = async ( }) ); - return { connectedCalendars, destinationCalendar }; }; diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx index 3fd8dede6d8cd5..7c5d12c22aec61 100644 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -24,12 +24,14 @@ interface DelegationItemProps { delegation: { id: string; domain: string; + enabled: boolean; serviceAccountClientId: string; workspacePlatform: { name: string; slug: string; }; }; + toggleDelegation: (delegation: DelegationItemProps["delegation"]) => void; onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; } @@ -49,10 +51,12 @@ function getWorkspacePlatformOptions(workspacePlatforms: WorkspacePlatform[]) { function DelegationListItemActions({ delegation, + toggleDelegation, onEdit, onDelete, }: { delegation: DelegationItemProps["delegation"]; + toggleDelegation: DelegationItemProps["toggleDelegation"] onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; }) { @@ -60,6 +64,7 @@ function DelegationListItemActions({ return (
    + toggleDelegation(delegation)} /> @@ -98,6 +103,7 @@ function DelegationListItem({ delegation, onEdit, onDelete }: DelegationItemProp
    @@ -114,12 +120,12 @@ function CreateDelegationDialog({ }: { isOpen: boolean; onClose: () => void; - onSubmit: (data: { domain: string; workspacePlatformSlug: string;}) => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; workspacePlatforms: WorkspacePlatform[]; }) { const { t } = useLocale(); - const form = useForm<{ domain: string; workspacePlatformSlug: string; }>({ + const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ defaultValues: { domain: "", workspacePlatformSlug: "", @@ -153,12 +159,12 @@ function EditDelegationDialog({ isOpen: boolean; onClose: () => void; delegation: DelegationItemProps["delegation"]; - onSubmit: (data: { domain: string; workspacePlatformSlug: string; }) => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; workspacePlatforms: WorkspacePlatform[]; }) { const { t } = useLocale(); - const form = useForm<{ domain: string; workspacePlatformSlug: string;}>({ + const form = useForm<{ domain: string; workspacePlatformSlug: string; enabled: boolean }>({ defaultValues: { domain: delegation.domain, workspacePlatformSlug: delegation.workspacePlatform.slug, @@ -218,7 +224,7 @@ function CreateEditDelegationDialog({ isOpen: boolean; onClose: () => void; delegation: DelegationItemProps["delegation"] | null; - onSubmit: (data: { domain: string; workspacePlatformSlug: string; }) => void; + onSubmit: (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => void; workspacePlatforms: WorkspacePlatform[]; }) { if (delegation) { @@ -254,6 +260,13 @@ function DomainWideDelegationList() { }, }); + const toggleEnabledMutation = trpc.viewer.domainWideDelegation.toggleEnabled.useMutation({ + onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), + onError: (error) => { + showToast(error.message, "error"); + }, + }); + const createMutation = trpc.viewer.domainWideDelegation.add.useMutation({ onSuccess: () => utils.viewer.domainWideDelegation.list.invalidate(), onError: (error) => { @@ -272,6 +285,15 @@ function DomainWideDelegationList() { deleteMutation.mutate({ id }); }; + const toggleDelegation = (delegation: DelegationItemProps["delegation"]) => { + if (delegation) { + toggleEnabledMutation.mutate({ + id: delegation.id, + enabled: !delegation.enabled, + }); + } + }; + const [createEditDialog, setCreateEditDialog] = useState<{ isOpen: boolean; delegation: DelegationItemProps["delegation"] | null; @@ -289,7 +311,7 @@ function DomainWideDelegationList() { const onCreateClick = () => setCreateEditDialog({ isOpen: true, delegation: null }); - const handleSubmit = (data: { domain: string; workspacePlatformSlug: string; }) => { + const handleSubmit = (data: { domain: string; workspacePlatformSlug: string; enabled: boolean }) => { if (createEditDialog.delegation) { updateMutation.mutate({ id: createEditDialog.delegation.id, @@ -316,6 +338,7 @@ function DomainWideDelegationList() { diff --git a/packages/lib/CalendarAppError.ts b/packages/lib/CalendarAppError.ts new file mode 100644 index 00000000000000..5dfbf7e3dccd9f --- /dev/null +++ b/packages/lib/CalendarAppError.ts @@ -0,0 +1,41 @@ +export class CalendarAppError extends Error { + constructor(message: string) { + super(message); + this.name = "CalendarAppError"; + } +} + +export class CalendarAppDomainWideDelegationError extends CalendarAppError { + constructor(message: string) { + super(message); + this.name = "CalendarAppDomainWideDelegationError"; + } +} + +export class CalendarAppDomainWideDelegationConfigurationError extends CalendarAppDomainWideDelegationError { + constructor(message: string) { + super(message); + this.name = "CalendarAppDomainWideDelegationConfigurationError"; + } +} + +export class CalendarAppDomainWideDelegationInvalidGrantError extends CalendarAppDomainWideDelegationError { + constructor(message: string) { + super(message); + this.name = "CalendarAppDomainWideDelegationInvalidGrantError"; + } +} + +export class CalendarAppDomainWideDelegationClientIdNotAuthorizedError extends CalendarAppDomainWideDelegationConfigurationError { + constructor(message: string) { + super(message); + this.name = "CalendarAppDomainWideDelegationClientIdNotAuthorizedError"; + } +} + +export class CalendarAppDomainWideDelegationNotSetupError extends CalendarAppDomainWideDelegationConfigurationError { + constructor(message: string) { + super(message); + this.name = "CalendarAppDomainWideDelegationNotSetupError"; + } +} \ No newline at end of file diff --git a/packages/lib/server/domainWideDelegation.ts b/packages/lib/server/domainWideDelegation.ts index 0468116caeab47..c28c4dcc95d467 100644 --- a/packages/lib/server/domainWideDelegation.ts +++ b/packages/lib/server/domainWideDelegation.ts @@ -12,7 +12,7 @@ export async function getAllDomainWideDelegationCredentialsForUser({ user }: { u }); - if (!domainWideDelegation) { + if (!domainWideDelegation || !domainWideDelegation.enabled) { return []; } diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index d2f7695fc8fe4f..979623c49f7270 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -18,6 +18,7 @@ const serviceAccountKeySchema = z const repositoryLogger = logger.getSubLogger({ prefix: ["DomainWideDelegationRepository"] }); const domainWideDelegationSafeSelect = { id: true, + enabled: true, domain: true, createdAt: true, updatedAt: true, @@ -50,6 +51,7 @@ export class DomainWideDelegationRepository { static async create(data: { domain: string; + enabled: boolean; organizationId: number; workspacePlatformId: number; serviceAccountKey: Exclude; @@ -62,6 +64,7 @@ export class DomainWideDelegationRepository { }, }, domain: data.domain, + enabled: data.enabled, organization: { connect: { id: data.organizationId, @@ -142,6 +145,7 @@ export class DomainWideDelegationRepository { data: Partial<{ workspacePlatformId: number; domain: string; + enabled: boolean; organizationId: number; }>; }) { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 53127353ba1d34..46854196f3dcaf 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1553,6 +1553,7 @@ model DomainWideDelegation { // Provides possibility to have different service accounts for different organizations if the need arises, but normally they should be the same serviceAccountKey Json + enabled Boolean @default(false) organizationId Int organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade) Credential Credential[] diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts index afd1985fb55d2f..96e6700bb8eaee 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/_router.ts @@ -4,6 +4,7 @@ import { DomainWideDelegationCreateSchema, DomainWideDelegationUpdateSchema, DomainWideDelegationDeleteSchema, + DomainWideDelegationToggleEnabledSchema } from "./schema"; const NAMESPACE = "domainWideDelegation"; @@ -22,6 +23,10 @@ export const domainWideDelegationRouter = router({ const handler = await importHandler(namespaced("add"), () => import("./add.handler")); return handler(opts); }), + toggleEnabled: authedOrgAdminProcedure.input(DomainWideDelegationToggleEnabledSchema).mutation(async (opts) => { + const handler = await importHandler(namespaced("toggleEnabled"), () => import("./toggleEnabled.handler")); + return handler(opts); + }), delete: authedOrgAdminProcedure.input(DomainWideDelegationDeleteSchema).mutation(async (opts) => { const handler = await importHandler(namespaced("delete"), () => import("./delete.handler")); return handler(opts); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts index 548f92b8ebadef..aa8b696ef86521 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/add.handler.ts @@ -52,6 +52,7 @@ export default async function handler({ const createdDelegation = await DomainWideDelegationRepository.create({ workspacePlatformId: workspacePlatform.id, domain, + enabled: true, organizationId, serviceAccountKey: workspacePlatform.defaultServiceAccountKey, }); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts index e4238aa1420933..29fda5aa31fefc 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/schema.ts @@ -11,6 +11,11 @@ export const DomainWideDelegationUpdateSchema = z.object({ domain: z.string(), }); +export const DomainWideDelegationToggleEnabledSchema = z.object({ + id: z.string(), + enabled: z.boolean(), +}); + export const DomainWideDelegationDeleteSchema = z.object({ id: z.string(), }); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts new file mode 100644 index 00000000000000..73b491be52d2da --- /dev/null +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts @@ -0,0 +1,21 @@ +import type { z } from "zod"; + +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; + +import type { DomainWideDelegationToggleEnabledSchema } from "./schema"; +import { ensureNoServiceAccountKey } from "./utils"; + +export default async function toggleEnabledHandler({ + input, +}: { + input: z.infer; +}) { + const updatedDomainWideDelegation = await DomainWideDelegationRepository.updateById({ + id: input.id, + data: { + enabled: input.enabled, + }, + }); + + return ensureNoServiceAccountKey(updatedDomainWideDelegation); +} diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts index bea925d00fc122..cb242d3b2aaade 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/update.handler.ts @@ -42,6 +42,7 @@ export default async function handler({ data: { workspacePlatformId: workspacePlatform.id, domain, + enabled: true, organizationId, }, }); From 6a38c56d7e2280d16bf81e51b210b5c591739d1a Mon Sep 17 00:00:00 2001 From: Hariom Date: Mon, 23 Sep 2024 12:56:11 +0530 Subject: [PATCH 09/61] Revert yarn.lock --- yarn.lock | 5726 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 5648 insertions(+), 78 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9c01de6b224d8e..ea454f9be3d297 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,46 @@ __metadata: version: 6 cacheKey: 8 +"@0no-co/graphql.web@npm:^1.0.1": + version: 1.0.8 + resolution: "@0no-co/graphql.web@npm:1.0.8" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + checksum: 5bd3ac2a55401c6d47e8af479170e1ae3b38c80847203d5b445f281f36e68ac11e6a6400e43e90b382d38f704721dd46acaab1088239362b9290b536a9e7d707 + languageName: node + linkType: hard + +"@47ng/cloak@npm:^1.1.0": + version: 1.1.0 + resolution: "@47ng/cloak@npm:1.1.0" + 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 + bin: + cloak: dist/cli.js + checksum: 7d72c66ff7837368e9ca8f5ba402d72041427eb47c53c340b4640e3352f2956d8673a4a8e97591fb2b9dfe27f3d2765bcd925617273ef2488df2565c77c78299 + languageName: node + linkType: hard + +"@47ng/codec@npm:^1.0.1": + version: 1.1.0 + resolution: "@47ng/codec@npm:1.1.0" + dependencies: + "@stablelib/base64": ^1.0.1 + "@stablelib/hex": ^1.0.1 + checksum: 4f780c4413fe78bbedbaff4135340c0e5f5a30df88f5cffbec51349eb0a1c909728e6c2bbda52506ff8c12653bf39b78c67b78bbe9501b0b9741da0cdaeec6ff + languageName: node + linkType: hard + "@aashutoshrathi/word-wrap@npm:^1.2.3": version: 1.2.6 resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" @@ -19,6 +59,17 @@ __metadata: languageName: node linkType: hard +"@algora/sdk@npm:^0.1.2": + version: 0.1.3 + resolution: "@algora/sdk@npm:0.1.3" + dependencies: + "@trpc/client": ^10.0.0 + "@trpc/server": ^10.0.0 + superjson: ^1.9.1 + checksum: 1b99e0f155181beefe12b625969166f4ecfa42d334706224d0a9a4e9ad72e2cda7335712c47290df7aeeeb003a9773ff5babce7cbee8fb8d1c5ded4ad81c80c1 + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -163,6 +214,44 @@ __metadata: languageName: node linkType: hard +"@ardatan/relay-compiler@npm:12.0.0": + version: 12.0.0 + resolution: "@ardatan/relay-compiler@npm:12.0.0" + dependencies: + "@babel/core": ^7.14.0 + "@babel/generator": ^7.14.0 + "@babel/parser": ^7.14.0 + "@babel/runtime": ^7.0.0 + "@babel/traverse": ^7.14.0 + "@babel/types": ^7.0.0 + babel-preset-fbjs: ^3.4.0 + chalk: ^4.0.0 + fb-watchman: ^2.0.0 + fbjs: ^3.0.0 + glob: ^7.1.1 + immutable: ~3.7.6 + invariant: ^2.2.4 + nullthrows: ^1.1.1 + relay-runtime: 12.0.0 + signedsource: ^1.0.0 + yargs: ^15.3.1 + peerDependencies: + graphql: "*" + bin: + relay-compiler: bin/relay-compiler + checksum: f0cec120d02961ee8652e0dde72d9e425bc97cad5d0f767d8764cfd30952294eb2838432f33e4da8bb6999d0c13dcd1df128280666bfea373294d98aa8033ae7 + languageName: node + linkType: hard + +"@ardatan/sync-fetch@npm:^0.0.1": + version: 0.0.1 + resolution: "@ardatan/sync-fetch@npm:0.0.1" + dependencies: + node-fetch: ^2.6.1 + checksum: af39bdfb4c2b35bd2c6acc540a5e302730dae17e73d3a18cd1a4aa50c1c741cb1869dffdef1379c491da5ad2e3cfa2bf3a8064e6046c12b46c6a97f54f100a8d + languageName: node + linkType: hard + "@aw-web-design/x-default-browser@npm:1.4.126": version: 1.4.126 resolution: "@aw-web-design/x-default-browser@npm:1.4.126" @@ -1077,6 +1166,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.25.2": + version: 7.25.4 + resolution: "@babel/compat-data@npm:7.25.4" + checksum: b12a91d27c3731a4b0bdc9312a50b1911f41f7f728aaf0d4b32486e2257fd2cb2d3ea1a295e98449600c48f2c7883a3196ca77cda1cef7d97a10c2e83d037974 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.22.9 resolution: "@babel/compat-data@npm:7.22.9" @@ -1144,6 +1240,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.14.0, @babel/core@npm:^7.22.9": + version: 7.25.2 + resolution: "@babel/core@npm:7.25.2" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.25.0 + "@babel/helper-compilation-targets": ^7.25.2 + "@babel/helper-module-transforms": ^7.25.2 + "@babel/helpers": ^7.25.0 + "@babel/parser": ^7.25.0 + "@babel/template": ^7.25.0 + "@babel/traverse": ^7.25.2 + "@babel/types": ^7.25.2 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 9a1ef604a7eb62195f70f9370cec45472a08114e3934e3eaaedee8fd754edf0730e62347c7b4b5e67d743ce57b5bb8cf3b92459482ca94d06e06246ef021390a + languageName: node + linkType: hard + "@babel/core@npm:^7.18.5": version: 7.24.7 resolution: "@babel/core@npm:7.24.7" @@ -1201,6 +1320,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/generator@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^2.5.1 + checksum: b55975cd664f5602304d868bb34f4ee3bed6f5c7ce8132cd92ff27a46a53a119def28a182d91992e86f75db904f63094a81247703c4dc96e4db0c03fd04bcd68 + languageName: node + linkType: hard + "@babel/generator@npm:^7.17.3, @babel/generator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/generator@npm:7.22.10" @@ -1261,6 +1392,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -1279,6 +1419,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-compilation-targets@npm:7.25.2" + dependencies: + "@babel/compat-data": ^7.25.2 + "@babel/helper-validator-option": ^7.24.8 + browserslist: ^4.23.1 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: aed33c5496cb9db4b5e2d44e26bf8bc474074cc7f7bb5ebe1d4a20fdeb362cb3ba9e1596ca18c7484bcd6e5c3a155ab975e420d520c0ae60df81f9de04d0fd16 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.22.10, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.10 resolution: "@babel/helper-compilation-targets@npm:7.22.10" @@ -1331,6 +1484,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0": + version: 7.25.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-member-expression-to-functions": ^7.24.8 + "@babel/helper-optimise-call-expression": ^7.24.7 + "@babel/helper-replace-supers": ^7.25.0 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + "@babel/traverse": ^7.25.4 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 4544ebda4516eb25efdebd47ca024bd7bdb1eb6e7cc3ad89688c8ef8e889734c2f4411ed78981899c641394f013f246f2af63d92a0e9270f6c453309b4cb89ba + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" @@ -1499,6 +1669,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" + dependencies: + "@babel/traverse": ^7.24.8 + "@babel/types": ^7.24.8 + checksum: bf923d05d81b06857f4ca4fe9c528c9c447a58db5ea39595bb559eae2fce01a8266173db0fd6a2ec129d7bbbb9bb22f4e90008252f7c66b422c76630a878a4bc + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-module-imports@npm:7.22.5" @@ -1572,6 +1752,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/helper-module-transforms@npm:7.25.2" + dependencies: + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-simple-access": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 + "@babel/traverse": ^7.25.2 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 282d4e3308df6746289e46e9c39a0870819630af5f84d632559171e4fae6045684d771a65f62df3d569e88ccf81dc2def78b8338a449ae3a94bb421aa14fc367 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" @@ -1581,6 +1775,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 280654eaf90e92bf383d7eed49019573fb35a98c9e992668f701ad099957246721044be2068cf6840cb2299e0ad393705a1981c88c23a1048096a8d59e5f79a3 + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.22.5 resolution: "@babel/helper-plugin-utils@npm:7.22.5" @@ -1588,6 +1791,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-plugin-utils@npm:7.24.8" + checksum: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -1627,6 +1837,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-replace-supers@npm:7.25.0" + dependencies: + "@babel/helper-member-expression-to-functions": ^7.24.8 + "@babel/helper-optimise-call-expression": ^7.24.7 + "@babel/traverse": ^7.25.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: f669fc2487c22d40b808f94b9c3ee41129484d5ef0ba689bdd70f216ff91e10b6b021d2f8cd37e7bdd700235a2a6ae6622526344f064528190383bf661ac65f8 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -1655,6 +1878,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 11b28fe534ce2b1a67c4d8e51a7b5711a2a0a0cae802f74614eee54cca58c744d9a62f6f60103c41759e81c537d270bfd665bf368a6bea214c6052f2094f8407 + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.16.7, @babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" @@ -1694,6 +1927,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-identifier@npm:7.22.5" @@ -1743,6 +1983,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-validator-option@npm:7.24.8" + checksum: a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -1797,6 +2044,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.25.0": + version: 7.25.6 + resolution: "@babel/helpers@npm:7.25.6" + dependencies: + "@babel/template": ^7.25.0 + "@babel/types": ^7.25.6 + checksum: 5a548999db82049a5f7ac6de57576b4ed0d386ce07d058151698836ed411eae6230db12535487caeebb68a2ffc964491e8aead62364a5132ab0ae20e8b68e19f + languageName: node + linkType: hard + "@babel/highlight@npm:^7.22.13": version: 7.22.13 resolution: "@babel/highlight@npm:7.22.13" @@ -1840,6 +2097,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + bin: + parser: ./bin/babel-parser.js + checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e + languageName: node + linkType: hard + "@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.22.11, @babel/parser@npm:^7.22.5": version: 7.22.14 resolution: "@babel/parser@npm:7.22.14" @@ -1912,6 +2180,33 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-class-properties@npm:^7.0.0": + version: 7.18.6 + resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.18.6 + "@babel/helper-plugin-utils": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 49a78a2773ec0db56e915d9797e44fd079ab8a9b2e1716e0df07c92532f2c65d76aeda9543883916b8e0ff13606afeffa67c5b93d05b607bc87653ad18a91422 + languageName: node + linkType: hard + +"@babel/plugin-proposal-object-rest-spread@npm:^7.0.0": + version: 7.20.7 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" + dependencies: + "@babel/compat-data": ^7.20.5 + "@babel/helper-compilation-targets": ^7.20.7 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-transform-parameters": ^7.20.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1329db17009964bc644484c660eab717cb3ca63ac0ab0f67c651a028d1bc2ead51dc4064caea283e46994f1b7221670a35cbc0b4beb6273f55e915494b5aa0b2 + languageName: node + linkType: hard + "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -1921,6 +2216,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-private-property-in-object@npm:^7.21.11": + version: 7.21.11 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" + dependencies: + "@babel/helper-annotate-as-pure": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1b880543bc5f525b360b53d97dd30807302bb82615cd42bf931968f59003cac75629563d6b104868db50abd22235b3271fdf679fea5db59a267181a99cc0c265 + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -1943,7 +2252,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -1987,6 +2296,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-flow@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 43b78b5fcdedb2a6d80c3d02a1a564fbfde86b73b442d616a8f318f673caa6ce0151513af5a00fcae42a512f144e70ef259d368b9537ee35d40336a6c895a7d4 + languageName: node + linkType: hard + "@babel/plugin-syntax-flow@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-syntax-flow@npm:7.23.3" @@ -1998,6 +2318,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.20.0": + version: 7.25.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" + dependencies: + "@babel/helper-plugin-utils": ^7.24.8 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b3b251ace9f184c2d6369cde686ff01581050cb0796f2ff00ff4021f31cf86270b347df09579f2c0996e999e37e1dddafacec42ed1ef6aae21a265aff947e792 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-assertions@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" @@ -2053,6 +2384,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965 + languageName: node + linkType: hard + "@babel/plugin-syntax-jsx@npm:^7.12.13, @babel/plugin-syntax-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" @@ -2108,7 +2450,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": +"@babel/plugin-syntax-object-rest-spread@npm:^7.0.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: @@ -2186,6 +2528,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 707c209b5331c7dc79bd326128c6a6640dbd62a78da1653c844db20c4f36bf7b68454f1bc4d2d051b3fde9136fa291f276ec03a071bb00ee653069ff82f91010 + languageName: node + linkType: hard + "@babel/plugin-transform-arrow-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" @@ -2224,6 +2577,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 249cdcbff4e778b177245f9652b014ea4f3cd245d83297f10a7bf6d97790074089aa62bcde8c08eb299c5e68f2faed346b587d3ebac44d625ba9a83a4ee27028 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" @@ -2235,6 +2599,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.0.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" + dependencies: + "@babel/helper-plugin-utils": ^7.24.8 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b1a8f932f69ad2a47ae3e02b4cedd2a876bfc2ac9cf72a503fd706cdc87272646fe9eed81e068c0fc639647033de29f7fa0c21cddd1da0026f83dbaac97316a8 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.23.4": version: 7.23.4 resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" @@ -2283,6 +2658,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.0.0": + version: 7.25.4 + resolution: "@babel/plugin-transform-classes@npm:7.25.4" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-compilation-targets": ^7.25.2 + "@babel/helper-plugin-utils": ^7.24.8 + "@babel/helper-replace-supers": ^7.25.0 + "@babel/traverse": ^7.25.4 + globals: ^11.1.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0bf20e46eeb691bd60cee5d1b01950fc37accec88018ecace25099f7c8d8509c1ac54d11b8caf9f2157c6945969520642a3bc421159c1a14e80224dc9a7611de + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.23.5": version: 7.23.5 resolution: "@babel/plugin-transform-classes@npm:7.23.5" @@ -2302,6 +2693,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/template": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0cf8c1b1e4ea57dec8d4612460d84fd4cdbf71a7499bb61ee34632cf89018a59eee818ffca88a8d99ee7057c20a4257044d7d463fda6daef9bf1db9fa81563cb + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" @@ -2314,6 +2717,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.0.0": + version: 7.24.8 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" + dependencies: + "@babel/helper-plugin-utils": ^7.24.8 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0b4bd3d608979a1e5bd97d9d42acd5ad405c7fffa61efac4c7afd8e86ea6c2d91ab2d94b6a98d63919571363fe76e0b03c4ff161f0f60241b895842596e4a999 + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" @@ -2396,6 +2810,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-flow-strip-types@npm:^7.0.0": + version: 7.25.2 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.25.2" + dependencies: + "@babel/helper-plugin-utils": ^7.24.8 + "@babel/plugin-syntax-flow": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9f7b96cbd374077eaf04b59e468976d2e89ec353807d7ac28f129f686945447df92aeb5b60acf906f3ec0f9ebef5d9f88735c7aa39af97033a6ab96c79c9a909 + languageName: node + linkType: hard + "@babel/plugin-transform-flow-strip-types@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.23.3" @@ -2408,6 +2834,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-for-of@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a53b42dc93ab4b7d1ebd3c695b52be22b3d592f6a3dbdb3dc2fea2c8e0a7e1508fe919864c455cde552aec44ce7518625fccbb70c7063373ca228d884f4f49ea + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-for-of@npm:7.23.3" @@ -2419,6 +2857,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.0.0": + version: 7.25.1 + resolution: "@babel/plugin-transform-function-name@npm:7.25.1" + dependencies: + "@babel/helper-compilation-targets": ^7.24.8 + "@babel/helper-plugin-utils": ^7.24.8 + "@babel/traverse": ^7.25.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 743f3ea03bbc5a90944849d5a880b6bd9243dddbde581a46952da76e53a0b74c1e2424133fe8129d7a152c1f8c872bcd27e0b6728d7caadabd1afa7bb892e1e0 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-function-name@npm:7.23.3" @@ -2444,6 +2895,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.0.0": + version: 7.25.2 + resolution: "@babel/plugin-transform-literals@npm:7.25.2" + dependencies: + "@babel/helper-plugin-utils": ^7.24.8 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 70c9bb40e377a306bd8f500899fb72127e527517914466e95dc6bb53fa7a0f51479db244a54a771b5780fc1eab488fedd706669bf11097b81a23c81ab7423eb1 + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-literals@npm:7.23.3" @@ -2467,6 +2929,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2720c57aa3bf70576146ba7d6ea03227f4611852122d76d237924f7b008dafc952e6ae61a19e5024f26c665f44384bbd378466f01b6bd1305b3564a3b7fb1a5d + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" @@ -2490,6 +2963,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.0.0": + version: 7.24.8 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" + dependencies: + "@babel/helper-module-transforms": ^7.24.8 + "@babel/helper-plugin-utils": ^7.24.8 + "@babel/helper-simple-access": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a4cf95b1639c33382064b44558f73ee5fac023f2a94d16e549d2bb55ceebd5cbc10fcddd505d08cd5bc97f5a64af9fd155512358b7dcf7b1a0082e8945cf21c5 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" @@ -2615,6 +3101,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-super@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f71e607a830ee50a22fa1a2686524d3339440cf9dea63032f6efbd865cfe4e35000e1e3f3492459e5c986f7c0c07dc36938bf3ce61fc9ba5f8ab732d0b64ab37 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-object-super@npm:7.23.3" @@ -2652,6 +3150,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-parameters@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ab534b03ac2eff94bc79342b8f39a4584666f5305a6c63c1964afda0b1b004e6b861e49d1683548030defe248e3590d3ff6338ee0552cb90c064f7e1479968c3 + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-parameters@npm:7.23.3" @@ -2701,6 +3210,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9aeefc3aab6c6bf9d1fae1cf3a2d38c7d886fd3c6c81b7c608c477f5758aee2e7abf52f32724310fe861da61af934ee2508b78a5b5f234b9740c9134e1c14437 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" @@ -2712,6 +3232,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a05bf83bf5e7b31f7a3b56da1bf8e2eeec76ef52ae44435ceff66363a1717fcda45b7b4b931a2c115982175f481fc3f2d0fab23f0a43c44e6d983afc396858f0 + languageName: node + linkType: hard + "@babel/plugin-transform-react-display-name@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-react-display-name@npm:7.23.3" @@ -2778,6 +3309,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.0.0": + version: 7.25.2 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.8 + "@babel/plugin-syntax-jsx": ^7.24.7 + "@babel/types": ^7.25.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 44fbde046385916de19a88d77fed9121c6cc6e25b9cdc38a43d8e514a9b18cf391ed3de25e7d6a8996d3fe4c298e395edf856ee20efffaab3b70f8ce225fffa4 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.19.0, @babel/plugin-transform-react-jsx@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" @@ -2859,6 +3405,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7b524245814607188212b8eb86d8c850e5974203328455a30881b4a92c364b93353fae14bc2af5b614ef16300b75b8c1d3b8f3a08355985b4794a7feb240adc3 + languageName: node + linkType: hard + "@babel/plugin-transform-shorthand-properties@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" @@ -2870,6 +3427,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-spread@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4c4254c8b9cceb1a8f975fa9b92257ddb08380a35c0a3721b8f4b9e13a3d82e403af2e0fba577b9f2452dd8f06bc3dea71cc53b1e2c6af595af5db52a13429d6 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-spread@npm:7.23.3" @@ -2893,6 +3462,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.0.0": + version: 7.24.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ad44e5826f5a98c1575832dbdbd033adfe683cdff195e178528ead62507564bf02f479b282976cfd3caebad8b06d5fd7349c1cdb880dec3c56daea4f1f179619 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" @@ -3164,6 +3744,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.21.0": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 + languageName: node + linkType: hard + "@babel/runtime@npm:^7.23.2": version: 7.23.5 resolution: "@babel/runtime@npm:7.23.5" @@ -3182,6 +3771,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/parser": ^7.25.0 + "@babel/types": ^7.25.0 + checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b + languageName: node + linkType: hard + "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -3244,6 +3844,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.4": + version: 7.25.6 + resolution: "@babel/traverse@npm:7.25.6" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.25.6 + "@babel/parser": ^7.25.6 + "@babel/template": ^7.25.0 + "@babel/types": ^7.25.6 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: 11ee47269aa4356f2d6633a05b9af73405b5ed72c09378daf644289b686ef852035a6ac9aa410f601991993c6bbf72006795b5478283b78eb1ca77874ada7737 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.5": version: 7.23.5 resolution: "@babel/traverse@npm:7.23.5" @@ -3337,6 +3952,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": ^7.24.8 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 + languageName: node + linkType: hard + "@babel/types@npm:^7.17.0, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.22.11 resolution: "@babel/types@npm:7.22.11" @@ -3829,6 +4455,43 @@ __metadata: languageName: unknown linkType: soft +"@calcom/console@workspace:apps/console": + version: 0.0.0-use.local + resolution: "@calcom/console@workspace:apps/console" + dependencies: + "@calcom/dayjs": "*" + "@calcom/features": "*" + "@calcom/lib": "*" + "@calcom/tsconfig": "*" + "@calcom/ui": "*" + "@headlessui/react": ^1.5.0 + "@heroicons/react": ^1.0.6 + "@prisma/client": ^5.4.2 + "@tailwindcss/forms": ^0.5.2 + "@types/node": 16.9.1 + "@types/react": 18.0.26 + autoprefixer: ^10.4.12 + chart.js: ^3.7.1 + client-only: ^0.0.1 + eslint: ^8.34.0 + next: ^13.5.4 + next-auth: ^4.22.1 + next-i18next: ^13.2.2 + postcss: ^8.4.18 + prisma: ^5.4.2 + prisma-field-encryption: ^1.4.0 + react: ^18.2.0 + react-chartjs-2: ^4.0.1 + react-dom: ^18.2.0 + react-hook-form: ^7.43.3 + react-live-chat-loader: ^2.8.1 + swr: ^1.2.2 + tailwindcss: ^3.3.3 + typescript: ^4.9.4 + zod: ^3.22.4 + languageName: unknown + linkType: soft + "@calcom/core@*, @calcom/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@calcom/core@workspace:packages/core" @@ -3970,7 +4633,7 @@ __metadata: languageName: unknown linkType: soft -"@calcom/embed-react@workspace:*, @calcom/embed-react@workspace:packages/embeds/embed-react": +"@calcom/embed-react@workspace:*, @calcom/embed-react@workspace:^, @calcom/embed-react@workspace:packages/embeds/embed-react": version: 0.0.0-use.local resolution: "@calcom/embed-react@workspace:packages/embeds/embed-react" dependencies: @@ -4562,15 +5225,6 @@ __metadata: languageName: unknown linkType: soft -"@calcom/retell-ai@workspace:packages/app-store/retell-ai": - version: 0.0.0-use.local - resolution: "@calcom/retell-ai@workspace:packages/app-store/retell-ai" - dependencies: - "@calcom/lib": "*" - "@calcom/types": "*" - languageName: unknown - linkType: soft - "@calcom/riverside@workspace:packages/app-store/riverside": version: 0.0.0-use.local resolution: "@calcom/riverside@workspace:packages/app-store/riverside" @@ -5115,6 +5769,118 @@ __metadata: languageName: unknown linkType: soft +"@calcom/website@workspace:apps/website": + version: 0.0.0-use.local + resolution: "@calcom/website@workspace:apps/website" + dependencies: + "@algora/sdk": ^0.1.2 + "@calcom/app-store": "*" + "@calcom/config": "*" + "@calcom/dayjs": "*" + "@calcom/embed-react": "workspace:^" + "@calcom/features": "*" + "@calcom/lib": "*" + "@calcom/prisma": "*" + "@calcom/tsconfig": "*" + "@calcom/ui": "*" + "@datocms/cma-client-node": ^2.0.0 + "@floating-ui/react-dom": ^1.0.0 + "@flodlc/nebula": ^1.0.56 + "@graphql-codegen/cli": ^5.0.0 + "@graphql-codegen/typed-document-node": ^5.0.1 + "@graphql-codegen/typescript": ^4.0.1 + "@graphql-codegen/typescript-operations": ^4.0.1 + "@graphql-typed-document-node/core": ^3.2.0 + "@headlessui/react": ^1.5.0 + "@heroicons/react": ^1.0.6 + "@hookform/resolvers": ^2.9.7 + "@juggle/resize-observer": ^3.4.0 + "@next/bundle-analyzer": ^13.1.6 + "@radix-ui/react-accordion": ^1.0.0 + "@radix-ui/react-avatar": ^1.0.4 + "@radix-ui/react-dropdown-menu": ^2.0.5 + "@radix-ui/react-navigation-menu": ^1.0.0 + "@radix-ui/react-portal": ^1.0.0 + "@radix-ui/react-slider": ^1.0.0 + "@radix-ui/react-tabs": ^1.0.0 + "@radix-ui/react-tooltip": ^1.0.0 + "@stripe/stripe-js": ^1.35.0 + "@tanstack/react-query": ^4.3.9 + "@typeform/embed-react": ^1.2.4 + "@types/bcryptjs": ^2.4.2 + "@types/debounce": ^1.2.1 + "@types/gtag.js": ^0.0.10 + "@types/micro": 7.3.7 + "@types/node": 16.9.1 + "@types/react": 18.0.26 + "@types/react-gtm-module": ^2.0.1 + "@types/xml2js": ^0.4.11 + "@vercel/analytics": ^0.1.6 + "@vercel/edge-functions-ui": ^0.2.1 + "@vercel/og": ^0.5.0 + autoprefixer: ^10.4.12 + bcryptjs: ^2.4.3 + clsx: ^1.2.1 + cobe: ^0.4.1 + concurrently: ^7.6.0 + cross-env: ^7.0.3 + datocms-structured-text-to-plain-text: ^2.0.4 + datocms-structured-text-utils: ^2.0.4 + debounce: ^1.2.1 + dotenv: ^16.3.1 + enquirer: ^2.4.1 + env-cmd: ^10.1.0 + eslint: ^8.34.0 + fathom-client: ^3.5.0 + globby: ^13.1.3 + graphql: ^16.8.0 + graphql-codegen: ^0.4.0 + graphql-request: ^6.1.0 + gray-matter: ^4.0.3 + gsap: ^3.11.0 + i18n-unused: ^0.13.0 + iframe-resizer-react: ^1.1.0 + keen-slider: ^6.8.0 + lucide-react: ^0.171.0 + micro: ^10.0.1 + next: ^14.1.3 + next-auth: ^4.22.1 + next-axiom: ^0.17.0 + next-i18next: ^13.2.2 + next-seo: ^6.0.0 + playwright-core: ^1.38.1 + postcss: ^8.4.18 + prism-react-renderer: ^1.3.5 + react: ^18.2.0 + react-confetti: ^6.0.1 + react-datocms: ^3.1.0 + react-device-detect: ^2.2.2 + react-dom: ^18.2.0 + react-fast-marquee: ^1.6.4 + react-github-btn: ^1.4.0 + react-hook-form: ^7.43.3 + react-hot-toast: ^2.3.0 + react-live-chat-loader: ^2.8.1 + react-markdown: ^9.0.1 + react-merge-refs: 1.1.0 + react-resize-detector: ^9.1.0 + react-twemoji: ^0.3.0 + react-use-measure: ^2.1.1 + react-wrap-balancer: ^1.0.0 + remark: ^14.0.2 + remark-html: ^14.0.1 + remeda: ^1.24.1 + stripe: ^9.16.0 + tailwind-merge: ^1.13.2 + tailwindcss: ^3.3.3 + ts-node: ^10.9.1 + typescript: ^4.9.4 + wait-on: ^7.0.1 + xml2js: ^0.6.0 + zod: ^3.22.2 + languageName: unknown + linkType: soft + "@calcom/whatsapp@workspace:packages/app-store/whatsapp": version: 0.0.0-use.local resolution: "@calcom/whatsapp@workspace:packages/app-store/whatsapp" @@ -5541,6 +6307,38 @@ __metadata: languageName: node linkType: hard +"@datocms/cma-client-node@npm:^2.0.0": + version: 2.2.6 + resolution: "@datocms/cma-client-node@npm:2.2.6" + dependencies: + "@datocms/cma-client": ^2.2.6 + "@datocms/rest-client-utils": ^1.3.3 + got: ^11.8.5 + mime-types: ^2.1.35 + tmp-promise: ^3.0.3 + checksum: d18b568f5a4538abbd824091722f7df95c99cb5e550560bcae701654924e7933559b27d176fc7772056afe214516c99e8bb383319d4e492b053d20d3732df929 + languageName: node + linkType: hard + +"@datocms/cma-client@npm:^2.2.6": + version: 2.2.6 + resolution: "@datocms/cma-client@npm:2.2.6" + dependencies: + "@datocms/rest-client-utils": ^1.3.3 + checksum: 52e65ab5cdc6b09859f6b07f87a5e8700ba2b2f0579894b7f3c6735c1360f83e41941783dfab78bd18d3f9e12bbd50436b953663a332c50fbcd12b167c567ed6 + languageName: node + linkType: hard + +"@datocms/rest-client-utils@npm:^1.3.3": + version: 1.3.3 + resolution: "@datocms/rest-client-utils@npm:1.3.3" + dependencies: + "@whatwg-node/fetch": ^0.5.3 + async-scheduler: ^1.4.4 + checksum: eb746ce41b0c38b0ebef42238046ce8ff2734330580b7198cc11bf7182de394af9de4df021e967419592eb62729feae533c7126d5629ec97e7cc8b3aa30e9eb2 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -6339,7 +7137,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^1.3.0": +"@floating-ui/react-dom@npm:^1.0.0, @floating-ui/react-dom@npm:^1.3.0": version: 1.3.0 resolution: "@floating-ui/react-dom@npm:1.3.0" dependencies: @@ -6377,6 +7175,13 @@ __metadata: languageName: node linkType: hard +"@flodlc/nebula@npm:^1.0.56": + version: 1.0.56 + resolution: "@flodlc/nebula@npm:1.0.56" + checksum: 044058423bc8a2c6ea60a0636400593a0912c142fbb6f50cc03288c702ae9c2029f84eb4fbac7e701a7ee1c2a5e33cc1af1b8d94af419c1197f74066b7867d21 + languageName: node + linkType: hard + "@formatjs/ecma402-abstract@npm:1.11.4": version: 1.11.4 resolution: "@formatjs/ecma402-abstract@npm:1.11.4" @@ -6540,6 +7345,596 @@ __metadata: languageName: node linkType: hard +"@graphql-codegen/add@npm:^5.0.3": + version: 5.0.3 + resolution: "@graphql-codegen/add@npm:5.0.3" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.3 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 5196b6c64907f03dc1adc0ac4f98ed5fe69abe0eb87027a55dfc14b178cc1fee2bc47f68c8f5a68ce7aa4bc5a4f970f983d1d85b6d7a20489e50657baccd2ad0 + languageName: node + linkType: hard + +"@graphql-codegen/cli@npm:^5.0.0": + version: 5.0.2 + resolution: "@graphql-codegen/cli@npm:5.0.2" + dependencies: + "@babel/generator": ^7.18.13 + "@babel/template": ^7.18.10 + "@babel/types": ^7.18.13 + "@graphql-codegen/client-preset": ^4.2.2 + "@graphql-codegen/core": ^4.0.2 + "@graphql-codegen/plugin-helpers": ^5.0.3 + "@graphql-tools/apollo-engine-loader": ^8.0.0 + "@graphql-tools/code-file-loader": ^8.0.0 + "@graphql-tools/git-loader": ^8.0.0 + "@graphql-tools/github-loader": ^8.0.0 + "@graphql-tools/graphql-file-loader": ^8.0.0 + "@graphql-tools/json-file-loader": ^8.0.0 + "@graphql-tools/load": ^8.0.0 + "@graphql-tools/prisma-loader": ^8.0.0 + "@graphql-tools/url-loader": ^8.0.0 + "@graphql-tools/utils": ^10.0.0 + "@whatwg-node/fetch": ^0.8.0 + chalk: ^4.1.0 + cosmiconfig: ^8.1.3 + debounce: ^1.2.0 + detect-indent: ^6.0.0 + graphql-config: ^5.0.2 + inquirer: ^8.0.0 + is-glob: ^4.0.1 + jiti: ^1.17.1 + json-to-pretty-yaml: ^1.2.2 + listr2: ^4.0.5 + log-symbols: ^4.0.0 + micromatch: ^4.0.5 + shell-quote: ^1.7.3 + string-env-interpolation: ^1.0.1 + ts-log: ^2.2.3 + tslib: ^2.4.0 + yaml: ^2.3.1 + yargs: ^17.0.0 + peerDependencies: + "@parcel/watcher": ^2.1.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + "@parcel/watcher": + optional: true + bin: + gql-gen: cjs/bin.js + graphql-code-generator: cjs/bin.js + graphql-codegen: cjs/bin.js + graphql-codegen-esm: esm/bin.js + checksum: 82c9a26ffeeee620d6e6863280efb6302d6ac4bdccfd80e27bf811677e58bbf4ece7767e43a999194b0b8922f32226eb7a3c21e0a8e2bebc04a3abc64a981786 + languageName: node + linkType: hard + +"@graphql-codegen/client-preset@npm:^4.2.2": + version: 4.3.3 + resolution: "@graphql-codegen/client-preset@npm:4.3.3" + dependencies: + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/template": ^7.20.7 + "@graphql-codegen/add": ^5.0.3 + "@graphql-codegen/gql-tag-operations": 4.0.9 + "@graphql-codegen/plugin-helpers": ^5.0.4 + "@graphql-codegen/typed-document-node": ^5.0.9 + "@graphql-codegen/typescript": ^4.0.9 + "@graphql-codegen/typescript-operations": ^4.2.3 + "@graphql-codegen/visitor-plugin-common": ^5.3.1 + "@graphql-tools/documents": ^1.0.0 + "@graphql-tools/utils": ^10.0.0 + "@graphql-typed-document-node/core": 3.2.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: c18409c1337fff57daf555d15b887d1632e49b3093f23726dfc6afaa5e31f0977f3aea267a380f1947555d514827ba63ae0144ec0b756681bd557e8f9531ef30 + languageName: node + linkType: hard + +"@graphql-codegen/core@npm:^4.0.2": + version: 4.0.2 + resolution: "@graphql-codegen/core@npm:4.0.2" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.3 + "@graphql-tools/schema": ^10.0.0 + "@graphql-tools/utils": ^10.0.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 5fda4e843174aacd4a481b73b4d259fa2df7ffe4200bd06e95ecd4b3f43aa5969deeaeb51f6cf15a542e99ee5756c3e02a29d9d2ff9891af40e234a8f68ead4d + languageName: node + linkType: hard + +"@graphql-codegen/gql-tag-operations@npm:4.0.9": + version: 4.0.9 + resolution: "@graphql-codegen/gql-tag-operations@npm:4.0.9" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.4 + "@graphql-codegen/visitor-plugin-common": 5.3.1 + "@graphql-tools/utils": ^10.0.0 + auto-bind: ~4.0.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: d269d1c1026afd073efee2ff7511ad55b29ea4ea4c5d34647377087af18dbcb1716e233cc64cb1cdeea73935e85cb1fd8b553ea4e0ab3525a2687ca2565c6a5d + languageName: node + linkType: hard + +"@graphql-codegen/plugin-helpers@npm:^5.0.3, @graphql-codegen/plugin-helpers@npm:^5.0.4": + version: 5.0.4 + resolution: "@graphql-codegen/plugin-helpers@npm:5.0.4" + dependencies: + "@graphql-tools/utils": ^10.0.0 + change-case-all: 1.0.15 + common-tags: 1.8.2 + import-from: 4.0.0 + lodash: ~4.17.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 0f0272afbbc79e665fb23bb823721587470e12f77aba39426e2524386ccbb6dec8d42c0ccaf8e0b95fcda030c83cb4e6302bce3c3f7b2c1ed50c33a40619fcd0 + languageName: node + linkType: hard + +"@graphql-codegen/schema-ast@npm:^4.0.2": + version: 4.1.0 + resolution: "@graphql-codegen/schema-ast@npm:4.1.0" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.3 + "@graphql-tools/utils": ^10.0.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: cddec7723d708990ac8e33eb8935e72545b60ed7b772452ba45b60e577af950d23503de83f0919d1730f7d52dcb970900d3587d9a54202032164ba3c246d4c10 + languageName: node + linkType: hard + +"@graphql-codegen/typed-document-node@npm:^5.0.1, @graphql-codegen/typed-document-node@npm:^5.0.9": + version: 5.0.9 + resolution: "@graphql-codegen/typed-document-node@npm:5.0.9" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.4 + "@graphql-codegen/visitor-plugin-common": 5.3.1 + auto-bind: ~4.0.0 + change-case-all: 1.0.15 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: ee2b68cc0fbbd435e920e55cdeb3b251ff655d85a62ad5a9257664178e597d97096eb34db233dc29e2bcf6b1efb88a48643e7a7933a6f7477694fbb4bec35dc7 + languageName: node + linkType: hard + +"@graphql-codegen/typescript-operations@npm:^4.0.1, @graphql-codegen/typescript-operations@npm:^4.2.3": + version: 4.2.3 + resolution: "@graphql-codegen/typescript-operations@npm:4.2.3" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.4 + "@graphql-codegen/typescript": ^4.0.9 + "@graphql-codegen/visitor-plugin-common": 5.3.1 + auto-bind: ~4.0.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: d7e445e52f1354c504bd46742c6508b013c956826d7a3c7abeae38caa9f57626784b1114b9763254f5f506c081478ca309338d31f8bd03c772c2fb6affed6b0b + languageName: node + linkType: hard + +"@graphql-codegen/typescript@npm:^4.0.1, @graphql-codegen/typescript@npm:^4.0.9": + version: 4.0.9 + resolution: "@graphql-codegen/typescript@npm:4.0.9" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.4 + "@graphql-codegen/schema-ast": ^4.0.2 + "@graphql-codegen/visitor-plugin-common": 5.3.1 + auto-bind: ~4.0.0 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 843081bc484d209658158fcc5eabf5b4d2e2edc860686d656d16ddd76bf585a7d060438cf5ae4c9f69bf75c6be641c1a822095b0d5e9fc77cd94a9b11e517939 + languageName: node + linkType: hard + +"@graphql-codegen/visitor-plugin-common@npm:5.3.1, @graphql-codegen/visitor-plugin-common@npm:^5.3.1": + version: 5.3.1 + resolution: "@graphql-codegen/visitor-plugin-common@npm:5.3.1" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.0.4 + "@graphql-tools/optimize": ^2.0.0 + "@graphql-tools/relay-operation-optimizer": ^7.0.0 + "@graphql-tools/utils": ^10.0.0 + auto-bind: ~4.0.0 + change-case-all: 1.0.15 + dependency-graph: ^0.11.0 + graphql-tag: ^2.11.0 + parse-filepath: ^1.0.2 + tslib: ~2.6.0 + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: 273f99a91233b0f68988185498f9170a0b46a311d65b57029e0e2bd03d72d7c90bb3b1f5e49233fee459a770119f7d0674dd01306b2cc1ddb27d30f940fb1f98 + languageName: node + linkType: hard + +"@graphql-tools/apollo-engine-loader@npm:^8.0.0": + version: 8.0.1 + resolution: "@graphql-tools/apollo-engine-loader@npm:8.0.1" + dependencies: + "@ardatan/sync-fetch": ^0.0.1 + "@graphql-tools/utils": ^10.0.13 + "@whatwg-node/fetch": ^0.9.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 4baef5a8fd85787568188f852446e4f2453a21026c60b9391641093bff0a88172df8beb8bbfe2b134e177acad90eeb613387a1185699d1e7718e1dfa701c6fd7 + languageName: node + linkType: hard + +"@graphql-tools/batch-execute@npm:^9.0.4": + version: 9.0.4 + resolution: "@graphql-tools/batch-execute@npm:9.0.4" + dependencies: + "@graphql-tools/utils": ^10.0.13 + dataloader: ^2.2.2 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: d547da2ca888a1ebd8552f1be1c353e88bdbcb85c745de3d869e22da7f1981b4621f950a22ce719c645cc6435bc683c77253d8f19a0baaf7d4058625f4ce8891 + languageName: node + linkType: hard + +"@graphql-tools/code-file-loader@npm:^8.0.0": + version: 8.1.3 + resolution: "@graphql-tools/code-file-loader@npm:8.1.3" + dependencies: + "@graphql-tools/graphql-tag-pluck": 8.3.2 + "@graphql-tools/utils": ^10.0.13 + globby: ^11.0.3 + tslib: ^2.4.0 + unixify: ^1.0.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 3a8694b713dda9282466139893ab064976ec1ce11c91af02b37e71e6bdd84d64700bd058d13a1bc4b1396ce6950b1c1835b774fe37a8c5c47b1bfe44600a74d7 + languageName: node + linkType: hard + +"@graphql-tools/delegate@npm:^10.0.4": + version: 10.0.21 + resolution: "@graphql-tools/delegate@npm:10.0.21" + dependencies: + "@graphql-tools/batch-execute": ^9.0.4 + "@graphql-tools/executor": ^1.3.1 + "@graphql-tools/schema": ^10.0.4 + "@graphql-tools/utils": ^10.3.4 + "@repeaterjs/repeater": ^3.0.6 + dataloader: ^2.2.2 + tslib: ^2.5.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 72b0f90c02f6cc8bd7c247364c06bc0e783626eb9c5c2297dd791557c0c21762a8af25c73f8acfc76199c644ba6418a97af2d5e31c707691f47eda47ebf8dd2e + languageName: node + linkType: hard + +"@graphql-tools/documents@npm:^1.0.0": + version: 1.0.1 + resolution: "@graphql-tools/documents@npm:1.0.1" + dependencies: + lodash.sortby: ^4.7.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: c6ff859d2673dbf884f19d6319735afacc6bff2df6f8ea3dbf56839d01568f61210f256f0905156f123428cc24962ada26b37903263699fc8cd7efb8849a6508 + languageName: node + linkType: hard + +"@graphql-tools/executor-graphql-ws@npm:^1.1.2": + version: 1.2.0 + resolution: "@graphql-tools/executor-graphql-ws@npm:1.2.0" + dependencies: + "@graphql-tools/utils": ^10.3.0 + "@types/ws": ^8.0.0 + graphql-ws: ^5.14.0 + isomorphic-ws: ^5.0.0 + tslib: ^2.4.0 + ws: ^8.17.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 501824d3608c17109ab3505639215ed46b416a53329352b60ef63e39611be2e33d19f3ad882eb427ca27c9c65330d94a477cd1fd45f1098957b51d221d0a57b2 + languageName: node + linkType: hard + +"@graphql-tools/executor-http@npm:^1.0.9": + version: 1.1.6 + resolution: "@graphql-tools/executor-http@npm:1.1.6" + dependencies: + "@graphql-tools/utils": ^10.3.2 + "@repeaterjs/repeater": ^3.0.4 + "@whatwg-node/fetch": ^0.9.0 + extract-files: ^11.0.0 + meros: ^1.2.1 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: a19b58b542bb70c799a5d0be2d5152fbfed7ac6f225885193e826a46bae4c800d2b27aa671a090272bc8d1be66ad2c2b69cb93c6c363036477544e07d83d2cdd + languageName: node + linkType: hard + +"@graphql-tools/executor-legacy-ws@npm:^1.0.6": + version: 1.1.0 + resolution: "@graphql-tools/executor-legacy-ws@npm:1.1.0" + dependencies: + "@graphql-tools/utils": ^10.3.0 + "@types/ws": ^8.0.0 + isomorphic-ws: ^5.0.0 + tslib: ^2.4.0 + ws: ^8.17.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: eb4acf16cf4b99f3b5fa8fc0b431e82ee7c5c424a6df4d89b73840bdbb7dcee8bff9652df986a08abecdcbec107892f3fe26c6a7adc6d447af8c6683b08b66a6 + languageName: node + linkType: hard + +"@graphql-tools/executor@npm:^1.3.1": + version: 1.3.1 + resolution: "@graphql-tools/executor@npm:1.3.1" + dependencies: + "@graphql-tools/utils": ^10.3.4 + "@graphql-typed-document-node/core": 3.2.0 + "@repeaterjs/repeater": ^3.0.4 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 709f4660850236ccfcf9ef13b0479d19cea2af9a7dd3ffe60457117c0c5e8e31e2e3d89c38183fe65062ee4e6b4f60a484b98121982c6283c4c518a2c59d2003 + languageName: node + linkType: hard + +"@graphql-tools/git-loader@npm:^8.0.0": + version: 8.0.7 + resolution: "@graphql-tools/git-loader@npm:8.0.7" + dependencies: + "@graphql-tools/graphql-tag-pluck": 8.3.2 + "@graphql-tools/utils": ^10.0.13 + is-glob: 4.0.3 + micromatch: ^4.0.4 + tslib: ^2.4.0 + unixify: ^1.0.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: d22bd4d207d890e495da625a11a24b9f89bde71d0f9f5951b1b5ae5cf18df89f91dbf36a87c41e49b73f765731eb99bfabf4b23e21aa5c46747b8e555cca2aa7 + languageName: node + linkType: hard + +"@graphql-tools/github-loader@npm:^8.0.0": + version: 8.0.1 + resolution: "@graphql-tools/github-loader@npm:8.0.1" + dependencies: + "@ardatan/sync-fetch": ^0.0.1 + "@graphql-tools/executor-http": ^1.0.9 + "@graphql-tools/graphql-tag-pluck": ^8.0.0 + "@graphql-tools/utils": ^10.0.13 + "@whatwg-node/fetch": ^0.9.0 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 40d379f4c35bf318ad643ada4133dd630fac34dc3c959e10887da9730caf7c71e5e2c47eef62fdb15e90ce7b05281459cd86639a4f86cdc8784c7b9974d6c017 + languageName: node + linkType: hard + +"@graphql-tools/graphql-file-loader@npm:^8.0.0": + version: 8.0.1 + resolution: "@graphql-tools/graphql-file-loader@npm:8.0.1" + dependencies: + "@graphql-tools/import": 7.0.1 + "@graphql-tools/utils": ^10.0.13 + globby: ^11.0.3 + tslib: ^2.4.0 + unixify: ^1.0.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 55fd5cc96ea063341e03be2fa72a6494e8fedb0cd09cc2a4664732fc81e57e5c67026f63ff9e6c1afc284bd303988cd1bda715c88100b8316b5e8cdf6da70a32 + languageName: node + linkType: hard + +"@graphql-tools/graphql-tag-pluck@npm:8.3.2, @graphql-tools/graphql-tag-pluck@npm:^8.0.0": + version: 8.3.2 + resolution: "@graphql-tools/graphql-tag-pluck@npm:8.3.2" + dependencies: + "@babel/core": ^7.22.9 + "@babel/parser": ^7.16.8 + "@babel/plugin-syntax-import-assertions": ^7.20.0 + "@babel/traverse": ^7.16.8 + "@babel/types": ^7.16.8 + "@graphql-tools/utils": ^10.0.13 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 183b71dc04c930ccf7175c8c1c454a74552148512a0306148f7a49db5af550afde4845a03c0ef26ecee9283d866cfd7964c521ae4a83416c83693ed931fcc770 + languageName: node + linkType: hard + +"@graphql-tools/import@npm:7.0.1": + version: 7.0.1 + resolution: "@graphql-tools/import@npm:7.0.1" + dependencies: + "@graphql-tools/utils": ^10.0.13 + resolve-from: 5.0.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: eb3596779e1dcebc3453eafdb459575531b30c01ce82c4fb779dccc9d5865ba7e5dbfef443836cd5ecc9250eb8e4001ec0b83878841c2f366d1643ccefc57267 + languageName: node + linkType: hard + +"@graphql-tools/json-file-loader@npm:^8.0.0": + version: 8.0.1 + resolution: "@graphql-tools/json-file-loader@npm:8.0.1" + dependencies: + "@graphql-tools/utils": ^10.0.13 + globby: ^11.0.3 + tslib: ^2.4.0 + unixify: ^1.0.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 803124fc91a83b2e486ec34315510fef1497e4a3800c3557b3d9bf37b8ef182b5898293f05bfee2e663a4102ead766391748901daf92ccf98379fe4ff36cbdee + languageName: node + linkType: hard + +"@graphql-tools/load@npm:^8.0.0": + version: 8.0.2 + resolution: "@graphql-tools/load@npm:8.0.2" + dependencies: + "@graphql-tools/schema": ^10.0.3 + "@graphql-tools/utils": ^10.0.13 + p-limit: 3.1.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: ddc4bd9dcf5a799321fb1bd21a27887e3c8321003b1826efabff9aae5c189dd8cce0dffa0a94708ef7d64791daf7e73c8ff95cf2f7e036c131ef5eddccf38e34 + languageName: node + linkType: hard + +"@graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.6": + version: 9.0.7 + resolution: "@graphql-tools/merge@npm:9.0.7" + dependencies: + "@graphql-tools/utils": ^10.5.4 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: d61a0cead730fd50dcc0055e94d7c53a1a6e982d0fb35d8a5c0721191eec6ab1102fcea2aabbdab0a224bdfd779458e4292b066572b562419b2958b255e41fa7 + languageName: node + linkType: hard + +"@graphql-tools/optimize@npm:^2.0.0": + version: 2.0.0 + resolution: "@graphql-tools/optimize@npm:2.0.0" + dependencies: + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 7f79c0e1852abc571308e887d27d613da5b797256c8c6eb6c5fe7ca77f09e61524778ae281cebc0b698c51d4fe1074e2b8e0d0627b8e2dcf505aa6ed09b49a2f + languageName: node + linkType: hard + +"@graphql-tools/prisma-loader@npm:^8.0.0": + version: 8.0.4 + resolution: "@graphql-tools/prisma-loader@npm:8.0.4" + dependencies: + "@graphql-tools/url-loader": ^8.0.2 + "@graphql-tools/utils": ^10.0.13 + "@types/js-yaml": ^4.0.0 + "@whatwg-node/fetch": ^0.9.0 + chalk: ^4.1.0 + debug: ^4.3.1 + dotenv: ^16.0.0 + graphql-request: ^6.0.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.0 + jose: ^5.0.0 + js-yaml: ^4.0.0 + lodash: ^4.17.20 + scuid: ^1.1.0 + tslib: ^2.4.0 + yaml-ast-parser: ^0.0.43 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 70eeefff95ccacc10bcc94ba6a4f102b4135303dd39fb549209e39b5f460611c730bbc92700b81d2b138b9c32806de48e6b5fbb0166756e255ab72337ce3dadd + languageName: node + linkType: hard + +"@graphql-tools/relay-operation-optimizer@npm:^7.0.0": + version: 7.0.1 + resolution: "@graphql-tools/relay-operation-optimizer@npm:7.0.1" + dependencies: + "@ardatan/relay-compiler": 12.0.0 + "@graphql-tools/utils": ^10.0.13 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 24a29aea91a0028d7624ae38fed1bfd387ecf5a0e297dbbca23c0f73c51956765db7517b2a75a5b3a6003ea5e3f025f0fc4f527eec22b05e7e25216dc6318797 + languageName: node + linkType: hard + +"@graphql-tools/schema@npm:^10.0.0, @graphql-tools/schema@npm:^10.0.3, @graphql-tools/schema@npm:^10.0.4": + version: 10.0.6 + resolution: "@graphql-tools/schema@npm:10.0.6" + dependencies: + "@graphql-tools/merge": ^9.0.6 + "@graphql-tools/utils": ^10.5.4 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 3548c7daf7df7a13ae8852379b5589ee2041caabca31e3c14106dfae3e4417b66623a9f33037c93659e84c1129e9ab93ba16138f1fdd43c6c858802d4c9e93a8 + languageName: node + linkType: hard + +"@graphql-tools/url-loader@npm:^8.0.0, @graphql-tools/url-loader@npm:^8.0.2": + version: 8.0.2 + resolution: "@graphql-tools/url-loader@npm:8.0.2" + dependencies: + "@ardatan/sync-fetch": ^0.0.1 + "@graphql-tools/delegate": ^10.0.4 + "@graphql-tools/executor-graphql-ws": ^1.1.2 + "@graphql-tools/executor-http": ^1.0.9 + "@graphql-tools/executor-legacy-ws": ^1.0.6 + "@graphql-tools/utils": ^10.0.13 + "@graphql-tools/wrap": ^10.0.2 + "@types/ws": ^8.0.0 + "@whatwg-node/fetch": ^0.9.0 + isomorphic-ws: ^5.0.0 + tslib: ^2.4.0 + value-or-promise: ^1.0.11 + ws: ^8.12.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: f3dfb80678fa7b0473f0bbdbbb7ce0d64878bfa2a265bee5dc1eb698ab6c033737a4dd8ab037b880d8aa040771e66118dc067d06af4b813601a2025545e66e1d + languageName: node + linkType: hard + +"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.13, @graphql-tools/utils@npm:^10.1.1, @graphql-tools/utils@npm:^10.3.0, @graphql-tools/utils@npm:^10.3.2, @graphql-tools/utils@npm:^10.3.4, @graphql-tools/utils@npm:^10.5.4": + version: 10.5.4 + resolution: "@graphql-tools/utils@npm:10.5.4" + dependencies: + "@graphql-typed-document-node/core": ^3.1.1 + cross-inspect: 1.0.1 + dset: ^3.1.2 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 56b41b276401c9010e47627b0d84336ac840d4e3e7c0124884626f11b92a20a1f1aec97712dd06d8adf5239fc39f4a86d4f4349f6a7028205e577e4c200bf070 + languageName: node + linkType: hard + +"@graphql-tools/wrap@npm:^10.0.2": + version: 10.0.5 + resolution: "@graphql-tools/wrap@npm:10.0.5" + dependencies: + "@graphql-tools/delegate": ^10.0.4 + "@graphql-tools/schema": ^10.0.3 + "@graphql-tools/utils": ^10.1.1 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 7cf834eef085a4ad0f6a0a3aa2b58d8bc329375a6acb2e93dc59962ce8655d205877fa08b6a35eaea07c6e7279feab683a03194703db1c9d6be8b1eb7da23d0e + languageName: node + linkType: hard + +"@graphql-typed-document-node/core@npm:3.2.0, @graphql-typed-document-node/core@npm:^3.1.1, @graphql-typed-document-node/core@npm:^3.2.0": + version: 3.2.0 + resolution: "@graphql-typed-document-node/core@npm:3.2.0" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: fa44443accd28c8cf4cb96aaaf39d144a22e8b091b13366843f4e97d19c7bfeaf609ce3c7603a4aeffe385081eaf8ea245d078633a7324c11c5ec4b2011bb76d + languageName: node + linkType: hard + "@grpc/grpc-js@npm:^1.7.1": version: 1.9.14 resolution: "@grpc/grpc-js@npm:1.9.14" @@ -6564,6 +7959,44 @@ __metadata: languageName: node linkType: hard +"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.1.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 + languageName: node + linkType: hard + +"@headlessui/react@npm:^1.5.0": + version: 1.7.19 + resolution: "@headlessui/react@npm:1.7.19" + dependencies: + "@tanstack/react-virtual": ^3.0.0-beta.60 + client-only: ^0.0.1 + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + checksum: 2a343a5fcf1f45e870cc94613231b89a8da78114001ffafa4751a0eceae7569ff9237aff1f2aedfa6f6e53ee3bb9ba5e5d19ebf1878fee3ff4f3c733fddc1087 + languageName: node + linkType: hard + +"@heroicons/react@npm:^1.0.6": + version: 1.0.6 + resolution: "@heroicons/react@npm:1.0.6" + peerDependencies: + react: ">= 16" + checksum: 372b1eda3ce735ef069777bc96304f70de585ebb71a6d1cedc121bb695f9bca235619112e3ee14e8779e95a03096813cbbe3b755927a54b7580d1ce084fa4096 + languageName: node + linkType: hard + "@hookform/error-message@npm:^2.0.0": version: 2.0.0 resolution: "@hookform/error-message@npm:2.0.0" @@ -7554,13 +8987,20 @@ __metadata: languageName: node linkType: hard -"@juggle/resize-observer@npm:^3.3.1": +"@juggle/resize-observer@npm:^3.3.1, @juggle/resize-observer@npm:^3.4.0": version: 3.4.0 resolution: "@juggle/resize-observer@npm:3.4.0" checksum: 2505028c05cc2e17639fcad06218b1c4b60f932a4ebb4b41ab546ef8c157031ae377e3f560903801f6d01706dbefd4943b6c4704bf19ed86dfa1c62f1473a570 languageName: node linkType: hard +"@kamilkisiela/fast-url-parser@npm:^1.1.4": + version: 1.1.4 + resolution: "@kamilkisiela/fast-url-parser@npm:1.1.4" + checksum: 921d305eff1fce5c7c669aee5cfe39e50109968addb496c23f0a42253d030e3cd5865eb01b13245915923bee452db75ba8a8254e69b0d0575d3c168efce7091e + languageName: node + linkType: hard + "@lexical/clipboard@npm:0.9.1": version: 0.9.1 resolution: "@lexical/clipboard@npm:0.9.1" @@ -8325,6 +9765,13 @@ __metadata: languageName: node linkType: hard +"@next/env@npm:14.2.12": + version: 14.2.12 + resolution: "@next/env@npm:14.2.12" + checksum: 90141a984bc36c2a1a281392e2821744f442406a453107bf96d89c3e425f9ce414e4996b4e51c00cbf9817c652b4f34b1c310747a7fdf3bb62ea3526ef92ae8b + languageName: node + linkType: hard + "@next/eslint-plugin-next@npm:13.2.1": version: 13.2.1 resolution: "@next/eslint-plugin-next@npm:13.2.1" @@ -8357,6 +9804,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-darwin-arm64@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-darwin-arm64@npm:14.2.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@next/swc-darwin-x64@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-darwin-x64@npm:13.5.5" @@ -8371,6 +9825,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-darwin-x64@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-darwin-x64@npm:14.2.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@next/swc-linux-arm64-gnu@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-arm64-gnu@npm:13.5.5" @@ -8385,6 +9846,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-arm64-gnu@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-linux-arm64-gnu@npm:14.2.12" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@next/swc-linux-arm64-musl@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-arm64-musl@npm:13.5.5" @@ -8399,6 +9867,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-arm64-musl@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-linux-arm64-musl@npm:14.2.12" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@next/swc-linux-x64-gnu@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-x64-gnu@npm:13.5.5" @@ -8413,6 +9888,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-x64-gnu@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-linux-x64-gnu@npm:14.2.12" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@next/swc-linux-x64-musl@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-linux-x64-musl@npm:13.5.5" @@ -8427,6 +9909,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-x64-musl@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-linux-x64-musl@npm:14.2.12" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@next/swc-win32-arm64-msvc@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-win32-arm64-msvc@npm:13.5.5" @@ -8441,6 +9930,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-arm64-msvc@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-win32-arm64-msvc@npm:14.2.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@next/swc-win32-ia32-msvc@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-win32-ia32-msvc@npm:13.5.5" @@ -8455,6 +9951,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-ia32-msvc@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-win32-ia32-msvc@npm:14.2.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@next/swc-win32-x64-msvc@npm:13.5.5": version: 13.5.5 resolution: "@next/swc-win32-x64-msvc@npm:13.5.5" @@ -8469,6 +9972,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-x64-msvc@npm:14.2.12": + version: 14.2.12 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@next/third-parties@npm:^14.2.5": version: 14.2.5 resolution: "@next/third-parties@npm:14.2.5" @@ -9456,6 +10966,39 @@ __metadata: languageName: node linkType: hard +"@peculiar/asn1-schema@npm:^2.3.8": + version: 2.3.13 + resolution: "@peculiar/asn1-schema@npm:2.3.13" + dependencies: + asn1js: ^3.0.5 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + checksum: 245cf398992788fc61c48a4e1263a47803bccd91807e7a419e3fe9ad44ede5e396a5f8d13215b0765774855b634fe10d730b08944e5dc085fc5ee121a7e0139e + languageName: node + linkType: hard + +"@peculiar/json-schema@npm:^1.1.12": + version: 1.1.12 + resolution: "@peculiar/json-schema@npm:1.1.12" + dependencies: + tslib: ^2.0.0 + checksum: b26ececdc23c5ef25837f8be8d1eb5e1c8bb6e9ae7227ac59ffea57fff56bd05137734e7685e9100595d3d88d906dff638ef8d1df54264c388d3eac1b05aa060 + languageName: node + linkType: hard + +"@peculiar/webcrypto@npm:^1.4.0": + version: 1.5.0 + resolution: "@peculiar/webcrypto@npm:1.5.0" + dependencies: + "@peculiar/asn1-schema": ^2.3.8 + "@peculiar/json-schema": ^1.1.12 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + webcrypto-core: ^1.8.0 + checksum: 9022d7452d564a5a26fbacf477842be34736f2d9139f2f5026adc47fdeda7033193d727491503f2a829d35ab819bbfa61c82a785c49c999eac535ecd69a3a459 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -9625,6 +11168,13 @@ __metadata: languageName: node linkType: hard +"@prisma/debug@npm:5.19.1": + version: 5.19.1 + resolution: "@prisma/debug@npm:5.19.1" + checksum: 73fb1de49e09bf641501c7c5819d033b29df282af4f93c96a1347ee56888e4b946d27c6b72e285fe2d31603561e52d7d266d5fdb6b3d76ee2007df9178e28bef + languageName: node + linkType: hard + "@prisma/debug@npm:5.3.1": version: 5.3.1 resolution: "@prisma/debug@npm:5.3.1" @@ -9800,6 +11350,15 @@ __metadata: languageName: node linkType: hard +"@prisma/generator-helper@npm:^5.9.1": + version: 5.19.1 + resolution: "@prisma/generator-helper@npm:5.19.1" + dependencies: + "@prisma/debug": 5.19.1 + checksum: 8cb9cd971dd1d74d474d70373fc8c6f76fc9c669f956390acea36dc879241b1bbbf14b2e0d36d1872ef68cc4c532b44f4f0fc248135c8b7618b5b0ab46f2e0f6 + languageName: node + linkType: hard + "@prisma/generator-helper@npm:~3.8.1": version: 3.8.1 resolution: "@prisma/generator-helper@npm:3.8.1" @@ -10107,6 +11666,33 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-accordion@npm:^1.0.0": + version: 1.2.0 + resolution: "@radix-ui/react-accordion@npm:1.2.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-collapsible": 1.1.0 + "@radix-ui/react-collection": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 7761c9e5758d4aa288d21ad02925cca0b58dbcab1ebe4de2c660b601d12a4cb50c9949a267a1d34d4a48fa87dd3076a4a476c28a22efdfbae219d6e51b99b760 + languageName: node + linkType: hard + "@radix-ui/react-arrow@npm:1.0.3": version: 1.0.3 resolution: "@radix-ui/react-arrow@npm:1.0.3" @@ -10177,6 +11763,32 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-collapsible@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-collapsible@npm:1.1.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-presence": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 1891dde55bf716d9619bd54da72bc65005cbc9dec2395079b53abe0bf4d655906bcbb85ca040e09b9bd8e3fcd0e58154a7ddc410b848db1dfb34ca1530459af0 + languageName: node + linkType: hard + "@radix-ui/react-collapsible@npm:^1.0.0": version: 1.0.3 resolution: "@radix-ui/react-collapsible@npm:1.0.3" @@ -10242,6 +11854,28 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-collection@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-collection@npm:1.1.0" + dependencies: + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-slot": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 70cee7f23cf19b0a9533723ba2ce80a40013d7b5e3588acd40e3f155cb46e0d94d9ebef58fd907d9862e2cb2b65f3f73315719597a790aefabfeae8a64566807 + languageName: node + linkType: hard + "@radix-ui/react-compose-refs@npm:0.1.0": version: 0.1.0 resolution: "@radix-ui/react-compose-refs@npm:0.1.0" @@ -10416,6 +12050,19 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-direction@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-direction@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 25ad0d1d65ad08c93cebfbefdff9ef2602e53f4573a66b37d2c366ede9485e75ec6fc8e7dd7d2939b34ea5504ca0fe6ac4a3acc2f6ee9b62d131d65486eafd49 + languageName: node + linkType: hard + "@radix-ui/react-dismissable-layer@npm:0.1.5": version: 0.1.5 resolution: "@radix-ui/react-dismissable-layer@npm:0.1.5" @@ -10498,6 +12145,29 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-dismissable-layer@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-escape-keydown": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 857feab2d5184a72df4e6dd9430c8e4b9fe7304790ef69512733346eee5fc33a6527256fc135d4bee6d94e8cc9c1b83c3d91da96cb4bf8300f88e9c660b71b08 + languageName: node + linkType: hard + "@radix-ui/react-dropdown-menu@npm:^2.0.5": version: 2.0.5 resolution: "@radix-ui/react-dropdown-menu@npm:2.0.5" @@ -10669,6 +12339,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-id@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-id@npm:1.1.0" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 6fbc9d1739b3b082412da10359e63967b4f3a60383ebda4c9e56b07a722d29bee53b203b3b1418f88854a29315a7715867133bb149e6e22a027a048cdd20d970 + languageName: node + linkType: hard + "@radix-ui/react-label@npm:0.1.5": version: 0.1.5 resolution: "@radix-ui/react-label@npm:0.1.5" @@ -10721,6 +12406,38 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-navigation-menu@npm:^1.0.0": + version: 1.2.0 + resolution: "@radix-ui/react-navigation-menu@npm:1.2.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-collection": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-dismissable-layer": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-presence": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + "@radix-ui/react-use-previous": 1.1.0 + "@radix-ui/react-visually-hidden": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: bb0c18a1772148cb083a94879956261936a235345f442ab4ad6e906333daa074b9a6312ebb5977c667e9fa54e16bdf91dc96f3f46db6281955d3da363da08d2b + languageName: node + linkType: hard + "@radix-ui/react-popover@npm:^1.0.2": version: 1.0.6 resolution: "@radix-ui/react-popover@npm:1.0.6" @@ -10915,6 +12632,26 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-presence@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-presence@npm:1.1.0" + dependencies: + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 7f482268aa5bb5a4214dcf39d20ad93cac96585f1f248931be897ed8a9f99965b7f9b2e8bd4f4140c64eb243b471c471bf148e107f49578cc582faa773d3e83a + languageName: node + linkType: hard + "@radix-ui/react-primitive@npm:0.1.4": version: 0.1.4 resolution: "@radix-ui/react-primitive@npm:0.1.4" @@ -11036,6 +12773,33 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-roving-focus@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-roving-focus@npm:1.1.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-collection": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 6f3a3fd047b0ac503f8a97297fba937c15653d01c883f344970f1c4206e9485572bc613f2561973f9010e96525ca87030ca5abf83a2e4dd67511f8b5afa20581 + languageName: node + linkType: hard + "@radix-ui/react-select@npm:^0.1.1": version: 0.1.1 resolution: "@radix-ui/react-select@npm:0.1.1" @@ -11262,6 +13026,32 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-tabs@npm:^1.0.0": + version: 1.1.0 + resolution: "@radix-ui/react-tabs@npm:1.1.0" + dependencies: + "@radix-ui/primitive": 1.1.0 + "@radix-ui/react-context": 1.1.0 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-presence": 1.1.0 + "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-roving-focus": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 68200d65f02f1aa9d8c06f9a587dbf169e0a4efa715eb855d98f9dd8e3c0ba32981f431f4e306d2ff85005dfe2b0a905c8d5f9ee50f7a80abc1e4eb59ecd56d7 + languageName: node + linkType: hard + "@radix-ui/react-toast@npm:^1.1.5": version: 1.1.5 resolution: "@radix-ui/react-toast@npm:1.1.5" @@ -11555,6 +13345,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-use-escape-keydown@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 9bf88ea272b32ea0f292afd336780a59c5646f795036b7e6105df2d224d73c54399ee5265f61d571eb545d28382491a8b02dc436e3088de8dae415d58b959b71 + languageName: node + linkType: hard + "@radix-ui/react-use-layout-effect@npm:0.1.0": version: 0.1.0 resolution: "@radix-ui/react-use-layout-effect@npm:0.1.0" @@ -11723,6 +13528,25 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-visually-hidden@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-visually-hidden@npm:1.1.0" + dependencies: + "@radix-ui/react-primitive": 2.0.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 9e30775dc3bd562722b5671d91545e3e16111f9d1942c98188cb84935eb4a7d31ef1ad1e028e1f1d41e490392f295fbd55424106263869cc7028de9f6141363d + languageName: node + linkType: hard + "@radix-ui/rect@npm:1.0.1": version: 1.0.1 resolution: "@radix-ui/rect@npm:1.0.1" @@ -11822,6 +13646,13 @@ __metadata: languageName: node linkType: hard +"@repeaterjs/repeater@npm:^3.0.4, @repeaterjs/repeater@npm:^3.0.6": + version: 3.0.6 + resolution: "@repeaterjs/repeater@npm:3.0.6" + checksum: aae878b953162bec77c94b45f2236ddfc01a65308267c7cb30220fa2f8511654a302c0d32aad228c58241d685607d7bb35b6d528b2879355e6636ff08fddb266 + languageName: node + linkType: hard + "@resvg/resvg-wasm@npm:2.4.1": version: 2.4.1 resolution: "@resvg/resvg-wasm@npm:2.4.1" @@ -12855,6 +14686,29 @@ __metadata: languageName: node linkType: hard +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.25.16": version: 0.25.24 resolution: "@sinclair/typebox@npm:0.25.24" @@ -12869,6 +14723,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^5.2.0": version: 5.6.0 resolution: "@sindresorhus/is@npm:5.6.0" @@ -13395,13 +15256,27 @@ __metadata: languageName: node linkType: hard -"@stablelib/base64@npm:^1.0.0": +"@stablelib/base64@npm:^1.0.0, @stablelib/base64@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/base64@npm:1.0.1" checksum: 3ef4466d1d6889ac3fc67407bc21aa079953981c322eeca3b29f426d05506c63011faab1bfc042d7406e0677a94de6c9d2db2ce079afdd1eccae90031bfb5859 languageName: node linkType: hard +"@stablelib/hex@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hex@npm:1.0.1" + checksum: 557f1c5d6b42963deee7627d4be1ae3542607851c5561e9419c42682d09562ebd3a06e2d92e088c52213a71ed121ec38221abfc5acd9e65707a77ecee3c96915 + languageName: node + linkType: hard + +"@stablelib/utf8@npm:^1.0.1": + version: 1.0.2 + resolution: "@stablelib/utf8@npm:1.0.2" + checksum: 3ab01baa4eb36eece44a310bf6b2e4313e8d585fc04dbcf8a5dc2d239f06071f34038b85aad6fbd98e9969f0b3b0584fcb541fe5e512c8f0cc0982b9fe1290a3 + languageName: node + linkType: hard + "@storybook/addon-actions@npm:7.6.3, @storybook/addon-actions@npm:^7.6.3": version: 7.6.3 resolution: "@storybook/addon-actions@npm:7.6.3" @@ -14560,6 +16435,16 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:0.5.5": + version: 0.5.5 + resolution: "@swc/helpers@npm:0.5.5" + dependencies: + "@swc/counter": ^0.1.3 + tslib: ^2.4.0 + checksum: d4f207b191e54b29460804ddf2984ba6ece1d679a0b2f6a9c765dcf27bba92c5769e7965668a4546fb9f1021eaf0ff9be4bf5c235ce12adcd65acdfe77187d11 + languageName: node + linkType: hard + "@swc/types@npm:^0.1.5": version: 0.1.5 resolution: "@swc/types@npm:0.1.5" @@ -14576,6 +16461,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: ^2.0.0 + checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -14618,6 +16512,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:4.36.1": + version: 4.36.1 + resolution: "@tanstack/query-core@npm:4.36.1" + checksum: 47672094da20d89402d9fe03bb7b0462be73a76ff9ca715169738bc600a719d064d106d083a8eedae22a2c22de22f87d5eb5d31ef447aba771d9190f2117ed10 + languageName: node + linkType: hard + "@tanstack/query-core@npm:5.17.19": version: 5.17.19 resolution: "@tanstack/query-core@npm:5.17.19" @@ -14625,6 +16526,25 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-query@npm:^4.3.9": + version: 4.36.1 + resolution: "@tanstack/react-query@npm:4.36.1" + dependencies: + "@tanstack/query-core": 4.36.1 + use-sync-external-store: ^1.2.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: "*" + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 1aff0a476859386f8d32253fa0d0bde7b81769a6d4d4d9cbd78778f0f955459a3bdb7ee27a0d2ee7373090f12998b45df80db0b5b313bd0a7a39d36c6e8e51c5 + languageName: node + linkType: hard + "@tanstack/react-query@npm:^5.17.15": version: 5.17.19 resolution: "@tanstack/react-query@npm:5.17.19" @@ -14648,6 +16568,18 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-virtual@npm:^3.0.0-beta.60": + version: 3.10.8 + resolution: "@tanstack/react-virtual@npm:3.10.8" + dependencies: + "@tanstack/virtual-core": 3.10.8 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 40a5d6089908096634fec2aa0cd646ca47c044c745e1b0d190ecbf9905ad2e6266ccd56c2550ed92f47349954dc11eb6930beac1354441ce7c98af81c5454d3f + languageName: node + linkType: hard + "@tanstack/table-core@npm:8.9.3": version: 8.9.3 resolution: "@tanstack/table-core@npm:8.9.3" @@ -14655,6 +16587,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/virtual-core@npm:3.10.8": + version: 3.10.8 + resolution: "@tanstack/virtual-core@npm:3.10.8" + checksum: 1c5307b534bb963094acc4a2691fcc331364a865d8513abe9f5ca6be577d7bb4b2821e8dddbf259c60ee65afb2f4e5d6debab1af897b0c464ec1bd18906ecbe9 + languageName: node + linkType: hard + "@tediousjs/connection-string@npm:^0.5.0": version: 0.5.0 resolution: "@tediousjs/connection-string@npm:0.5.0" @@ -14850,6 +16789,15 @@ __metadata: languageName: node linkType: hard +"@trpc/client@npm:^10.0.0": + version: 10.45.2 + resolution: "@trpc/client@npm:10.45.2" + peerDependencies: + "@trpc/server": 10.45.2 + checksum: d1eaa8e0059a371265065dafb48372be8456bc5bbc68f63c92401b12258cf15efb3f9f3790ef18ec6a0b7b73daa362bbd371f98db67c0610f2aee284f12cf09a + languageName: node + linkType: hard + "@trpc/next@npm:11.0.0-next-beta.222": version: 11.0.0-next-beta.222 resolution: "@trpc/next@npm:11.0.0-next-beta.222" @@ -14890,6 +16838,13 @@ __metadata: languageName: node linkType: hard +"@trpc/server@npm:^10.0.0": + version: 10.45.2 + resolution: "@trpc/server@npm:10.45.2" + checksum: 30b92853c45747a376bbbd5c4eef71fea17a2b22e83ba7e694fb13cc99b15d1f24a17aa9124346074618fb5cee8d13434aa16cdf24af82f5e8acabdecfee0ca2 + languageName: node + linkType: hard + "@tryvital/vital-node@npm:^1.4.6": version: 1.4.6 resolution: "@tryvital/vital-node@npm:1.4.6" @@ -14943,6 +16898,25 @@ __metadata: languageName: node linkType: hard +"@typeform/embed-react@npm:^1.2.4": + version: 1.21.0 + resolution: "@typeform/embed-react@npm:1.21.0" + dependencies: + "@typeform/embed": 1.38.0 + fast-deep-equal: ^3.1.3 + peerDependencies: + react: ">=16.8.0" + checksum: 1d91cb797dfe7b27e08798f7a571f34724a8f56bf9c89a8ed2a454820efce2de4db44fd4a18f446573784c28f79478f269c1719500e1b332e7ea34ea77ffa185 + languageName: node + linkType: hard + +"@typeform/embed@npm:1.38.0": + version: 1.38.0 + resolution: "@typeform/embed@npm:1.38.0" + checksum: 41115134e5cee28f5e031181b4525c7885d23707699cf183921110262717c7544bfd101428267410b812914c235687783e373ce98e37bdc447d72f8177663597 + languageName: node + linkType: hard + "@types/accept-language-parser@npm:1.5.2": version: 1.5.2 resolution: "@types/accept-language-parser@npm:1.5.2" @@ -15054,6 +17028,18 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "*" + "@types/keyv": ^3.1.4 + "@types/node": "*" + "@types/responselike": ^1.0.0 + checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 + languageName: node + linkType: hard + "@types/cli-progress@npm:^3.11.0": version: 3.11.4 resolution: "@types/cli-progress@npm:3.11.4" @@ -15219,6 +17205,13 @@ __metadata: languageName: node linkType: hard +"@types/debounce@npm:^1.2.1": + version: 1.2.4 + resolution: "@types/debounce@npm:1.2.4" + checksum: decef3eee65d681556d50f7fac346f1b33134f6b21f806d41326f9dfb362fa66b0282ff0640ae6791b690694c9dc3dad4e146e909e707e6f96650f3aa325b9da + languageName: node + linkType: hard + "@types/debug@npm:4.1.7": version: 4.1.7 resolution: "@types/debug@npm:4.1.7" @@ -15246,6 +17239,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.0.0": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "*" + checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + "@types/detect-port@npm:^1.3.0": version: 1.3.5 resolution: "@types/detect-port@npm:1.3.5" @@ -15315,6 +17317,15 @@ __metadata: languageName: node linkType: hard +"@types/estree-jsx@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree-jsx@npm:1.0.5" + dependencies: + "@types/estree": "*" + checksum: a028ab0cd7b2950168a05c6a86026eb3a36a54a4adfae57f13911d7b49dffe573d9c2b28421b2d029b49b3d02fcd686611be2622dc3dad6d9791166c083f6008 + languageName: node + linkType: hard + "@types/estree@npm:*, @types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" @@ -15442,6 +17453,13 @@ __metadata: languageName: node linkType: hard +"@types/gtag.js@npm:^0.0.10": + version: 0.0.10 + resolution: "@types/gtag.js@npm:0.0.10" + checksum: 5c18ffdc64418887763ec1a564e73c9fbf222ff3eece1fbc35a182fdd884e7884bb7708f67e6e4939f157bb9f2cb7a4aff42be7834527e35c5aac4f98783164c + languageName: node + linkType: hard + "@types/hast@npm:^2.0.0": version: 2.3.4 resolution: "@types/hast@npm:2.3.4" @@ -15451,6 +17469,15 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "*" + checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 + languageName: node + linkType: hard + "@types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" @@ -15475,7 +17502,7 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:^4.0.2": +"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" checksum: 7f4dd832e618bc1e271be49717d7b4066d77c2d4eed5b81198eb987e532bb3e1c7e02f45d77918185bad936f884b700c10cebe06305f50400f382ab75055f9e8 @@ -15566,6 +17593,13 @@ __metadata: languageName: node linkType: hard +"@types/js-yaml@npm:^4.0.0": + version: 4.0.9 + resolution: "@types/js-yaml@npm:4.0.9" + checksum: e5e5e49b5789a29fdb1f7d204f82de11cb9e8f6cb24ab064c616da5d6e1b3ccfbf95aa5d1498a9fbd3b9e745564e69b4a20b6c530b5a8bbb2d4eb830cda9bc69 + languageName: node + linkType: hard + "@types/jsdom@npm:^21.1.3": version: 21.1.4 resolution: "@types/jsdom@npm:21.1.4" @@ -15650,6 +17684,15 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "*" + checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d + languageName: node + linkType: hard + "@types/koa-compose@npm:*": version: 3.2.8 resolution: "@types/koa-compose@npm:3.2.8" @@ -15745,6 +17788,24 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^3.0.0": + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" + dependencies: + "@types/unist": ^2 + checksum: af85042a4e3af3f879bde4059fa9e76c71cb552dffc896cdcc6cf9dc1fd38e37035c2dbd6245cfa6535b433f1f0478f5549696234ccace47a64055a10c656530 + languageName: node + linkType: hard + +"@types/mdast@npm:^4.0.0": + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" + dependencies: + "@types/unist": "*" + checksum: 20c4e9574cc409db662a35cba52b068b91eb696b3049e94321219d47d34c8ccc99a142be5c76c80a538b612457b03586bc2f6b727a3e9e7530f4c8568f6282ee + languageName: node + linkType: hard + "@types/mdurl@npm:*": version: 1.0.2 resolution: "@types/mdurl@npm:1.0.2" @@ -15752,6 +17813,13 @@ __metadata: languageName: node linkType: hard +"@types/mdurl@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/mdurl@npm:1.0.5" + checksum: e8e872e8da8f517a9c748b06cec61c947cb73fd3069e8aeb0926670ec5dfac5d30549b3d0f1634950401633e812f9b7263f2d5dbe7e98fce12bcb2c659aa4b21 + languageName: node + linkType: hard + "@types/mdx@npm:^2.0.0": version: 2.0.10 resolution: "@types/mdx@npm:2.0.10" @@ -15882,6 +17950,13 @@ __metadata: languageName: node linkType: hard +"@types/parse5@npm:^6.0.0": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: ddb59ee4144af5dfcc508a8dcf32f37879d11e12559561e65788756b95b33e6f03ea027d88e1f5408f9b7bfb656bf630ace31a2169edf44151daaf8dd58df1b7 + languageName: node + linkType: hard + "@types/passport-jwt@npm:^3.0.13": version: 3.0.13 resolution: "@types/passport-jwt@npm:3.0.13" @@ -16009,6 +18084,13 @@ __metadata: languageName: node linkType: hard +"@types/react-gtm-module@npm:^2.0.1": + version: 2.0.3 + resolution: "@types/react-gtm-module@npm:2.0.3" + checksum: b4b892c9efe93f6f624a42ffe5de37ef7615139191eccc127f7dc2006a70b0540aacb0dc882e3452c344498fdc7f2d4eafc53fe3a33696c1e60fc6852ac650f5 + languageName: node + linkType: hard + "@types/react-phone-number-input@npm:^3.0.14": version: 3.0.14 resolution: "@types/react-phone-number-input@npm:3.0.14" @@ -16071,6 +18153,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "*" + checksum: 6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 + languageName: node + linkType: hard + "@types/retry@npm:0.12.0": version: 0.12.0 resolution: "@types/retry@npm:0.12.0" @@ -16247,6 +18338,20 @@ __metadata: languageName: node linkType: hard +"@types/unist@npm:^2": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e + languageName: node + linkType: hard + +"@types/unist@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a + languageName: node + linkType: hard + "@types/uuid@npm:8.3.1": version: 8.3.1 resolution: "@types/uuid@npm:8.3.1" @@ -16293,6 +18398,24 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.0.0": + version: 8.5.12 + resolution: "@types/ws@npm:8.5.12" + dependencies: + "@types/node": "*" + checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 + languageName: node + linkType: hard + +"@types/xml2js@npm:^0.4.11": + version: 0.4.14 + resolution: "@types/xml2js@npm:0.4.14" + dependencies: + "@types/node": "*" + checksum: df9f106b9953dcdec7ba3304ebc56d6c2f61d49bf556d600bed439f94a1733f73ca0bf2d0f64330b402191622862d9d6058bab9d7e3dcb5b0fe51ebdc4372aac + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -16607,7 +18730,7 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 @@ -16651,6 +18774,15 @@ __metadata: languageName: node linkType: hard +"@vercel/analytics@npm:^0.1.6": + version: 0.1.11 + resolution: "@vercel/analytics@npm:0.1.11" + peerDependencies: + react: ^16.8||^17||^18 + checksum: 05b8180ac6e23ebe7c09d74c43f8ee78c408cd0b6546e676389cbf4fba44dfeeae3648c9b52e2421be64fe3aeee8b026e6ea4bdfc0589fb5780670f2b090a167 + languageName: node + linkType: hard + "@vercel/edge-config@npm:^0.1.1": version: 0.1.1 resolution: "@vercel/edge-config@npm:0.1.1" @@ -17084,6 +19216,77 @@ __metadata: languageName: node linkType: hard +"@whatwg-node/events@npm:^0.0.3": + version: 0.0.3 + resolution: "@whatwg-node/events@npm:0.0.3" + checksum: af26f40d4d0a0f5f0ee45fc6124afb8d6b33988dae96ab0fb87aa5e66d1ff08a749491b9da533ea524bbaebd4a770736f254d574a91ab4455386aa098cee8c77 + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:^0.5.3": + version: 0.5.4 + resolution: "@whatwg-node/fetch@npm:0.5.4" + dependencies: + "@peculiar/webcrypto": ^1.4.0 + abort-controller: ^3.0.0 + busboy: ^1.6.0 + form-data-encoder: ^1.7.1 + formdata-node: ^4.3.1 + node-fetch: ^2.6.7 + undici: ^5.12.0 + web-streams-polyfill: ^3.2.0 + checksum: 6fb6c6a582cb78fc438beee11f1d931eabc0ac8b5b660b68ea30a42c2068f4d3126d2b07e21770a4d6f391e70979bae527ca892898da9857e73dc3cc7adb8da9 + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:^0.8.0": + version: 0.8.8 + resolution: "@whatwg-node/fetch@npm:0.8.8" + dependencies: + "@peculiar/webcrypto": ^1.4.0 + "@whatwg-node/node-fetch": ^0.3.6 + busboy: ^1.6.0 + urlpattern-polyfill: ^8.0.0 + web-streams-polyfill: ^3.2.1 + checksum: 891407ba57e32e5af70a3b0a86980c4466dcf2ba8581b6927475c85400280b163085519e98821dd94776da9aa1b0b1e221e718009e2abed9c8a0d4721025b2ab + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:^0.9.0": + version: 0.9.21 + resolution: "@whatwg-node/fetch@npm:0.9.21" + dependencies: + "@whatwg-node/node-fetch": ^0.5.23 + urlpattern-polyfill: ^10.0.0 + checksum: 09cea7a1de578f812f403ebbc2a325d57f7055b415cdaffe9d1f2e05d32ecdc5b61d0ff9aab6271f250a8f360fbbaf2f0e773ff2570b777c3d005507a3c9d950 + languageName: node + linkType: hard + +"@whatwg-node/node-fetch@npm:^0.3.6": + version: 0.3.6 + resolution: "@whatwg-node/node-fetch@npm:0.3.6" + dependencies: + "@whatwg-node/events": ^0.0.3 + busboy: ^1.6.0 + fast-querystring: ^1.1.1 + fast-url-parser: ^1.1.3 + tslib: ^2.3.1 + checksum: d3d7b0a0242c0511c7b666de66d9096fb24ea251426ce76e3a26a8ca17408de5d4d4f81b5aaec840cc7025f0321fb97e06067c53f377c844a5a9473dd76491ae + languageName: node + linkType: hard + +"@whatwg-node/node-fetch@npm:^0.5.23": + version: 0.5.26 + resolution: "@whatwg-node/node-fetch@npm:0.5.26" + dependencies: + "@kamilkisiela/fast-url-parser": ^1.1.4 + busboy: ^1.6.0 + fast-querystring: ^1.1.1 + tslib: ^2.6.3 + checksum: 00f344ee406d6ae421d0b78ec436106c44a539f5f748d2724d533fb4893c96eff3635e0e191781d57a7876dbe36ffb18ff897df437a55d0eb35285158bfc4eab + languageName: node + linkType: hard + "@wojtekmaj/date-utils@npm:^1.0.2, @wojtekmaj/date-utils@npm:^1.0.3": version: 1.0.3 resolution: "@wojtekmaj/date-utils@npm:1.0.3" @@ -17867,6 +20070,13 @@ __metadata: languageName: node linkType: hard +"array-flatten@npm:^3.0.0": + version: 3.0.0 + resolution: "array-flatten@npm:3.0.0" + checksum: ad00c51ca70cf837501fb6da823ba39bc6a86b43d0b76d840daa02fe0f8e68e94ad5bc2d0d038053118b879aaca8ea6168c32c7387a2fa5b118ad28db4f1f863 + languageName: node + linkType: hard + "array-includes@npm:^3.1.4": version: 3.1.4 resolution: "array-includes@npm:3.1.4" @@ -18168,6 +20378,17 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.1, asn1js@npm:^3.0.5": + version: 3.0.5 + resolution: "asn1js@npm:3.0.5" + dependencies: + pvtsutils: ^1.3.2 + pvutils: ^1.1.3 + tslib: ^2.4.0 + checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb + languageName: node + linkType: hard + "assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": version: 1.0.0 resolution: "assert-plus@npm:1.0.0" @@ -18259,6 +20480,13 @@ __metadata: languageName: node linkType: hard +"async-scheduler@npm:^1.4.4": + version: 1.4.4 + resolution: "async-scheduler@npm:1.4.4" + checksum: 080310e642bc4309aa83d625b21f9f0f1291bd0a292361cf6c0ebc86646ca719888bebc3d519f8ed177130b623b0f20640dad7f24fd8c2ede31d6d6f976968a4 + languageName: node + linkType: hard + "async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -18311,7 +20539,7 @@ __metadata: languageName: node linkType: hard -"auto-bind@npm:4.0.0": +"auto-bind@npm:4.0.0, auto-bind@npm:~4.0.0": version: 4.0.0 resolution: "auto-bind@npm:4.0.0" checksum: 00cad71cce5742faccb7dd65c1b55ebc4f45add4b0c9a1547b10b05bab22813230133b0c892c67ba3eb969a4524710c5e43cc45c72898ec84e56f3a596e7a04f @@ -18495,6 +20723,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.6.1": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe + languageName: node + linkType: hard + "axios@npm:^1.6.7": version: 1.6.8 resolution: "axios@npm:1.6.8" @@ -18662,6 +20901,13 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-trailing-function-commas@npm:^7.0.0-beta.0": + version: 7.0.0-beta.0 + resolution: "babel-plugin-syntax-trailing-function-commas@npm:7.0.0-beta.0" + checksum: e37509156ca945dd9e4b82c66dd74f2d842ad917bd280cb5aa67960942300cd065eeac476d2514bdcdedec071277a358f6d517c31d9f9244d9bbc3619a8ecf8a + languageName: node + linkType: hard + "babel-preset-current-node-syntax@npm:^1.0.0": version: 1.0.1 resolution: "babel-preset-current-node-syntax@npm:1.0.1" @@ -18684,6 +20930,43 @@ __metadata: languageName: node linkType: hard +"babel-preset-fbjs@npm:^3.4.0": + version: 3.4.0 + resolution: "babel-preset-fbjs@npm:3.4.0" + dependencies: + "@babel/plugin-proposal-class-properties": ^7.0.0 + "@babel/plugin-proposal-object-rest-spread": ^7.0.0 + "@babel/plugin-syntax-class-properties": ^7.0.0 + "@babel/plugin-syntax-flow": ^7.0.0 + "@babel/plugin-syntax-jsx": ^7.0.0 + "@babel/plugin-syntax-object-rest-spread": ^7.0.0 + "@babel/plugin-transform-arrow-functions": ^7.0.0 + "@babel/plugin-transform-block-scoped-functions": ^7.0.0 + "@babel/plugin-transform-block-scoping": ^7.0.0 + "@babel/plugin-transform-classes": ^7.0.0 + "@babel/plugin-transform-computed-properties": ^7.0.0 + "@babel/plugin-transform-destructuring": ^7.0.0 + "@babel/plugin-transform-flow-strip-types": ^7.0.0 + "@babel/plugin-transform-for-of": ^7.0.0 + "@babel/plugin-transform-function-name": ^7.0.0 + "@babel/plugin-transform-literals": ^7.0.0 + "@babel/plugin-transform-member-expression-literals": ^7.0.0 + "@babel/plugin-transform-modules-commonjs": ^7.0.0 + "@babel/plugin-transform-object-super": ^7.0.0 + "@babel/plugin-transform-parameters": ^7.0.0 + "@babel/plugin-transform-property-literals": ^7.0.0 + "@babel/plugin-transform-react-display-name": ^7.0.0 + "@babel/plugin-transform-react-jsx": ^7.0.0 + "@babel/plugin-transform-shorthand-properties": ^7.0.0 + "@babel/plugin-transform-spread": ^7.0.0 + "@babel/plugin-transform-template-literals": ^7.0.0 + babel-plugin-syntax-trailing-function-commas: ^7.0.0-beta.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: b3352cf690729125997f254bc31b9c4db347f8646f1571958ced1c45f0da89439e183e1c88e35397eb0361b9e1fbb1dd8142d3f4647814deb427e53c54f44d5f + languageName: node + linkType: hard + "babel-preset-jest@npm:^29.6.3": version: 29.6.3 resolution: "babel-preset-jest@npm:29.6.3" @@ -18696,6 +20979,23 @@ __metadata: languageName: node linkType: hard +"babel-runtime@npm:^6.11.6": + version: 6.26.0 + resolution: "babel-runtime@npm:6.26.0" + dependencies: + core-js: ^2.4.0 + regenerator-runtime: ^0.11.0 + checksum: 8aeade94665e67a73c1ccc10f6fd42ba0c689b980032b70929de7a6d9a12eb87ef51902733f8fefede35afea7a5c3ef7e916a64d503446c1eedc9e3284bd3d50 + languageName: node + linkType: hard + +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -19193,6 +21493,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.23.1": + version: 4.23.3 + resolution: "browserslist@npm:4.23.3" + dependencies: + caniuse-lite: ^1.0.30001646 + electron-to-chromium: ^1.5.4 + node-releases: ^2.0.18 + update-browserslist-db: ^1.1.0 + bin: + browserslist: cli.js + checksum: 7906064f9970aeb941310b2fcb8b4ace4a1b50aa657c986677c6f1553a8cabcc94ee9c5922f715baffbedaa0e6cf0831b6fed7b059dde6873a4bfadcbe069c7e + languageName: node + linkType: hard + "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -19341,7 +21655,7 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0, busboy@npm:^1.0.0": +"busboy@npm:1.6.0, busboy@npm:^1.0.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" dependencies: @@ -19426,6 +21740,13 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d + languageName: node + linkType: hard + "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -19448,6 +21769,21 @@ __metadata: languageName: node linkType: hard +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: ^1.0.2 + get-stream: ^5.1.0 + http-cache-semantics: ^4.0.0 + keyv: ^4.0.0 + lowercase-keys: ^2.0.0 + normalize-url: ^6.0.1 + responselike: ^2.0.0 + checksum: 0de9df773fd4e7dd9bd118959878f8f2163867e2e1ab3575ffbecbe6e75e80513dd0c68ba30005e5e5a7b377cc6162bbc00ab1db019bb4e9cb3c2f3f7a6f1ee4 + languageName: node + linkType: hard + "calcom-monorepo@workspace:.": version: 0.0.0-use.local resolution: "calcom-monorepo@workspace:." @@ -19547,6 +21883,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^3.0.0": + version: 3.0.0 + resolution: "camel-case@npm:3.0.0" + dependencies: + no-case: ^2.2.0 + upper-case: ^1.1.1 + checksum: 4190ed6ab8acf4f3f6e1a78ad4d0f3f15ce717b6bfa1b5686d58e4bcd29960f6e312dd746b5fa259c6d452f1413caef25aee2e10c9b9a580ac83e516533a961a + languageName: node + linkType: hard + "camel-case@npm:^4.1.2": version: 4.1.2 resolution: "camel-case@npm:4.1.2" @@ -19575,6 +21921,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^3.0.0": + version: 3.0.0 + resolution: "camelcase@npm:3.0.0" + checksum: ae4fe1c17c8442a3a345a6b7d2393f028ab7a7601af0c352ad15d1ab97ca75112e19e29c942b2a214898e160194829b68923bce30e018d62149c6d84187f1673 + languageName: node + linkType: hard + "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -19631,6 +21984,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646": + version: 1.0.30001660 + resolution: "caniuse-lite@npm:1.0.30001660" + checksum: 8b2c5de2f5facd31980426afbba68238270984acfe8c1ae925b8b6480448eea2fae292f815674617e9170c730c8a238d7cc0db919f184dc0e3cd9bec18f5e5ad + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591": version: 1.0.30001597 resolution: "caniuse-lite@npm:1.0.30001597" @@ -19645,6 +22005,17 @@ __metadata: languageName: node linkType: hard +"capital-case@npm:^1.0.4": + version: 1.0.4 + resolution: "capital-case@npm:1.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case-first: ^2.0.2 + checksum: 41fa8fa87f6d24d0835a2b4a9341a3eaecb64ac29cd7c5391f35d6175a0fa98ab044e7f2602e1ec3afc886231462ed71b5b80c590b8b41af903ec2c15e5c5931 + languageName: node + linkType: hard + "cardinal@npm:^2.1.1": version: 2.1.1 resolution: "cardinal@npm:2.1.1" @@ -19671,6 +22042,13 @@ __metadata: languageName: node linkType: hard +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 + languageName: node + linkType: hard + "chai@npm:^5.1.1": version: 5.1.1 resolution: "chai@npm:5.1.1" @@ -19745,6 +22123,24 @@ __metadata: languageName: node linkType: hard +"change-case-all@npm:1.0.15": + version: 1.0.15 + resolution: "change-case-all@npm:1.0.15" + dependencies: + change-case: ^4.1.2 + is-lower-case: ^2.0.2 + is-upper-case: ^2.0.2 + lower-case: ^2.0.2 + lower-case-first: ^2.0.2 + sponge-case: ^1.0.1 + swap-case: ^2.0.2 + title-case: ^3.0.3 + upper-case: ^2.0.2 + upper-case-first: ^2.0.2 + checksum: e1dabdcd8447a3690f3faf15f92979dfbc113109b50916976e1d5e518e6cfdebee4f05f54d0ca24fb79a4bf835185b59ae25e967bb3dc10bd236a775b19ecc52 + languageName: node + linkType: hard + "change-case@npm:^2.3.0": version: 2.3.1 resolution: "change-case@npm:2.3.1" @@ -19769,6 +22165,52 @@ __metadata: languageName: node linkType: hard +"change-case@npm:^3.0.0": + version: 3.1.0 + resolution: "change-case@npm:3.1.0" + dependencies: + camel-case: ^3.0.0 + constant-case: ^2.0.0 + dot-case: ^2.1.0 + header-case: ^1.0.0 + is-lower-case: ^1.1.0 + is-upper-case: ^1.1.0 + lower-case: ^1.1.1 + lower-case-first: ^1.0.0 + no-case: ^2.3.2 + param-case: ^2.1.0 + pascal-case: ^2.0.0 + path-case: ^2.1.0 + sentence-case: ^2.1.0 + snake-case: ^2.1.0 + swap-case: ^1.1.0 + title-case: ^2.1.0 + upper-case: ^1.1.1 + upper-case-first: ^1.1.0 + checksum: d6f9f90a5f1d2a98294e06ea62f913fa0d7cfc289f188bf05662344da6128f5710b5c99ece83682c6a848db8d996b7348e09b2235dc3363afb6ae7142e7978e1 + languageName: node + linkType: hard + +"change-case@npm:^4.1.2": + version: 4.1.2 + resolution: "change-case@npm:4.1.2" + dependencies: + camel-case: ^4.1.2 + capital-case: ^1.0.4 + constant-case: ^3.0.4 + dot-case: ^3.0.4 + header-case: ^2.0.4 + no-case: ^3.0.4 + param-case: ^3.0.4 + pascal-case: ^3.1.2 + path-case: ^3.0.4 + sentence-case: ^3.0.4 + snake-case: ^3.0.4 + tslib: ^2.0.3 + checksum: e4bc4a093a1f7cce8b33896665cf9e456e3bc3cc0def2ad7691b1994cfca99b3188d0a513b16855b01a6bd20692fcde12a7d4d87a5615c4c515bbbf0e651f116 + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -19776,6 +22218,13 @@ __metadata: languageName: node linkType: hard +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d + languageName: node + linkType: hard + "character-entities-legacy@npm:^1.0.0": version: 1.1.4 resolution: "character-entities-legacy@npm:1.1.4" @@ -19783,6 +22232,13 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^1.0.0": version: 1.2.4 resolution: "character-entities@npm:1.2.4" @@ -19790,6 +22246,13 @@ __metadata: languageName: node linkType: hard +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: cf1643814023697f725e47328fcec17923b8f1799102a8a79c1514e894815651794a2bffd84bb1b3a4b124b050154e4529ed6e81f7c8068a734aecf07a6d3def + languageName: node + linkType: hard + "character-reference-invalid@npm:^1.0.0": version: 1.1.4 resolution: "character-reference-invalid@npm:1.1.4" @@ -19797,6 +22260,13 @@ __metadata: languageName: node linkType: hard +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 98d3b1a52ae510b7329e6ee7f6210df14f1e318c5415975d4c9e7ee0ef4c07875d47c6e74230c64551f12f556b4a8ccc24d9f3691a2aa197019e72a95e9297ee + languageName: node + linkType: hard + "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -19811,6 +22281,13 @@ __metadata: languageName: node linkType: hard +"chart.js@npm:^3.7.1": + version: 3.9.1 + resolution: "chart.js@npm:3.9.1" + checksum: 9ab0c0ac01215af0b3f020f2e313030fd6e347b48ed17d5484ee9c4e8ead45e78ae71bea16c397621c386b409ce0b14bf17f9f6c2492cd15b56c0f433efdfff6 + languageName: node + linkType: hard + "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -20205,13 +22682,24 @@ __metadata: languageName: node linkType: hard -"client-only@npm:0.0.1": +"client-only@npm:0.0.1, client-only@npm:^0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 languageName: node linkType: hard +"cliui@npm:^3.2.0": + version: 3.2.0 + resolution: "cliui@npm:3.2.0" + dependencies: + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + wrap-ansi: ^2.0.0 + checksum: c68d1dbc3e347bfe79ed19cc7f48007d5edd6cd8438342e32073e0b4e311e3c44e1f4f19221462bc6590de56c2df520e427533a9dde95dee25710bec322746ad + languageName: node + linkType: hard + "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -20256,6 +22744,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: ^1.0.0 + checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e + languageName: node + linkType: hard + "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -20284,6 +22781,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 + languageName: node + linkType: hard + "clsx@npm:^2.0.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" @@ -20334,6 +22838,15 @@ __metadata: languageName: node linkType: hard +"cobe@npm:^0.4.1": + version: 0.4.2 + resolution: "cobe@npm:0.4.2" + dependencies: + phenomenon: ^1.6.0 + checksum: 4c11dd8cf3c6614a2ff2f6eacca5283278c6db06c2e441011aa90f58c66d045e66ef98a5e4b9d0282d58ee22f5b87d965538aa4c6064ed97f436f3e4cd9ee3ed + languageName: node + linkType: hard + "code-block-writer@npm:^11.0.0": version: 11.0.0 resolution: "code-block-writer@npm:11.0.0" @@ -20352,6 +22865,13 @@ __metadata: languageName: node linkType: hard +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681 + languageName: node + linkType: hard + "coffeescript@npm:^1.10.0": version: 1.12.7 resolution: "coffeescript@npm:1.12.7" @@ -20487,6 +23007,13 @@ __metadata: languageName: node linkType: hard +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d + languageName: node + linkType: hard + "command-score@npm:0.1.2, command-score@npm:^0.1.2": version: 0.1.2 resolution: "command-score@npm:0.1.2" @@ -20594,6 +23121,13 @@ __metadata: languageName: node linkType: hard +"common-tags@npm:1.8.2": + version: 1.8.2 + resolution: "common-tags@npm:1.8.2" + checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff + languageName: node + linkType: hard + "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -20689,6 +23223,26 @@ __metadata: languageName: node linkType: hard +"concurrently@npm:^7.6.0": + version: 7.6.0 + resolution: "concurrently@npm:7.6.0" + dependencies: + chalk: ^4.1.0 + date-fns: ^2.29.1 + lodash: ^4.17.21 + rxjs: ^7.0.0 + shell-quote: ^1.7.3 + spawn-command: ^0.0.2-1 + supports-color: ^8.1.0 + tree-kill: ^1.2.2 + yargs: ^17.3.1 + bin: + conc: dist/bin/concurrently.js + concurrently: dist/bin/concurrently.js + checksum: f705c9a7960f1b16559ca64958043faeeef6385c0bf30a03d1375e15ab2d96dba4f8166f1bbbb1c85e8da35ca0ce3c353875d71dff2aa132b2357bb533b3332e + languageName: node + linkType: hard + "conf@npm:10.2.0": version: 10.2.0 resolution: "conf@npm:10.2.0" @@ -20773,6 +23327,27 @@ __metadata: languageName: node linkType: hard +"constant-case@npm:^2.0.0": + version: 2.0.0 + resolution: "constant-case@npm:2.0.0" + dependencies: + snake-case: ^2.1.0 + upper-case: ^1.1.1 + checksum: 893c793a425ebcd0744061c7f12650c655aae259b89d5654fb8eda42d22c3690716a4988ed03f2abe370b1ee7bfec44f8e4395e76e2f1458a8921982b15410ba + languageName: node + linkType: hard + +"constant-case@npm:^3.0.4": + version: 3.0.4 + resolution: "constant-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case: ^2.0.2 + checksum: 6c3346d51afc28d9fae922e966c68eb77a19d94858dba230dd92d7b918b37d36db50f0311e9ecf6847e43e934b1c01406a0936973376ab17ec2c471fbcfb2cf3 + languageName: node + linkType: hard + "constants-browserify@npm:^1.0.0": version: 1.0.0 resolution: "constants-browserify@npm:1.0.0" @@ -20953,6 +23528,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^2.4.0": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 44fa9934a85f8c78d61e0c8b7b22436330471ffe59ec5076fe7f324d6e8cf7f824b14b1c81ca73608b13bdb0fef035bd820989bf059767ad6fa13123bb8bd016 + languageName: node + linkType: hard + "core-js@npm:^3": version: 3.21.1 resolution: "core-js@npm:3.21.1" @@ -20984,7 +23566,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:9.0.0": +"cosmiconfig@npm:9.0.0, cosmiconfig@npm:^9.0.0": version: 9.0.0 resolution: "cosmiconfig@npm:9.0.0" dependencies: @@ -21027,7 +23609,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": +"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -21153,6 +23735,18 @@ __metadata: languageName: node linkType: hard +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: ^7.0.1 + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79 + languageName: node + linkType: hard + "cross-fetch@npm:3.1.5, cross-fetch@npm:^3.1.5": version: 3.1.5 resolution: "cross-fetch@npm:3.1.5" @@ -21171,7 +23765,16 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-inspect@npm:1.0.1": + version: 1.0.1 + resolution: "cross-inspect@npm:1.0.1" + dependencies: + tslib: ^2.4.0 + checksum: 7c1e02e0a9670b62416a3ea1df7ae880fdad3aa0a857de8932c4e5f8acd71298c7e3db9da8e9da603f5692cd1879938f5e72e34a9f5d1345987bef656d117fc1 + languageName: node + linkType: hard + +"cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -21645,6 +24248,13 @@ __metadata: languageName: node linkType: hard +"dataloader@npm:^2.2.2": + version: 2.2.2 + resolution: "dataloader@npm:2.2.2" + checksum: 4dabd247089c29f194e94d5434d504f99156c5c214a03463c20f3f17f40398d7e179edee69a27c16e315519ac8739042a810090087ae26449a0e685156a02c65 + languageName: node + linkType: hard + "date-fns@npm:^2.28.0": version: 2.29.3 resolution: "date-fns@npm:2.29.3" @@ -21652,6 +24262,15 @@ __metadata: languageName: node linkType: hard +"date-fns@npm:^2.29.1": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": ^7.21.0 + checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4 + languageName: node + linkType: hard + "date-fns@npm:^3.6.0": version: 3.6.0 resolution: "date-fns@npm:3.6.0" @@ -21659,6 +24278,43 @@ __metadata: languageName: node linkType: hard +"datocms-listen@npm:^0.1.9": + version: 0.1.15 + resolution: "datocms-listen@npm:0.1.15" + dependencies: + "@0no-co/graphql.web": ^1.0.1 + checksum: 243fec6f8c07d35f8d8d206ded45c4b8cfeb22907bba23d2180af6284903e4af1146c89e08ad0f68977193d42530323c53d0d906f7cf9f1ba92490ed11386e8c + languageName: node + linkType: hard + +"datocms-structured-text-generic-html-renderer@npm:^2.0.1, datocms-structured-text-generic-html-renderer@npm:^2.1.12": + version: 2.1.12 + resolution: "datocms-structured-text-generic-html-renderer@npm:2.1.12" + dependencies: + datocms-structured-text-utils: ^2.1.12 + checksum: ef9e29b15903ce69be42faa4f4a4364bb7ba0c6565008cb2f557e8865c0806edb938a27f9bee7aa682f7af84fe89489b688b9713ea48501c139d204fea1f18c0 + languageName: node + linkType: hard + +"datocms-structured-text-to-plain-text@npm:^2.0.4": + version: 2.1.12 + resolution: "datocms-structured-text-to-plain-text@npm:2.1.12" + dependencies: + datocms-structured-text-generic-html-renderer: ^2.1.12 + datocms-structured-text-utils: ^2.1.12 + checksum: 8d436ca14379650d66257b5a2f36523e1ebaee41584caf021c863155404a292dbde7408c6cb0e0185638c2eb7508087239f862e78e8647b806ececd4e24683fd + languageName: node + linkType: hard + +"datocms-structured-text-utils@npm:^2.0.1, datocms-structured-text-utils@npm:^2.0.4, datocms-structured-text-utils@npm:^2.1.12": + version: 2.1.12 + resolution: "datocms-structured-text-utils@npm:2.1.12" + dependencies: + array-flatten: ^3.0.0 + checksum: 68d5be9cb711fb630866cca2c0e44b333b390d9672b2ea680d5870c26e8ccadcc6bd77d02a95ccbb913c160466a3046cbd934c41712f9d064f98a73009e0b97a + languageName: node + linkType: hard + "dayjs@npm:1.11.4": version: 1.11.4 resolution: "dayjs@npm:1.11.4" @@ -21696,6 +24352,13 @@ __metadata: languageName: node linkType: hard +"debounce@npm:^1.2.0, debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -21726,7 +24389,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.6": +"debug@npm:^4.0.0, debug@npm:^4.3.6": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -21748,7 +24411,7 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": +"decamelize@npm:^1.1.0, decamelize@npm:^1.1.1, decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa @@ -21769,6 +24432,15 @@ __metadata: languageName: node linkType: hard +"decode-named-character-reference@npm:^1.0.0": + version: 1.0.2 + resolution: "decode-named-character-reference@npm:1.0.2" + dependencies: + character-entities: ^2.0.0 + checksum: f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -21894,7 +24566,7 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.1": +"defer-to-connect@npm:^2.0.0, defer-to-connect@npm:^2.0.1": version: 2.0.1 resolution: "defer-to-connect@npm:2.0.1" checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b @@ -22045,6 +24717,13 @@ __metadata: languageName: node linkType: hard +"dependency-graph@npm:^0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 477204beaa9be69e642bc31ffe7a8c383d0cf48fa27acbc91c5df01431ab913e65c154213d2ef83d034c98d77280743ec85e5da018a97a18dd43d3c0b78b28cd + languageName: node + linkType: hard + "deprecation@npm:^2.0.0": version: 2.3.1 resolution: "deprecation@npm:2.3.1" @@ -22052,7 +24731,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.2, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0, dequal@npm:^2.0.2, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -22147,6 +24826,15 @@ __metadata: languageName: node linkType: hard +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: ^2.0.0 + checksum: d2ff650bac0bb6ef08c48f3ba98640bb5fec5cce81e9957eb620408d1bab1204d382a45b785c6b3314dc867bb0684936b84c6867820da6db97cbb5d3c15dd185 + languageName: node + linkType: hard + "dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -22185,6 +24873,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.0.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -22394,6 +25089,15 @@ __metadata: languageName: node linkType: hard +"dot-case@npm:^2.1.0": + version: 2.1.1 + resolution: "dot-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + checksum: 5c9d937245ff810a7ae788602e40c62e38cb515146ddf9b11c7f60cb02aae84859588761f1e8769d9e713609fae3c78dc99c8da9e0ee8e4d8b5c09a2fdf70328 + languageName: node + linkType: hard + "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -22478,6 +25182,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^10.0.0": + version: 10.0.0 + resolution: "dotenv@npm:10.0.0" + checksum: f412c5fe8c24fbe313d302d2500e247ba8a1946492db405a4de4d30dd0eb186a88a43f13c958c5a7de303938949c4231c56994f97d05c4bc1f22478d631b4005 + languageName: node + linkType: hard + "dotenv@npm:^16.0.0": version: 16.0.1 resolution: "dotenv@npm:16.0.1" @@ -22507,6 +25218,13 @@ __metadata: languageName: node linkType: hard +"dset@npm:^3.1.2": + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: 9a7677e9ffd3c13ad850f7cf367aa94b39984006510e84c3c09b7b88bba0a5b3b7196d85a99d0c4cae4e47d67bdeca43dc1834a41d80f31bcdc86dd26121ecec + languageName: node + linkType: hard + "dub@npm:^0.35.0": version: 0.35.0 resolution: "dub@npm:0.35.0" @@ -22619,6 +25337,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.4": + version: 1.5.25 + resolution: "electron-to-chromium@npm:1.5.25" + checksum: 3aef974d586815e9b1fd3221be3e2e124d59a9b992dbd59dbce618ac165feddebda9238be8f93b504f3cc067821e94810bf8a877be8a23a125d6c8f401aeb27e + languageName: node + linkType: hard + "elliptic@npm:^6.5.3": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -22706,7 +25431,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:0.1.13, encoding@npm:^0.1.13": +"encoding@npm:0.1.13, encoding@npm:^0.1.11, encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -22784,6 +25509,16 @@ __metadata: languageName: node linkType: hard +"enquirer@npm:^2.4.1": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: ^4.1.1 + strip-ansi: ^6.0.1 + checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 + languageName: node + linkType: hard + "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -22858,7 +25593,7 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.3.1": +"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" dependencies: @@ -23540,6 +26275,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.1.2": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + "escape-goat@npm:^4.0.0": version: 4.0.0 resolution: "escape-goat@npm:4.0.0" @@ -24238,6 +26980,13 @@ __metadata: languageName: node linkType: hard +"estree-util-is-identifier-name@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-is-identifier-name@npm:3.0.0" + checksum: ea3909f0188ea164af0aadeca87c087e3e5da78d76da5ae9c7954ff1340ea3e4679c4653bbf4299ffb70caa9b322218cc1128db2541f3d2976eb9704f9857787 + languageName: node + linkType: hard + "estree-walker@npm:^1.0.1": version: 1.0.1 resolution: "estree-walker@npm:1.0.1" @@ -24524,6 +27273,13 @@ __metadata: languageName: node linkType: hard +"extract-files@npm:^11.0.0": + version: 11.0.0 + resolution: "extract-files@npm:11.0.0" + checksum: 39ebd92772e9a1e30d1e3112fb7db85d353c8243640635668b615ac1d605ceb79fbb13d17829dd308993ef37bb189ad99817f79ab164ae95c9bb3df9f440bd16 + languageName: node + linkType: hard + "extract-zip@npm:^1.6.6": version: 1.7.0 resolution: "extract-zip@npm:1.7.0" @@ -24552,6 +27308,13 @@ __metadata: languageName: node linkType: hard +"fast-decode-uri-component@npm:^1.0.1": + version: 1.0.1 + resolution: "fast-decode-uri-component@npm:1.0.1" + checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -24670,6 +27433,15 @@ __metadata: languageName: node linkType: hard +"fast-querystring@npm:^1.1.1": + version: 1.1.2 + resolution: "fast-querystring@npm:1.1.2" + dependencies: + fast-decode-uri-component: ^1.0.1 + checksum: 7149f82ee9ac39a9c08c7ffe435b9f6deade76ae5e3675fe1835720513e8c4bc541e666b4b7b1c0c07e08f369dcf4828d00f2bee39889a90a168e1439cf27b0b + languageName: node + linkType: hard + "fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" @@ -24698,6 +27470,15 @@ __metadata: languageName: node linkType: hard +"fast-url-parser@npm:^1.1.3": + version: 1.1.3 + resolution: "fast-url-parser@npm:1.1.3" + dependencies: + punycode: ^1.3.2 + checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c + languageName: node + linkType: hard + "fast-xml-parser@npm:4.2.5": version: 4.2.5 resolution: "fast-xml-parser@npm:4.2.5" @@ -24739,6 +27520,13 @@ __metadata: languageName: node linkType: hard +"fathom-client@npm:^3.5.0": + version: 3.7.2 + resolution: "fathom-client@npm:3.7.2" + checksum: 2f6859cc8e2995334b67b1e9efe3e1084e0b55cfd8832f4fd9badf37abf80d2213a5892313ec57a3dfccd7b7a62bb3949617dc8310dd7af2af0781e534398cbc + languageName: node + linkType: hard + "fault@npm:^1.0.0": version: 1.0.4 resolution: "fault@npm:1.0.4" @@ -24780,6 +27568,28 @@ __metadata: languageName: node linkType: hard +"fbjs-css-vars@npm:^1.0.0": + version: 1.0.2 + resolution: "fbjs-css-vars@npm:1.0.2" + checksum: 72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 + languageName: node + linkType: hard + +"fbjs@npm:^3.0.0": + version: 3.0.5 + resolution: "fbjs@npm:3.0.5" + dependencies: + cross-fetch: ^3.1.5 + fbjs-css-vars: ^1.0.0 + loose-envify: ^1.0.0 + object-assign: ^4.1.0 + promise: ^7.1.1 + setimmediate: ^1.0.5 + ua-parser-js: ^1.0.35 + checksum: e609b5b64686bc96495a5c67728ed9b2710b9b3d695c5759c5f5e47c9483d1c323543ac777a86459e3694efc5712c6ce7212e944feb19752867d699568bb0e54 + languageName: node + linkType: hard + "fd-slicer@npm:~1.1.0": version: 1.1.0 resolution: "fd-slicer@npm:1.1.0" @@ -25029,6 +27839,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^1.0.0": + version: 1.1.2 + resolution: "find-up@npm:1.1.2" + dependencies: + path-exists: ^2.0.0 + pinkie-promise: ^2.0.0 + checksum: a2cb9f4c9f06ee3a1e92ed71d5aed41ac8ae30aefa568132f6c556fac7678a5035126153b59eaec68da78ac409eef02503b2b059706bdbf232668d7245e3240a + languageName: node + linkType: hard + "find-up@npm:^2.1.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -25265,6 +28085,13 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:^1.7.1": + version: 1.9.0 + resolution: "form-data-encoder@npm:1.9.0" + checksum: a73f617976f91b594dbd777ec5147abdb0c52d707475130f8cefc8ae9102ccf51be154b929f7c18323729c2763ac25b16055f5034bc188834e9febeb0d971d7f + languageName: node + linkType: hard + "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -25344,6 +28171,16 @@ __metadata: languageName: node linkType: hard +"formdata-node@npm:^4.3.1": + version: 4.4.1 + resolution: "formdata-node@npm:4.4.1" + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + checksum: d91d4f667cfed74827fc281594102c0dabddd03c9f8b426fc97123eedbf73f5060ee43205d89284d6854e2fc5827e030cd352ef68b93beda8decc2d72128c576 + languageName: node + linkType: hard + "formdata-polyfill@npm:^4.0.10": version: 4.0.10 resolution: "formdata-polyfill@npm:4.0.10" @@ -25493,7 +28330,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^8.1.0": +"fs-extra@npm:^8.0.1, fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" dependencies: @@ -25750,6 +28587,13 @@ __metadata: languageName: node linkType: hard +"get-caller-file@npm:^1.0.1": + version: 1.0.3 + resolution: "get-caller-file@npm:1.0.3" + checksum: 2b90a7f848896abcebcdc0acc627a435bcf05b9cd280599bc980ebfcdc222416c3df12c24c4845f69adc4346728e8966f70b758f9369f3534182791dfbc25c05 + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -25853,6 +28697,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: ^3.0.0 + checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 + languageName: node + linkType: hard + "get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -25988,6 +28841,13 @@ __metadata: languageName: node linkType: hard +"github-buttons@npm:^2.22.0": + version: 2.29.0 + resolution: "github-buttons@npm:2.29.0" + checksum: c43ece51179209cdac4ecc26b5652ef5774e65b28dbde433971677301c6ed9349c0ad1c38ec5034b8ca12a5bf2feeb2235475ba5b228fcb8a434321aa2659bfb + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -26085,7 +28945,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.2.3": +"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.2.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -26189,7 +29049,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.1.0": +"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -26243,6 +29103,19 @@ __metadata: languageName: node linkType: hard +"globby@npm:^13.1.3": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: ^3.0.1 + fast-glob: ^3.3.0 + ignore: ^5.2.4 + merge2: ^1.4.1 + slash: ^4.0.0 + checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e + languageName: node + linkType: hard + "globrex@npm:^0.1.2": version: 0.1.2 resolution: "globrex@npm:0.1.2" @@ -26367,6 +29240,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d + languageName: node + linkType: hard + "got@npm:^12.1.0": version: 12.6.1 resolution: "got@npm:12.6.1" @@ -26431,6 +29323,89 @@ __metadata: languageName: node linkType: hard +"graphql-codegen@npm:^0.4.0": + version: 0.4.0 + resolution: "graphql-codegen@npm:0.4.0" + dependencies: + babel-runtime: ^6.11.6 + change-case: ^3.0.0 + graphql: ^0.7.0 + inflected: ^1.1.7 + mkdirp: ^0.5.1 + node-fetch: ^1.5.3 + yargs: ^5.0.0 + bin: + graphql-codegen: ./lib/cli.js + checksum: 584ad3382de9ee3927cfd4fcc340abb2f8d4bbdacacebe9e56e34edf255c87eb1e191f2d7c4f3d1d5bb0ebd829b852e50efe91e967683a8b181dcd3b26ae6b6c + languageName: node + linkType: hard + +"graphql-config@npm:^5.0.2": + version: 5.1.2 + resolution: "graphql-config@npm:5.1.2" + dependencies: + "@graphql-tools/graphql-file-loader": ^8.0.0 + "@graphql-tools/json-file-loader": ^8.0.0 + "@graphql-tools/load": ^8.0.0 + "@graphql-tools/merge": ^9.0.0 + "@graphql-tools/url-loader": ^8.0.0 + "@graphql-tools/utils": ^10.0.0 + cosmiconfig: ^9.0.0 + jiti: ^1.18.2 + minimatch: ^9.0.5 + string-env-interpolation: ^1.0.1 + tslib: ^2.4.0 + peerDependencies: + cosmiconfig-toml-loader: ^1.0.0 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + cosmiconfig-toml-loader: + optional: true + checksum: 48e17fff9e31a5037a42e9edb79251fe91e49338125ac3141ec80886832e0669112f547b2b67db9412d31fcc4cdac4548180f45550dc2ed2bc94c54bcb01053a + languageName: node + linkType: hard + +"graphql-request@npm:^6.0.0, graphql-request@npm:^6.1.0": + version: 6.1.0 + resolution: "graphql-request@npm:6.1.0" + dependencies: + "@graphql-typed-document-node/core": ^3.2.0 + cross-fetch: ^3.1.5 + peerDependencies: + graphql: 14 - 16 + checksum: 6d62630a0169574442320651c1f7626c0c602025c3c46b19e09417c9579bb209306ee63de9793a03be2e1701bb7f13971f8545d99bc6573e340f823af0ad35b2 + languageName: node + linkType: hard + +"graphql-tag@npm:^2.11.0": + version: 2.12.6 + resolution: "graphql-tag@npm:2.12.6" + dependencies: + tslib: ^2.1.0 + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + checksum: b15162a3d62f17b9b79302445b9ee330e041582f1c7faca74b9dec5daa74272c906ec1c34e1c50592bb6215e5c3eba80a309103f6ba9e4c1cddc350c46f010df + languageName: node + linkType: hard + +"graphql-ws@npm:^5.14.0": + version: 5.16.0 + resolution: "graphql-ws@npm:5.16.0" + peerDependencies: + graphql: ">=0.11 <=16" + checksum: e3e077ec187a92be3fd5dfae49e23af11a82711d3537064384f6861c2b5ceb339f60dc1871d0026b47ff05e4ed3c941404812a8086347e454688e0e6ef0e69f3 + languageName: node + linkType: hard + +"graphql@npm:^0.7.0": + version: 0.7.2 + resolution: "graphql@npm:0.7.2" + dependencies: + iterall: 1.0.2 + checksum: 9b815b851d4fbc861609ce37e88e0be881d25fa2d5dc54f661379e600d103d4f051cee15a09799c4efa2d3590a61f64fc2e1d67332c7fdf8df2871c27b1c3f40 + languageName: node + linkType: hard + "graphql@npm:^16.3.0": version: 16.5.0 resolution: "graphql@npm:16.5.0" @@ -26438,6 +29413,13 @@ __metadata: languageName: node linkType: hard +"graphql@npm:^16.8.0": + version: 16.9.0 + resolution: "graphql@npm:16.9.0" + checksum: 8cb3d54100e9227310383ce7f791ca48d12f15ed9f2021f23f8735f1121aafe4e5e611a853081dd935ce221724ea1ae4638faef5d2921fb1ad7c26b5f46611e9 + languageName: node + linkType: hard + "gray-matter@npm:^4.0.3": version: 4.0.3 resolution: "gray-matter@npm:4.0.3" @@ -26450,6 +29432,13 @@ __metadata: languageName: node linkType: hard +"gsap@npm:^3.11.0": + version: 3.12.5 + resolution: "gsap@npm:3.12.5" + checksum: 60b99dc4482992ba86013963ee9a97a5ec62d480495dd85764788913245aa08cfd202c1df4bbc7592e43d5faa885127bec75f77266f2964fe3d3b559ab63f852 + languageName: node + linkType: hard + "gtoken@npm:^5.0.4": version: 5.3.2 resolution: "gtoken@npm:5.3.2" @@ -26720,6 +29709,21 @@ __metadata: languageName: node linkType: hard +"hast-util-from-parse5@npm:^7.0.0": + version: 7.1.2 + resolution: "hast-util-from-parse5@npm:7.1.2" + dependencies: + "@types/hast": ^2.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 + checksum: 7b4ed5b508b1352127c6719f7b0c0880190cf9859fe54ccaf7c9228ecf623d36cef3097910b3874d2fe1aac6bf4cf45d3cc2303daac3135a05e9ade6534ddddb + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^2.0.0": version: 2.2.5 resolution: "hast-util-parse-selector@npm:2.2.5" @@ -26727,6 +29731,115 @@ __metadata: languageName: node linkType: hard +"hast-util-parse-selector@npm:^3.0.0": + version: 3.1.1 + resolution: "hast-util-parse-selector@npm:3.1.1" + dependencies: + "@types/hast": ^2.0.0 + checksum: 511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 + languageName: node + linkType: hard + +"hast-util-raw@npm:^7.0.0": + version: 7.2.3 + resolution: "hast-util-raw@npm:7.2.3" + 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 + checksum: 21857eea3ffb8fd92d2d9be7793b56d0b2c40db03c4cfa14828855ae41d7c584917aa83efb7157220b2e41e25e95f81f24679ac342c35145e5f1c1d39015f81f + languageName: node + linkType: hard + +"hast-util-sanitize@npm:^4.0.0": + version: 4.1.0 + resolution: "hast-util-sanitize@npm:4.1.0" + dependencies: + "@types/hast": ^2.0.0 + checksum: 4f1786d6556bae6485a657a3e77e7e71b573fd20e4e2d70678e0f445eb8fe3dc6c4441cda6d18b89a79b53e2c03b6232eb6c470ecd478737050724ea09398603 + languageName: node + linkType: hard + +"hast-util-to-html@npm:^8.0.0": + version: 8.0.4 + resolution: "hast-util-to-html@npm:8.0.4" + 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 + checksum: 8f2ae071df2ced5afb4f19f76af8fd3a2f837dc47bcc1c0e0c1578d29dafcd28738f9617505d13c4a2adf13d70e043143e2ad8f130d5554ab4fc11bfa8f74094 + languageName: node + linkType: hard + +"hast-util-to-jsx-runtime@npm:^2.0.0": + version: 2.3.0 + resolution: "hast-util-to-jsx-runtime@npm:2.3.0" + dependencies: + "@types/estree": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + hast-util-whitespace: ^3.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + style-to-object: ^1.0.0 + unist-util-position: ^5.0.0 + vfile-message: ^4.0.0 + checksum: 599a97c6ec61c1430776813d7fb42e6f96032bf4a04dfcbb8eceef3bc8d1845ecf242387a4426b9d3f52320dbbfa26450643b81124b3d6a0b9bbb0fff4d0ba83 + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^7.0.0": + version: 7.1.0 + resolution: "hast-util-to-parse5@npm:7.1.0" + dependencies: + "@types/hast": ^2.0.0 + comma-separated-tokens: ^2.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: 3a7f2175a3db599bbae7e49ba73d3e5e688e5efca7590ff50130ba108ad649f728402815d47db49146f6b94c14c934bf119915da9f6964e38802c122bcc8af6b + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "hast-util-whitespace@npm:2.0.1" + checksum: 431be6b2f35472f951615540d7a53f69f39461e5e080c0190268bdeb2be9ab9b1dddfd1f467dd26c1de7e7952df67beb1307b6ee940baf78b24a71b5e0663868 + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 41d93ccce218ba935dc3c12acdf586193c35069489c8c8f50c2aa824c00dec94a3c78b03d1db40fa75381942a189161922e4b7bca700b3a2cc779634c351a1e4 + languageName: node + linkType: hard + "hastscript@npm:^6.0.0": version: 6.0.0 resolution: "hastscript@npm:6.0.0" @@ -26740,6 +29853,19 @@ __metadata: languageName: node linkType: hard +"hastscript@npm:^7.0.0": + version: 7.2.0 + resolution: "hastscript@npm:7.2.0" + 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 + checksum: 928a21576ff7b9a8c945e7940bcbf2d27f770edb4279d4d04b33dc90753e26ca35c1172d626f54afebd377b2afa32331e399feb3eb0f7b91a399dca5927078ae + languageName: node + linkType: hard + "he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -26749,6 +29875,26 @@ __metadata: languageName: node linkType: hard +"header-case@npm:^1.0.0": + version: 1.0.1 + resolution: "header-case@npm:1.0.1" + dependencies: + no-case: ^2.2.0 + upper-case: ^1.1.3 + checksum: fe1cc9a555ec9aabc2de80f4dd961a81c534fc23951694fef34297e59b0dd60f26647148731bf0dd3fdb3a1c688089d3cd147d7038db850e25be7c0a5fabb022 + languageName: node + linkType: hard + +"header-case@npm:^2.0.4": + version: 2.0.4 + resolution: "header-case@npm:2.0.4" + dependencies: + capital-case: ^1.0.4 + tslib: ^2.0.3 + checksum: 571c83eeb25e8130d172218712f807c0b96d62b020981400bccc1503a7cf14b09b8b10498a962d2739eccf231d950e3848ba7d420b58a6acd2f9283439546cd9 + languageName: node + linkType: hard + "headers-polyfill@npm:^3.0.4": version: 3.0.7 resolution: "headers-polyfill@npm:3.0.7" @@ -26886,6 +30032,20 @@ __metadata: languageName: node linkType: hard +"html-url-attributes@npm:^3.0.0": + version: 3.0.0 + resolution: "html-url-attributes@npm:3.0.0" + checksum: 9f499d33e6ddff6c2d2766fd73d2f22f3c370b4e485a92b0b2938303665b306dc7f36b2724c9466764e8f702351c01f342f5ec933be41a31c1fa40b72087b91d + languageName: node + linkType: hard + +"html-void-elements@npm:^2.0.0": + version: 2.0.1 + resolution: "html-void-elements@npm:2.0.1" + checksum: 06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.5.0": version: 5.5.4 resolution: "html-webpack-plugin@npm:5.5.4" @@ -26925,7 +30085,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -27061,6 +30221,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e + languageName: node + linkType: hard + "http2-wrapper@npm:^2.1.10": version: 2.2.1 resolution: "http2-wrapper@npm:2.2.1" @@ -27328,6 +30498,28 @@ __metadata: languageName: node linkType: hard +"iframe-resizer-react@npm:^1.1.0": + version: 1.1.1 + resolution: "iframe-resizer-react@npm:1.1.1" + dependencies: + "@babel/plugin-proposal-private-property-in-object": ^7.21.11 + iframe-resizer: ^4.4.4 + warning: ^4.0.3 + peerDependencies: + prop-types: ^15.7.2 + react: ^16.13.1 || ^18.0.0 + react-dom: ^16.13.1 || ^18.0.0 + checksum: fd3db2dfd3e1455e2f8150ed0cc4068b8970389eca478d13e2ca6408e1fe0a85425f7b2cb004e5a8eee0e7d4ed304774cad4b1b40d9a7467c2db3ed4851c4572 + languageName: node + linkType: hard + +"iframe-resizer@npm:^4.4.4": + version: 4.4.5 + resolution: "iframe-resizer@npm:4.4.5" + checksum: fa2493daba2df7578866aeb5fceabcf2129da9327abd7d26b4f16e9e7109eddcb97a8ba7ea6e94b043705f13bcbe6ae307e67cc48c24f7bd9d948d491a150163 + languageName: node + linkType: hard + "ignore-walk@npm:^5.0.1": version: 5.0.1 resolution: "ignore-walk@npm:5.0.1" @@ -27371,6 +30563,13 @@ __metadata: languageName: node linkType: hard +"immer@npm:^10.0.3": + version: 10.1.1 + resolution: "immer@npm:10.1.1" + checksum: 07c67970b7d22aded73607193d84861bf786f07d47f7d7c98bb10016c7a88f6654ad78ae1e220b3c623695b133aabbf24f5eb8d9e8060cff11e89ccd81c9c10b + languageName: node + linkType: hard + "immutable@npm:^3.8.2, immutable@npm:^3.x.x": version: 3.8.2 resolution: "immutable@npm:3.8.2" @@ -27378,6 +30577,13 @@ __metadata: languageName: node linkType: hard +"immutable@npm:~3.7.6": + version: 3.7.6 + resolution: "immutable@npm:3.7.6" + checksum: 8cccfb22d3ecf14fe0c474612e96d6bb5d117493e7639fe6642fb81e78c9ac4b698dd8a322c105001a709ad873ffc90e30bad7db5d9a3ef0b54a6e1db0258e8e + languageName: node + linkType: hard + "import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -27388,6 +30594,13 @@ __metadata: languageName: node linkType: hard +"import-from@npm:4.0.0": + version: 4.0.0 + resolution: "import-from@npm:4.0.0" + checksum: 1fa29c05b048da18914e91d9a529e5d9b91774bebbfab10e53f59bcc1667917672b971cf102fee857f142e5e433ce69fa1f0a596e1c7d82f9947a5ec352694b9 + languageName: node + linkType: hard + "import-in-the-middle@npm:1.4.2": version: 1.4.2 resolution: "import-in-the-middle@npm:1.4.2" @@ -27471,6 +30684,13 @@ __metadata: languageName: node linkType: hard +"inflected@npm:^1.1.7": + version: 1.1.7 + resolution: "inflected@npm:1.1.7" + checksum: eac857f10871586006d629dc72bab05058f1967c10fae9d7391d627534566a8e5be0a1f690d2590102d890e4ef5647b73b7827380dc7bcf50faac4154f0ab084 + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -27566,6 +30786,13 @@ __metadata: languageName: node linkType: hard +"inline-style-parser@npm:0.2.4": + version: 0.2.4 + resolution: "inline-style-parser@npm:0.2.4" + checksum: 5df20a21dd8d67104faaae29774bb50dc9690c75bc5c45dac107559670a5530104ead72c4cf54f390026e617e7014c65b3d68fb0bb573a37c4d1f94e9c36e1ca + languageName: node + linkType: hard + "inline-style-prefixer@npm:^7.0.0": version: 7.0.0 resolution: "inline-style-prefixer@npm:7.0.0" @@ -27607,7 +30834,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.6": +"inquirer@npm:8.2.6, inquirer@npm:^8.0.0": version: 8.2.6 resolution: "inquirer@npm:8.2.6" dependencies: @@ -27767,6 +30994,13 @@ __metadata: languageName: node linkType: hard +"invert-kv@npm:^1.0.0": + version: 1.0.0 + resolution: "invert-kv@npm:1.0.0" + checksum: aebeee31dda3b3d25ffd242e9a050926e7fe5df642d60953ab183aca1a7d1ffb39922eb2618affb0e850cf2923116f0da1345367759d88d097df5da1f1e1590e + languageName: node + linkType: hard + "ioredis@npm:^5.3.2": version: 5.3.2 resolution: "ioredis@npm:5.3.2" @@ -27815,6 +31049,16 @@ __metadata: languageName: node linkType: hard +"is-absolute@npm:^1.0.0": + version: 1.0.0 + resolution: "is-absolute@npm:1.0.0" + dependencies: + is-relative: ^1.0.0 + is-windows: ^1.0.1 + checksum: 9d16b2605eda3f3ce755410f1d423e327ad3a898bcb86c9354cf63970ed3f91ba85e9828aa56f5d6a952b9fae43d0477770f78d37409ae8ecc31e59ebc279b27 + languageName: node + linkType: hard + "is-alphabetical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphabetical@npm:1.0.4" @@ -27822,6 +31066,13 @@ __metadata: languageName: node linkType: hard +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 56207db8d9de0850f0cd30f4966bf731eb82cedfe496cbc2e97e7c3bacaf66fc54a972d2d08c0d93bb679cb84976a05d24c5ad63de56fabbfc60aadae312edaa + languageName: node + linkType: hard + "is-alphanumerical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphanumerical@npm:1.0.4" @@ -27832,6 +31083,16 @@ __metadata: languageName: node linkType: hard +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" + dependencies: + is-alphabetical: ^2.0.0 + is-decimal: ^2.0.0 + checksum: 87acc068008d4c9c4e9f5bd5e251041d42e7a50995c77b1499cf6ed248f971aadeddb11f239cabf09f7975ee58cac7a48ffc170b7890076d8d227b24a68663c9 + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -27914,6 +31175,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:^2.0.0": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 + languageName: node + linkType: hard + "is-buffer@npm:~1.1.6": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" @@ -28036,6 +31304,13 @@ __metadata: languageName: node linkType: hard +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 97132de7acdce77caa7b797632970a2ecd649a88e715db0e4dbc00ab0708b5e7574ba5903962c860cd4894a14fd12b100c0c4ac8aed445cf6f55c6cf747a4158 + languageName: node + linkType: hard + "is-deflate@npm:^1.0.0": version: 1.0.0 resolution: "is-deflate@npm:1.0.0" @@ -28094,6 +31369,15 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: ^1.0.0 + checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -28131,7 +31415,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:4.0.3, is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -28154,6 +31438,13 @@ __metadata: languageName: node linkType: hard +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 66a2ea85994c622858f063f23eda506db29d92b52580709eb6f4c19550552d4dcf3fb81952e52f7cf972097237959e00adc7bb8c9400cd12886e15bf06145321 + languageName: node + linkType: hard + "is-in-ci@npm:^0.1.0": version: 0.1.0 resolution: "is-in-ci@npm:0.1.0" @@ -28214,6 +31505,15 @@ __metadata: languageName: node linkType: hard +"is-lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "is-lower-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: ba57dd1201e15fd9b590654736afccf1b3b68e919f40c23ef13b00ebcc639b1d9c2f81fe86415bff3e8eccffec459786c9ac9dc8f3a19cfa4484206c411c1d7d + languageName: node + linkType: hard + "is-map@npm:^2.0.2": version: 2.0.2 resolution: "is-map@npm:2.0.2" @@ -28345,7 +31645,7 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^4.1.0": +"is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce @@ -28408,6 +31708,15 @@ __metadata: languageName: node linkType: hard +"is-relative@npm:^1.0.0": + version: 1.0.0 + resolution: "is-relative@npm:1.0.0" + dependencies: + is-unc-path: ^1.0.0 + checksum: 3271a0df109302ef5e14a29dcd5d23d9788e15ade91a40b942b035827ffbb59f7ce9ff82d036ea798541a52913cbf9d2d0b66456340887b51f3542d57b5a4c05 + languageName: node + linkType: hard + "is-retry-allowed@npm:^1.1.0": version: 1.2.0 resolution: "is-retry-allowed@npm:1.2.0" @@ -28463,6 +31772,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^1.0.1": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -28536,6 +31852,15 @@ __metadata: languageName: node linkType: hard +"is-unc-path@npm:^1.0.0": + version: 1.0.0 + resolution: "is-unc-path@npm:1.0.0" + dependencies: + unc-path-regex: ^0.1.2 + checksum: e8abfde203f7409f5b03a5f1f8636e3a41e78b983702ef49d9343eb608cdfe691429398e8815157519b987b739bcfbc73ae7cf4c8582b0ab66add5171088eab6 + languageName: node + linkType: hard + "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -28566,6 +31891,22 @@ __metadata: languageName: node linkType: hard +"is-upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "is-upper-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: cf4fd43c00c2e72cd5cff911923070b89f0933b464941bd782e2315385f80b5a5acd772db3b796542e5e3cfed735f4dffd88c54d62db1ebfc5c3daa7b1af2bc6 + languageName: node + linkType: hard + +"is-utf8@npm:^0.2.0": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -28606,7 +31947,7 @@ __metadata: languageName: node linkType: hard -"is-windows@npm:1.0.2, is-windows@npm:^1.0.0": +"is-windows@npm:1.0.2, is-windows@npm:^1.0.0, is-windows@npm:^1.0.1": version: 1.0.2 resolution: "is-windows@npm:1.0.2" checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 @@ -28694,6 +32035,15 @@ __metadata: languageName: node linkType: hard +"isomorphic-ws@npm:^5.0.0": + version: 5.0.0 + resolution: "isomorphic-ws@npm:5.0.0" + peerDependencies: + ws: "*" + checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 + languageName: node + linkType: hard + "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -28789,6 +32139,13 @@ __metadata: languageName: node linkType: hard +"iterall@npm:1.0.2": + version: 1.0.2 + resolution: "iterall@npm:1.0.2" + checksum: f87cbb8e22e3681f4d7ba634e4ce7bd419a78b47ff7b01f57f90cf761d187cb845fcac0d4d7e4c7dfcbfb80467c8ea42a9f3691bb3aa909e3e3707a25735ed70 + languageName: node + linkType: hard + "iterare@npm:1.2.1": version: 1.2.1 resolution: "iterare@npm:1.2.1" @@ -29414,6 +32771,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^1.17.1": + version: 1.21.6 + resolution: "jiti@npm:1.21.6" + bin: + jiti: bin/jiti.js + checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 + languageName: node + linkType: hard + "jiti@npm:^1.18.2": version: 1.20.0 resolution: "jiti@npm:1.20.0" @@ -29439,6 +32805,19 @@ __metadata: languageName: node linkType: hard +"joi@npm:^17.11.0": + version: 17.13.3 + resolution: "joi@npm:17.13.3" + dependencies: + "@hapi/hoek": ^9.3.0 + "@hapi/topo": ^5.1.0 + "@sideway/address": ^4.1.5 + "@sideway/formula": ^3.0.1 + "@sideway/pinpoint": ^2.0.0 + checksum: 66ed454fee3d8e8da1ce21657fd2c7d565d98f3e539d2c5c028767e5f38cbd6297ce54df8312d1d094e62eb38f9452ebb43da4ce87321df66cf5e3f128cbc400 + languageName: node + linkType: hard + "jose@npm:5.2.1": version: 5.2.1 resolution: "jose@npm:5.2.1" @@ -29467,6 +32846,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^5.0.0": + version: 5.8.0 + resolution: "jose@npm:5.8.0" + checksum: bb9cd97ac6ccb8148a8e23d6a7f61e5756a3373a7d65dd783051d8af409c3534bdc2a2c30ecd1820988ea943aba5755b2a45b86955c5765d71691bb0ddd45d61 + languageName: node + linkType: hard + "jpeg-js@npm:0.4.2": version: 0.4.2 resolution: "jpeg-js@npm:0.4.2" @@ -29523,7 +32909,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -29769,6 +33155,16 @@ __metadata: languageName: node linkType: hard +"json-to-pretty-yaml@npm:^1.2.2": + version: 1.2.2 + resolution: "json-to-pretty-yaml@npm:1.2.2" + dependencies: + remedial: ^1.0.7 + remove-trailing-spaces: ^1.0.6 + checksum: 4b78480f426e176e5fdac073e05877683bb026f1175deb52d0941b992f9c91a58a812c020f00aa67ba1fc7cadb220539a264146f222e48a48c8bb2a0931cac9b + languageName: node + linkType: hard + "json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -29824,6 +33220,19 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^5.0.0": + version: 5.0.0 + resolution: "jsonfile@npm:5.0.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^0.1.2 + dependenciesMeta: + graceful-fs: + optional: true + checksum: e0ecff572dba34153a66e3a3bc5c6cb01a2c1d2cf4a2c19b6728dcfcab39d94be9cca4a0fc86a17ff2c815f2aeb43768ac75545780dbea4009433fdc32aa14d1 + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -29997,6 +33406,13 @@ __metadata: languageName: node linkType: hard +"keen-slider@npm:^6.8.0": + version: 6.8.6 + resolution: "keen-slider@npm:6.8.6" + checksum: f87e65d72e3b2e73cbd52b1908c1458b253ec5a2a2d3e1e34bd1a831172d18568649188cf3e4ad679c7988568929195ae91d4b7a1c0bd3d6da592a453be3723a + languageName: node + linkType: hard + "keypress@npm:~0.2.1": version: 0.2.1 resolution: "keypress@npm:0.2.1" @@ -30004,7 +33420,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.0.0, keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -30020,7 +33436,7 @@ __metadata: languageName: node linkType: hard -"kleur@npm:4.1.5, kleur@npm:^4.1.5": +"kleur@npm:4.1.5, kleur@npm:^4.0.3, kleur@npm:^4.1.5": version: 4.1.5 resolution: "kleur@npm:4.1.5" checksum: 1dc476e32741acf0b1b5b0627ffd0d722e342c1b0da14de3e8ae97821327ca08f9fb944542fb3c126d90ac5f27f9d804edbe7c585bf7d12ef495d115e0f22c12 @@ -30123,6 +33539,15 @@ __metadata: languageName: node linkType: hard +"lcid@npm:^1.0.0": + version: 1.0.0 + resolution: "lcid@npm:1.0.0" + dependencies: + invert-kv: ^1.0.0 + checksum: e8c7a4db07663068c5c44b650938a2bc41aa992037eebb69376214320f202c1250e70b50c32f939e28345fd30c2d35b8e8cd9a19d5932c398246a864ce54843d + languageName: node + linkType: hard + "level-blobs@npm:^0.1.7": version: 0.1.7 resolution: "level-blobs@npm:0.1.7" @@ -30425,6 +33850,19 @@ __metadata: languageName: node linkType: hard +"load-json-file@npm:^1.0.0": + version: 1.1.0 + resolution: "load-json-file@npm:1.1.0" + dependencies: + graceful-fs: ^4.1.2 + parse-json: ^2.2.0 + pify: ^2.0.0 + pinkie-promise: ^2.0.0 + strip-bom: ^2.0.0 + checksum: 0e4e4f380d897e13aa236246a917527ea5a14e4fc34d49e01ce4e7e2a1e08e2740ee463a03fb021c04f594f29a178f4adb994087549d7c1c5315fcd29bf9934b + languageName: node + linkType: hard + "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -30552,6 +33990,13 @@ __metadata: languageName: node linkType: hard +"lodash.assign@npm:^4.1.0, lodash.assign@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.assign@npm:4.2.0" + checksum: 75bbc6733c9f577c448031b4051f990f068802708891f94be9d4c2faffd6a9ec67a2c49671dafc908a068d35687765464853282842b4560b662e6c903d11cc90 + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -30713,6 +34158,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c + languageName: node + linkType: hard + "lodash.startcase@npm:^4.4.0": version: 4.4.0 resolution: "lodash.startcase@npm:4.4.0" @@ -30748,14 +34200,14 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.15": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 languageName: node linkType: hard -"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -30822,6 +34274,13 @@ __metadata: languageName: node linkType: hard +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -30870,6 +34329,15 @@ __metadata: languageName: node linkType: hard +"lower-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case-first@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 33e3da1098ddda219ce125d4ab7a78a944972c0ee8872e95b6ccc35df8ad405284ab233b0ba4d72315ad1a06fe2f0d418ee4cba9ec1ef1c386dea78899fc8958 + languageName: node + linkType: hard + "lower-case@npm:^1.1.0, lower-case@npm:^1.1.1, lower-case@npm:^1.1.2": version: 1.1.4 resolution: "lower-case@npm:1.1.4" @@ -30886,6 +34354,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 + languageName: node + linkType: hard + "lowercase-keys@npm:^3.0.0": version: 3.0.0 resolution: "lowercase-keys@npm:3.0.0" @@ -30993,6 +34468,15 @@ __metadata: languageName: node linkType: hard +"lucide-react@npm:^0.171.0": + version: 0.171.0 + resolution: "lucide-react@npm:0.171.0" + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + checksum: 768ffe368c52a518ee339203d86ff4479989ab4d79c0716f721900c4bb7392ef6ff7a14807f6a685abd74d27f4c1778170bff77a0ab4c3e06c17944b557d8300 + languageName: node + linkType: hard + "lucide-static@npm:^0.424.0": version: 0.424.0 resolution: "lucide-static@npm:0.424.0" @@ -31194,6 +34678,13 @@ __metadata: languageName: node linkType: hard +"map-cache@npm:^0.2.0": + version: 0.2.2 + resolution: "map-cache@npm:0.2.2" + checksum: 3067cea54285c43848bb4539f978a15dedc63c03022abeec6ef05c8cb6829f920f13b94bcaf04142fc6a088318e564c4785704072910d120d55dbc2e0c421969 + languageName: node + linkType: hard + "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -31299,6 +34790,191 @@ __metadata: languageName: node linkType: hard +"mdast-util-definitions@npm:^5.0.0": + version: 5.1.2 + resolution: "mdast-util-definitions@npm:5.1.2" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + unist-util-visit: ^4.0.0 + checksum: 2544daccab744ea1ede76045c2577ae4f1cc1b9eb1ea51ab273fe1dca8db5a8d6f50f87759c0ce6484975914b144b7f40316f805cb9c86223a78db8de0b77bae + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^1.0.0": + version: 1.3.1 + resolution: "mdast-util-from-markdown@npm:1.3.1" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + decode-named-character-reference: ^1.0.0 + mdast-util-to-string: ^3.1.0 + micromark: ^3.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-decode-string: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + unist-util-stringify-position: ^3.0.0 + uvu: ^0.5.0 + checksum: c2fac225167e248d394332a4ea39596e04cbde07d8cdb3889e91e48972c4c3462a02b39fda3855345d90231eb17a90ac6e082fb4f012a77c1d0ddfb9c7446940 + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-from-markdown@npm:2.0.1" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + mdast-util-to-string: ^4.0.0 + micromark: ^4.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 2e50be71272a1503558c599cd5766cf2743935a021f82e32bc2ae5da44f6c7dcabb9da3a6eee76ede0ec8ad2b122d1192f4fe89890aac90c76463f049f8a835d + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdx-expression@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 6af56b06bde3ab971129db9855dcf0d31806c70b3b052d7a90a5499a366b57ffd0c2efca67d281c448c557298ba7e3e61bd07133733b735440840dd339b28e19 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^3.0.0": + version: 3.1.3 + resolution: "mdast-util-mdx-jsx@npm:3.1.3" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-stringify-position: ^4.0.0 + vfile-message: ^4.0.0 + checksum: 638644420090163fc08d01150e10550a21e914b85dd3a37178d3b949173c5aee2d7fee536f864ac25800e0cebde8357a5808427ffb7e9975a669e4382ae479ab + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdxjs-esm@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 1f9dad04d31d59005332e9157ea9510dc1d03092aadbc607a10475c7eec1c158b475aa0601a3a4f74e13097ca735deb8c2d9d37928ddef25d3029fd7c9e14dc3 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "mdast-util-phrasing@npm:3.0.1" + dependencies: + "@types/mdast": ^3.0.0 + unist-util-is: ^5.0.0 + checksum: c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": ^4.0.0 + unist-util-is: ^6.0.0 + checksum: 3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^11.0.0": + version: 11.3.0 + resolution: "mdast-util-to-hast@npm:11.3.0" + 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 + checksum: a968d034613aa5cfb44b9c03d8e61a08bb563bfde3a233fb3d83a28857357e2beef56b6767bab2867d3c3796dc5dd796af4d03fb83e3133aeb7f4187b5cc9327 + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^13.0.0": + version: 13.2.0 + resolution: "mdast-util-to-hast@npm:13.2.0" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@ungap/structured-clone": ^1.0.0 + devlop: ^1.0.0 + micromark-util-sanitize-uri: ^2.0.0 + trim-lines: ^3.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + checksum: 7e5231ff3d4e35e1421908437577fd5098141f64918ff5cc8a0f7a8a76c5407f7a3ee88d75f7a1f7afb763989c9f357475fa0ba8296c00aaff1e940098fe86a6 + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^1.0.0": + version: 1.5.0 + resolution: "mdast-util-to-markdown@npm:1.5.0" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^3.0.0 + mdast-util-to-string: ^3.0.0 + micromark-util-decode-string: ^1.0.0 + unist-util-visit: ^4.0.0 + zwitch: ^2.0.0 + checksum: 64338eb33e49bb0aea417591fd986f72fdd39205052563bb7ce9eb9ecc160824509bfacd740086a05af355c6d5c36353aafe95cab9e6927d674478757cee6259 + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.0 + resolution: "mdast-util-to-markdown@npm:2.1.0" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^4.0.0 + mdast-util-to-string: ^4.0.0 + micromark-util-decode-string: ^2.0.0 + unist-util-visit: ^5.0.0 + zwitch: ^2.0.0 + checksum: 3a2cf3957e23b34e2e092e6e76ae72ee0b8745955bd811baba6814cf3a3d916c3fd52264b4b58f3bb3d512a428f84a1e998b6fc7e28434e388a9ae8fb6a9c173 + languageName: node + linkType: hard + "mdast-util-to-string@npm:^1.0.0": version: 1.1.0 resolution: "mdast-util-to-string@npm:1.1.0" @@ -31306,6 +34982,24 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": + version: 3.2.0 + resolution: "mdast-util-to-string@npm:3.2.0" + dependencies: + "@types/mdast": ^3.0.0 + checksum: dc40b544d54339878ae2c9f2b3198c029e1e07291d2126bd00ca28272ee6616d0d2194eb1c9828a7c34d412a79a7e73b26512a734698d891c710a1e73db1e848 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": ^4.0.0 + checksum: 35489fb5710d58cbc2d6c8b6547df161a3f81e0f28f320dfb3548a9393555daf07c310c0c497708e67ed4dfea4a06e5655799e7d631ca91420c288b4525d6c29 + languageName: node + linkType: hard + "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -31313,7 +35007,7 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.1": +"mdurl@npm:^1.0.0, mdurl@npm:^1.0.1": version: 1.0.1 resolution: "mdurl@npm:1.0.1" checksum: 71731ecba943926bfbf9f9b51e28b5945f9411c4eda80894221b47cc105afa43ba2da820732b436f0798fd3edbbffcd1fc1415843c41a87fea08a41cc1e3d02b @@ -31447,6 +35141,18 @@ __metadata: languageName: node linkType: hard +"meros@npm:^1.2.1": + version: 1.3.0 + resolution: "meros@npm:1.3.0" + peerDependencies: + "@types/node": ">=13" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: ea86c83fe9357d3eb2f5bad20909e12642c7bc8c10340d9bd0968b48f69ec453de14f7e5032d138ad04cb10d79b8c9fb3c9601bb515e8fbdf9bec4eed62994ad + languageName: node + linkType: hard + "methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -31467,6 +35173,478 @@ __metadata: languageName: node linkType: hard +"micromark-core-commonmark@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-core-commonmark@npm:1.1.0" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-factory-destination: ^1.0.0 + micromark-factory-label: ^1.0.0 + micromark-factory-space: ^1.0.0 + micromark-factory-title: ^1.0.0 + micromark-factory-whitespace: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-chunked: ^1.0.0 + micromark-util-classify-character: ^1.0.0 + micromark-util-html-tag-name: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-resolve-all: ^1.0.0 + micromark-util-subtokenize: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.1 + uvu: ^0.5.0 + checksum: c6dfedc95889cc73411cb222fc2330b9eda6d849c09c9fd9eb3cd3398af246167e9d3cdb0ae3ce9ae59dd34a14624c8330e380255d41279ad7350cf6c6be6c5b + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-core-commonmark@npm:2.0.1" + dependencies: + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-factory-destination: ^2.0.0 + micromark-factory-label: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-factory-title: ^2.0.0 + micromark-factory-whitespace: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-html-tag-name: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 6a9891cc883a531e090dc8dab6669945f3df9448e84216a8f2a91f9258281e6abea5ae3940fde2bd77a57dc3e0d67f2add6762aed63a378f37b09eaf7e7426c4 + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-destination@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-destination@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: d36e65ed1c072ff4148b016783148ba7c68a078991154625723e24bda3945160268fb91079fb28618e1613c2b6e70390a8ddc544c45410288aa27b413593071a + languageName: node + linkType: hard + +"micromark-factory-label@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-label@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-label@npm:2.0.0" + dependencies: + devlop: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: c021dbd0ed367610d35f2bae21209bc804d1a6d1286ffce458fd6a717f4d7fe581a7cba7d5c2d7a63757c44eb927c80d6a571d6ea7969fae1b48ab6461d109c4 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-space@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 4ffdcdc2f759887bbb356500cb460b3915ecddcb5d85c3618d7df68ad05d13ed02b1153ee1845677b7d8126df8f388288b84fcf0d943bd9c92bcc71cd7222e37 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-title@npm:1.1.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-title@npm:2.0.0" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 39e1ac23af3554e6e652e56065579bc7faf21ade7b8704b29c175871b4152b7109b790bb3cae0f7e088381139c6bac9553b8400772c3d322e4fa635f813a3578 + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-whitespace@npm:1.1.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-factory-whitespace@npm:2.0.0" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 9587c2546d1a58b4d5472b42adf05463f6212d0449455285662d63cd8eaed89c6b159ac82713fcee5f9dd88628c24307d9533cccd8971a2f3f4d48702f8f850a + languageName: node + linkType: hard + +"micromark-util-character@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 089e79162a19b4a28731736246579ab7e9482ac93cd681c2bfca9983dcff659212ef158a66a5957e9d4b1dba957d1b87b565d85418a5b009f0294f1f07f2aaac + languageName: node + linkType: hard + +"micromark-util-character@npm:^2.0.0": + version: 2.1.0 + resolution: "micromark-util-character@npm:2.1.0" + dependencies: + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 36ee910f84077cf16626fa618cfe46ac25956b3242e3166b8e8e98c5a8c524af7e5bf3d70822264b1fd2d297a36104a7eb7e3462c19c28353eaca7b0d8717594 + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-chunked@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-chunked@npm:2.0.0" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 324f95cccdae061332a8241936eaba6ef0782a1e355bac5c607ad2564fd3744929be7dc81651315a2921535747a33243e6a5606bcb64b7a56d49b6d74ea1a3d4 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-classify-character@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-classify-character@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 086e52904deffebb793fb1c08c94aabb8901f76958142dfc3a6282890ebaa983b285e69bd602b9d507f1b758ed38e75a994d2ad9fbbefa7de2584f67a16af405 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-combine-extensions@npm:1.1.0" + dependencies: + micromark-util-chunked: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-combine-extensions@npm:2.0.0" + dependencies: + micromark-util-chunked: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 107c47700343f365b4ed81551e18bc3458b573c500e56ac052b2490bd548adc475216e41d2271633a8867fac66fc22ba3e0a2d74a31ed79b9870ca947eb4e3ba + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: 4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 9512507722efd2033a9f08715eeef787fbfe27e23edf55db21423d46d82ab46f76c89b4f960be3f5e50a2d388d89658afc0647989cf256d051e9ea01277a1adb + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-string@npm:1.1.0" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-symbol: ^1.0.0 + checksum: f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-decode-string@npm:2.0.0" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: a75daf32a4a6b549e9f19b4d833ebfeb09a32a9a1f9ce50f35dec6b6a3e4f9f121f49024ba7f9c91c55ebe792f7c7a332fc9604795181b6a612637df0df5b959 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-encode@npm:1.1.0" + checksum: 4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-encode@npm:2.0.0" + checksum: 853a3f33fce72aaf4ffa60b7f2b6fcfca40b270b3466e1b96561b02185d2bd8c01dd7948bc31a24ac014f4cc854e545ca9a8e9cf7ea46262f9d24c9e88551c66 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-html-tag-name@npm:1.2.0" + checksum: ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-html-tag-name@npm:2.0.0" + checksum: d786d4486f93eb0ac5b628779809ca97c5dc60f3c9fc03eb565809831db181cf8cb7f05f9ac76852f3eb35461af0f89fa407b46f3a03f4f97a96754d8dc540d8 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-normalize-identifier@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: 8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-normalize-identifier@npm:2.0.0" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: b36da2d3fd102053dadd953ce5c558328df12a63a8ac0e5aad13d4dda8e43b6a5d4a661baafe0a1cd8a260bead4b4a8e6e0e74193dd651e8484225bd4f4e68aa + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-resolve-all@npm:1.1.0" + dependencies: + micromark-util-types: ^1.0.0 + checksum: 1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-resolve-all@npm:2.0.0" + dependencies: + micromark-util-types: ^2.0.0 + checksum: 31fe703b85572cb3f598ebe32750e59516925c7ff1f66cfe6afaebe0771a395a9eaa770787f2523d3c46082ea80e6c14f83643303740b3d650af7c96ebd30ccc + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-sanitize-uri@npm:1.2.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-encode: ^1.0.0 + micromark-util-symbol: ^1.0.0 + checksum: 6663f365c4fe3961d622a580f4a61e34867450697f6806f027f21cf63c92989494895fcebe2345d52e249fe58a35be56e223a9776d084c9287818b40c779acc1 + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-sanitize-uri@npm:2.0.0" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: ea4c28bbffcf2430e9aff2d18554296789a8b0a1f54ac24020d1dde76624a7f93e8f2a83e88cd5a846b6d2c4287b71b1142d1b89fa7f1b0363a9b33711a141fe + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-subtokenize@npm:1.1.0" + dependencies: + micromark-util-chunked: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: 4a9d780c4d62910e196ea4fd886dc4079d8e424e5d625c0820016da0ed399a281daff39c50f9288045cc4bcd90ab47647e5396aba500f0853105d70dc8b1fc45 + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-subtokenize@npm:2.0.1" + dependencies: + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 5d338883ad8889c63f9b262b9cae0c02a42088201981d820ae7af7aa6d38fab6585b89fd4cf2206a46a7c4002e41ee6c70e1a3e0ceb3ad8b7adcffaf166b1511 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 02414a753b79f67ff3276b517eeac87913aea6c028f3e668a19ea0fc09d98aea9f93d6222a76ca783d20299af9e4b8e7c797fe516b766185dcc6e93290f11f88 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-symbol@npm:2.0.0" + checksum: fa4a05bff575d9fbf0ad96a1013003e3bb6087ed6b34b609a141b6c0d2137b57df594aca409a95f4c5fda199f227b56a7d8b1f82cea0768df161d8a3a3660764 + languageName: node + linkType: hard + +"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: b0ef2b4b9589f15aec2666690477a6a185536927ceb7aa55a0f46475852e012d75a1ab945187e5c7841969a842892164b15d58ff8316b8e0d6cc920cabd5ede7 + languageName: node + linkType: hard + +"micromark-util-types@npm:^2.0.0": + version: 2.0.0 + resolution: "micromark-util-types@npm:2.0.0" + checksum: 819fef3ab5770c37893d2a60381fb2694396c8d22803b6e103c830c3a1bc1490363c2b0470bb2acaaddad776dfbc2fc1fcfde39cb63c4f54d95121611672e3d0 + languageName: node + linkType: hard + +"micromark@npm:^3.0.0": + version: 3.2.0 + resolution: "micromark@npm:3.2.0" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + micromark-core-commonmark: ^1.0.1 + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-chunked: ^1.0.0 + micromark-util-combine-extensions: ^1.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-encode: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-resolve-all: ^1.0.0 + micromark-util-sanitize-uri: ^1.0.0 + micromark-util-subtokenize: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.1 + uvu: ^0.5.0 + checksum: 56c15851ad3eb8301aede65603473443e50c92a54849cac1dadd57e4ec33ab03a0a77f3df03de47133e6e8f695dae83b759b514586193269e98c0bf319ecd5e4 + languageName: node + linkType: hard + +"micromark@npm:^4.0.0": + version: 4.0.0 + resolution: "micromark@npm:4.0.0" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b84ab5ab1a0b28c063c52e9c2c9d7d44b954507235c10c9492d66e0b38f7de24bf298f914a1fbdf109f2a57a88cf0412de217c84cfac5fd60e3e42a74dbac085 + languageName: node + linkType: hard + "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -31551,6 +35729,13 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 + languageName: node + linkType: hard + "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -31640,6 +35825,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: ^2.0.1 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 + languageName: node + linkType: hard + "minimist-options@npm:4.1.0, minimist-options@npm:^4.0.2": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -31651,7 +35845,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.3": +"minimist@npm:^1.1.0, minimist@npm:^1.2.3, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -31979,7 +36173,7 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.2.0": +"mri@npm:^1.1.0, mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 @@ -32638,6 +36832,64 @@ __metadata: languageName: node linkType: hard +"next@npm:^14.1.3": + version: 14.2.12 + resolution: "next@npm:14.2.12" + dependencies: + "@next/env": 14.2.12 + "@next/swc-darwin-arm64": 14.2.12 + "@next/swc-darwin-x64": 14.2.12 + "@next/swc-linux-arm64-gnu": 14.2.12 + "@next/swc-linux-arm64-musl": 14.2.12 + "@next/swc-linux-x64-gnu": 14.2.12 + "@next/swc-linux-x64-musl": 14.2.12 + "@next/swc-win32-arm64-msvc": 14.2.12 + "@next/swc-win32-ia32-msvc": 14.2.12 + "@next/swc-win32-x64-msvc": 14.2.12 + "@swc/helpers": 0.5.5 + busboy: 1.6.0 + caniuse-lite: ^1.0.30001579 + graceful-fs: ^4.2.11 + postcss: 8.4.31 + styled-jsx: 5.1.1 + peerDependencies: + "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@opentelemetry/api": + optional: true + "@playwright/test": + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: 59845b824e36a97ca8aeaed81fc035643eaa85a3851fc04c277030fa197ecf4ad00a41136db4a41ae4f608b7ae907200ce8b03310050b9128f5aea452b818224 + languageName: node + linkType: hard + "nice-try@npm:^1.0.4": version: 1.0.5 resolution: "nice-try@npm:1.0.5" @@ -32645,6 +36897,15 @@ __metadata: languageName: node linkType: hard +"no-case@npm:^2.2.0, no-case@npm:^2.3.2": + version: 2.3.2 + resolution: "no-case@npm:2.3.2" + dependencies: + lower-case: ^1.1.1 + checksum: 856487731936fef44377ca74fdc5076464aba2e0734b56a4aa2b2a23d5b154806b591b9b2465faa59bb982e2b5c9391e3685400957fb4eeb38f480525adcf3dd + languageName: node + linkType: hard + "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -32772,6 +37033,16 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^1.5.3": + version: 1.7.3 + resolution: "node-fetch@npm:1.7.3" + dependencies: + encoding: ^0.1.11 + is-stream: ^1.0.1 + checksum: 3bb0528c05d541316ebe52770d71ee25a6dce334df4231fd55df41a644143e07f068637488c18a5b0c43f05041dbd3346752f9e19b50df50569a802484544d5b + languageName: node + linkType: hard + "node-forge@npm:1.3.1, node-forge@npm:^1.0.0": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -32918,6 +37189,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 + languageName: node + linkType: hard + "node-releases@npm:^2.0.6": version: 2.0.6 resolution: "node-releases@npm:2.0.6" @@ -33013,6 +37291,15 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:^2.1.1": + version: 2.1.1 + resolution: "normalize-path@npm:2.1.1" + dependencies: + remove-trailing-separator: ^1.0.1 + checksum: 7e9cbdcf7f5b8da7aa191fbfe33daf290cdcd8c038f422faf1b8a83c972bf7a6d94c5be34c4326cb00fb63bc0fd97d9fbcfaf2e5d6142332c2cd36d2e1b86cea + languageName: node + linkType: hard + "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -33027,6 +37314,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 + languageName: node + linkType: hard + "normalize-url@npm:^8.0.0": version: 8.0.1 resolution: "normalize-url@npm:8.0.1" @@ -33144,6 +37438,13 @@ __metadata: languageName: node linkType: hard +"nullthrows@npm:^1.1.1": + version: 1.1.1 + resolution: "nullthrows@npm:1.1.1" + checksum: 10806b92121253eb1b08ecf707d92480f5331ba8ae5b23fa3eb0548ad24196eb797ed47606153006568a5733ea9e528a3579f21421f7828e09e7756f4bdd386f + languageName: node + linkType: hard + "number-allocator@npm:^1.0.9": version: 1.0.14 resolution: "number-allocator@npm:1.0.14" @@ -33259,6 +37560,13 @@ __metadata: languageName: node linkType: hard +"object-path@npm:^0.11.8": + version: 0.11.8 + resolution: "object-path@npm:0.11.8" + checksum: 684ccf0fb6b82f067dc81e2763481606692b8485bec03eb2a64e086a44dbea122b2b9ef44423a08e09041348fe4b4b67bd59985598f1652f67df95f0618f5968 + languageName: node + linkType: hard + "object-treeify@npm:^1.1.33": version: 1.1.33 resolution: "object-treeify@npm:1.1.33" @@ -33782,6 +38090,15 @@ __metadata: languageName: node linkType: hard +"os-locale@npm:^1.4.0": + version: 1.4.0 + resolution: "os-locale@npm:1.4.0" + dependencies: + lcid: ^1.0.0 + checksum: 0161a1b6b5a8492f99f4b47fe465df9fc521c55ba5414fce6444c45e2500487b8ed5b40a47a98a2363fe83ff04ab033785300ed8df717255ec4c3b625e55b1fb + languageName: node + linkType: hard + "os-name@npm:5.1.0": version: 5.1.0 resolution: "os-name@npm:5.1.0" @@ -33824,6 +38141,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf + languageName: node + linkType: hard + "p-cancelable@npm:^3.0.0": version: 3.0.0 resolution: "p-cancelable@npm:3.0.0" @@ -33847,6 +38171,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + "p-limit@npm:^1.1.0": version: 1.3.0 resolution: "p-limit@npm:1.3.0" @@ -33865,15 +38198,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - "p-limit@npm:^4.0.0": version: 4.0.0 resolution: "p-limit@npm:4.0.0" @@ -34055,6 +38379,15 @@ __metadata: languageName: node linkType: hard +"param-case@npm:^2.1.0": + version: 2.1.1 + resolution: "param-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + checksum: 3a63dcb8d8dc7995a612de061afdc7bb6fe7bd0e6db994db8d4cae999ed879859fd24389090e1a0d93f4c9207ebf8c048c870f468a3f4767161753e03cb9ab58 + languageName: node + linkType: hard + "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -34132,6 +38465,33 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^4.0.0": + version: 4.0.1 + resolution: "parse-entities@npm:4.0.1" + dependencies: + "@types/unist": ^2.0.0 + character-entities: ^2.0.0 + character-entities-legacy: ^3.0.0 + character-reference-invalid: ^2.0.0 + decode-named-character-reference: ^1.0.0 + is-alphanumerical: ^2.0.0 + is-decimal: ^2.0.0 + is-hexadecimal: ^2.0.0 + checksum: 32a6ff5b9acb9d2c4d71537308521fd265e685b9215691df73feedd9edfe041bb6da9f89bd0c35c4a2bc7d58e3e76e399bb6078c2fd7d2a343ff1dd46edbf1bd + languageName: node + linkType: hard + +"parse-filepath@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-filepath@npm:1.0.2" + dependencies: + is-absolute: ^1.0.0 + map-cache: ^0.2.0 + path-root: ^0.1.1 + checksum: 6794c3f38d3921f0f7cc63fb1fb0c4d04cd463356ad389c8ce6726d3c50793b9005971f4138975a6d7025526058d5e65e9bfe634d0765e84c4e2571152665a69 + languageName: node + linkType: hard + "parse-headers@npm:^2.0.0": version: 2.0.5 resolution: "parse-headers@npm:2.0.5" @@ -34139,6 +38499,15 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^2.2.0": + version: 2.2.0 + resolution: "parse-json@npm:2.2.0" + dependencies: + error-ex: ^1.2.0 + checksum: dda78a63e57a47b713a038630868538f718a7ca0cd172a36887b0392ccf544ed0374902eb28f8bf3409e8b71d62b79d17062f8543afccf2745f9b0b2d2bb80ca + languageName: node + linkType: hard + "parse-json@npm:^4.0.0": version: 4.0.0 resolution: "parse-json@npm:4.0.0" @@ -34209,7 +38578,7 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.1": +"parse5@npm:^6.0.0, parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd @@ -34242,6 +38611,16 @@ __metadata: languageName: node linkType: hard +"pascal-case@npm:^2.0.0": + version: 2.0.1 + resolution: "pascal-case@npm:2.0.1" + dependencies: + camel-case: ^3.0.0 + upper-case-first: ^1.1.0 + checksum: 4c539bf556572812f64a02fc6b544f3d2b51db12aed484e5162ed7f8ac2b366775d15e536091c890d71d82bdf9153128321f21574721b3a984bd85df9e519a35 + languageName: node + linkType: hard + "pascal-case@npm:^3.1.2": version: 3.1.2 resolution: "pascal-case@npm:3.1.2" @@ -34313,6 +38692,34 @@ __metadata: languageName: node linkType: hard +"path-case@npm:^2.1.0": + version: 2.1.1 + resolution: "path-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + checksum: eb1da508c28378715cbe4ce054ee5f83a570c5010f041f4cfb439c811f7a78e36c46f26a8d59b2594c3882b53db06ef26195519c27f86523dc5d19c2e29f306d + languageName: node + linkType: hard + +"path-case@npm:^3.0.4": + version: 3.0.4 + resolution: "path-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: 61de0526222629f65038a66f63330dd22d5b54014ded6636283e1d15364da38b3cf29e4433aa3f9d8b0dba407ae2b059c23b0104a34ee789944b1bc1c5c7e06d + languageName: node + linkType: hard + +"path-exists@npm:^2.0.0": + version: 2.1.0 + resolution: "path-exists@npm:2.1.0" + dependencies: + pinkie-promise: ^2.0.0 + checksum: fdb734f1d00f225f7a0033ce6d73bff6a7f76ea08936abf0e5196fa6e54a645103538cd8aedcb90d6d8c3fa3705ded0c58a4da5948ae92aa8834892c1ab44a84 + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -34369,6 +38776,22 @@ __metadata: languageName: node linkType: hard +"path-root-regex@npm:^0.1.0": + version: 0.1.2 + resolution: "path-root-regex@npm:0.1.2" + checksum: dcd75d1f8e93faabe35a58e875b0f636839b3658ff2ad8c289463c40bc1a844debe0dab73c3398ef9dc8f6ec6c319720aff390cf4633763ddcf3cf4b1bbf7e8b + languageName: node + linkType: hard + +"path-root@npm:^0.1.1": + version: 0.1.1 + resolution: "path-root@npm:0.1.1" + dependencies: + path-root-regex: ^0.1.0 + checksum: ff88aebfc1c59ace510cc06703d67692a11530989920427625e52b66a303ca9b3d4059b0b7d0b2a73248d1ad29bcb342b8b786ec00592f3101d38a45fd3b2e08 + languageName: node + linkType: hard + "path-scurry@npm:^1.10.0, path-scurry@npm:^1.10.1, path-scurry@npm:^1.6.1": version: 1.10.1 resolution: "path-scurry@npm:1.10.1" @@ -34400,6 +38823,17 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^1.0.0": + version: 1.1.0 + resolution: "path-type@npm:1.1.0" + dependencies: + graceful-fs: ^4.1.2 + pify: ^2.0.0 + pinkie-promise: ^2.0.0 + checksum: 59a4b2c0e566baf4db3021a1ed4ec09a8b36fca960a490b54a6bcefdb9987dafe772852982b6011cd09579478a96e57960a01f75fa78a794192853c9d468fc79 + languageName: node + linkType: hard + "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -34610,6 +39044,13 @@ __metadata: languageName: node linkType: hard +"phenomenon@npm:^1.6.0": + version: 1.6.0 + resolution: "phenomenon@npm:1.6.0" + checksum: e05ca8223a9df42c5cee02c082103ef96a349424fec18a8478d2171060a63095e21bef394529263c64d8082aff43204a0fa1355211fd7ac2a338c2839fffbca3 + languageName: node + linkType: hard + "phin@npm:^2.9.1": version: 2.9.3 resolution: "phin@npm:2.9.3" @@ -34624,7 +39065,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.1.0": +"picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": version: 1.1.0 resolution: "picocolors@npm:1.1.0" checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd @@ -34670,7 +39111,7 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.3.0": +"pify@npm:^2.0.0, pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba @@ -34700,6 +39141,15 @@ __metadata: languageName: node linkType: hard +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" + dependencies: + pinkie: ^2.0.0 + checksum: b53a4a2e73bf56b6f421eef711e7bdcb693d6abb474d57c5c413b809f654ba5ee750c6a96dd7225052d4b96c4d053cdcb34b708a86fceed4663303abee52fcca + languageName: node + linkType: hard + "pinkie@npm:^1.0.0": version: 1.0.0 resolution: "pinkie@npm:1.0.0" @@ -34707,6 +39157,13 @@ __metadata: languageName: node linkType: hard +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: b12b10afea1177595aab036fc220785488f67b4b0fc49e7a27979472592e971614fa1c728e63ad3e7eb748b4ec3c3dbd780819331dad6f7d635c77c10537b9db + languageName: node + linkType: hard + "pirates@npm:^4.0.1, pirates@npm:^4.0.5": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -34786,6 +39243,15 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:^1.38.1": + version: 1.47.1 + resolution: "playwright-core@npm:1.47.1" + bin: + playwright-core: cli.js + checksum: f61cee27a04df439b1e0df48e43bcd4f71cc41adcac3c35ac2df538d27be52cd1da91220295abb089c702ef40311af0dce12e1a71959ec15933bcdc1e6091563 + languageName: node + linkType: hard + "playwright@npm:1.45.3": version: 1.45.3 resolution: "playwright@npm:1.45.3" @@ -35452,6 +39918,33 @@ __metadata: languageName: node linkType: hard +"prism-react-renderer@npm:^1.3.5": + version: 1.3.5 + resolution: "prism-react-renderer@npm:1.3.5" + peerDependencies: + react: ">=0.14.9" + checksum: c18806dcbc4c0b4fd6fd15bd06b4f7c0a6da98d93af235c3e970854994eb9b59e23315abb6cfc29e69da26d36709a47e25da85ab27fed81b6812f0a52caf6dfa + languageName: node + linkType: hard + +"prisma-field-encryption@npm:^1.4.0": + version: 1.5.2 + resolution: "prisma-field-encryption@npm:1.5.2" + dependencies: + "@47ng/cloak": ^1.1.0 + "@prisma/generator-helper": ^5.9.1 + debug: ^4.3.4 + immer: ^10.0.3 + object-path: ^0.11.8 + zod: ^3.22.4 + peerDependencies: + "@prisma/client": ">= 4.7" + bin: + prisma-field-encryption: dist/generator/main.js + checksum: 22c04c16af2a3f0f4cd1b6b31172a17b758619cd5e1fb6bed469147fa0d840fc072f59c8da836c64181796778959fd512d2054f5f5d985921b4c91e3c18d4453 + languageName: node + linkType: hard + "prisma-kysely@npm:^1.7.1": version: 1.8.0 resolution: "prisma-kysely@npm:1.8.0" @@ -35629,6 +40122,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^6.0.0": + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 6e55664e2f64083b715011e5bafaa1e694faf36986c235b0907e95d09259cc37c38382e3cc94a4c3f56366e05336443db12c8a0f0968a8c0a1b1416eebfc8f53 + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -35776,7 +40276,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.4.1": +"punycode@npm:^1.3.2, punycode@npm:^1.4.1": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 @@ -35831,6 +40331,22 @@ __metadata: languageName: node linkType: hard +"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5": + version: 1.3.5 + resolution: "pvtsutils@npm:1.3.5" + dependencies: + tslib: ^2.6.1 + checksum: e734516b3cb26086c18bd9c012fefe818928a5073178842ab7e62885a090f1dd7bda9c7bb8cd317167502cb8ec86c0b1b0ccd71dac7ab469382a4518157b0d12 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.3 + resolution: "pvutils@npm:1.1.3" + checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9 + languageName: node + linkType: hard + "q@npm:2.0.x": version: 2.0.3 resolution: "q@npm:2.0.3" @@ -36123,6 +40639,16 @@ __metadata: languageName: node linkType: hard +"react-chartjs-2@npm:^4.0.1": + version: 4.3.1 + resolution: "react-chartjs-2@npm:4.3.1" + peerDependencies: + chart.js: ^3.5.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 574d12cc43b9b4a0f1e04cc692982e16ef7083c03da2a8a9fc2180fe9bcadc793008f81d8f4eec5465925eff84c95d7c523cb74376858b363ae75a83bb3c2a5d + languageName: node + linkType: hard + "react-colorful@npm:^5.1.2": version: 5.6.1 resolution: "react-colorful@npm:5.6.1" @@ -36143,6 +40669,17 @@ __metadata: languageName: node linkType: hard +"react-confetti@npm:^6.0.1": + version: 6.1.0 + resolution: "react-confetti@npm:6.1.0" + dependencies: + tween-functions: ^1.2.0 + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 + checksum: 24b6975df144d2bf09d8e1c95ddc49e547775f911efaa8d96b49e522659d931539e9d9e48cc0db3a01f3a671be7e3824e6e728db85096f5527db5d1c69ebb153 + languageName: node + linkType: hard + "react-copy-to-clipboard@npm:5.0.4": version: 5.0.4 resolution: "react-copy-to-clipboard@npm:5.0.4" @@ -36176,6 +40713,23 @@ __metadata: languageName: node linkType: hard +"react-datocms@npm:^3.1.0": + version: 3.1.4 + resolution: "react-datocms@npm:3.1.4" + 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 + peerDependencies: + react: ">= 16.12.0" + checksum: 54aba12aef4937175c2011548a8a576c96c8d8a596e84d191826910624c1d596e76a49782689dc236388a10803b02e700ac820cb7500cca7fd147a81f6c544c3 + languageName: node + linkType: hard + "react-day-picker@npm:^8.10.1": version: 8.10.1 resolution: "react-day-picker@npm:8.10.1" @@ -36198,6 +40752,18 @@ __metadata: languageName: node linkType: hard +"react-device-detect@npm:^2.2.2": + version: 2.2.3 + resolution: "react-device-detect@npm:2.2.3" + dependencies: + ua-parser-js: ^1.0.33 + peerDependencies: + react: ">= 0.14.0" + react-dom: ">= 0.14.0" + checksum: 42d9b3182b9d2495bf0d7914c9f370da51d8bdb853a3eba2acaf433894ae760386a075ba103185be825b33d42f50d85ef462087f261656d433f4c74dab23861f + languageName: node + linkType: hard + "react-devtools-core@npm:^4.19.1": version: 4.24.6 resolution: "react-devtools-core@npm:4.24.6" @@ -36292,6 +40858,16 @@ __metadata: languageName: node linkType: hard +"react-fast-marquee@npm:^1.6.4": + version: 1.6.5 + resolution: "react-fast-marquee@npm:1.6.5" + peerDependencies: + react: ">= 16.8.0 || ^18.0.0" + react-dom: ">= 16.8.0 || ^18.0.0" + checksum: 5213b10983f47a2dc27c3206144f96b37dad2f08457b19ecb9e393e4bd3c8db8c9cccf1758ceb5c4ca6d697e3715f3f90c5d806e4cb62bbbad9ece7f0e7b3caf + languageName: node + linkType: hard + "react-fit@npm:^1.4.0": version: 1.4.0 resolution: "react-fit@npm:1.4.0" @@ -36315,6 +40891,17 @@ __metadata: languageName: node linkType: hard +"react-github-btn@npm:^1.4.0": + version: 1.4.0 + resolution: "react-github-btn@npm:1.4.0" + dependencies: + github-buttons: ^2.22.0 + peerDependencies: + react: ">=16.3.0" + checksum: 33a416ad76ab4cc9238ac5cf5cfcab636bb2127c48fb30805385350fd3a3c2aa0aaeb78f6c726c52a0d3d133ca469be35d4b3d188c8e40c735c7ff458d2c8c3c + languageName: node + linkType: hard + "react-hook-form@npm:^7.43.3": version: 7.43.3 resolution: "react-hook-form@npm:7.43.3" @@ -36400,6 +40987,15 @@ __metadata: languageName: node linkType: hard +"react-intersection-observer@npm:^8.33.1": + version: 8.34.0 + resolution: "react-intersection-observer@npm:8.34.0" + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0 + checksum: 7713fecfd1512c7f5a60f9f0bf15403b8f8bbd4110bcafaeaea6de36a0e0eb60368c3638f99e9c97b75ad8fc787ea48c241dcb5c694f821d7f2976f709082cc5 + languageName: node + linkType: hard + "react-intl@npm:^5.25.1": version: 5.25.1 resolution: "react-intl@npm:5.25.1" @@ -36468,6 +41064,34 @@ __metadata: languageName: node linkType: hard +"react-markdown@npm:^9.0.1": + version: 9.0.1 + resolution: "react-markdown@npm:9.0.1" + dependencies: + "@types/hast": ^3.0.0 + devlop: ^1.0.0 + hast-util-to-jsx-runtime: ^2.0.0 + html-url-attributes: ^3.0.0 + mdast-util-to-hast: ^13.0.0 + remark-parse: ^11.0.0 + remark-rehype: ^11.0.0 + unified: ^11.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + peerDependencies: + "@types/react": ">=18" + react: ">=18" + checksum: ca1daa650d48b84a5a9771683cdb3f3d2d418247ce0faf73ede3207c65f2a21cdebb9df37afda67f6fc8f0f0a7b9ce00eb239781954a4d6c7ad88ea4df068add + languageName: node + linkType: hard + +"react-merge-refs@npm:1.1.0": + version: 1.1.0 + resolution: "react-merge-refs@npm:1.1.0" + checksum: 90884352999002d868ab9f1bcfe3222fb0f2178ed629f1da7e98e5a9b02a2c96b4aa72800db92aabd69d2483211b4be57a2088e89a11a0b660e7ada744d4ddf7 + languageName: node + linkType: hard + "react-multi-email@npm:^0.5.3": version: 0.5.3 resolution: "react-multi-email@npm:0.5.3" @@ -36687,6 +41311,18 @@ __metadata: languageName: node linkType: hard +"react-resize-detector@npm:^9.1.0": + version: 9.1.1 + resolution: "react-resize-detector@npm:9.1.1" + dependencies: + lodash: ^4.17.21 + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 0612b4416212962e5762f25e20c7016bdce3107d745a399b44bc099a04488a704228908357845c2e3fa49bf9902077f0eeebc99cf76d42ea479a8aa79f4c5b9d + languageName: node + linkType: hard + "react-schemaorg@npm:^2.0.0": version: 2.0.0 resolution: "react-schemaorg@npm:2.0.0" @@ -36761,6 +41397,13 @@ __metadata: languageName: node linkType: hard +"react-string-replace@npm:^1.1.0": + version: 1.1.1 + resolution: "react-string-replace@npm:1.1.1" + checksum: fd5058bbb3953f4bb2daa7012630a154c6109e3e848f93925e146710cebf527647a7c1496c89ca0b5d9e4b4f8ffd5c55ca631539095039faaba0a7ba3787e7cb + languageName: node + linkType: hard + "react-style-singleton@npm:^2.1.0": version: 2.1.1 resolution: "react-style-singleton@npm:2.1.1" @@ -36879,6 +41522,20 @@ __metadata: languageName: node linkType: hard +"react-twemoji@npm:^0.3.0": + version: 0.3.0 + resolution: "react-twemoji@npm:0.3.0" + dependencies: + lodash.isequal: ^4.5.0 + prop-types: ^15.7.2 + twemoji: ^13.0.1 + peerDependencies: + react: ^16.4.2 + react-dom: ^16.4.2 + checksum: d4e56477c28c0ad65b98a062a2e9a1777b808a16c05dfa35d77d84fea26f7d1e884d2e30f95a8f14c94c31330d3d4f53a4fd0bfce917bc4be9fb21d34a05db8a + languageName: node + linkType: hard + "react-universal-interface@npm:^0.6.2": version: 0.6.2 resolution: "react-universal-interface@npm:0.6.2" @@ -36899,6 +41556,18 @@ __metadata: languageName: node linkType: hard +"react-use-measure@npm:^2.1.1": + version: 2.1.1 + resolution: "react-use-measure@npm:2.1.1" + dependencies: + debounce: ^1.2.1 + peerDependencies: + react: ">=16.13" + react-dom: ">=16.13" + checksum: b8e8939229d463c3c505f7b617925c0228efae0cd6f651371f463846417b06c9170be57df51293a61027c41770f8a090fdb8a08717c4e36290ccb496e0318f1f + languageName: node + linkType: hard + "react-use@npm:^17.4.2": version: 17.5.0 resolution: "react-use@npm:17.5.0" @@ -36935,6 +41604,15 @@ __metadata: languageName: node linkType: hard +"react-wrap-balancer@npm:^1.0.0": + version: 1.1.1 + resolution: "react-wrap-balancer@npm:1.1.1" + peerDependencies: + react: ">=16.8.0 || ^17.0.0 || ^18" + checksum: 68d9417efa751eced4a8c9f7e3f1f43d59fbf9ecf42dfd90b7b4c33f5af855766bb21bf967c9fc8a0f09f6ca4a58071c1dd47af2c813b33b3813ebe7efcb32f2 + languageName: node + linkType: hard + "react@npm:^18, react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -36964,6 +41642,27 @@ __metadata: languageName: node linkType: hard +"read-pkg-up@npm:^1.0.1": + version: 1.0.1 + resolution: "read-pkg-up@npm:1.0.1" + dependencies: + find-up: ^1.0.0 + read-pkg: ^1.0.0 + checksum: d18399a0f46e2da32beb2f041edd0cda49d2f2cc30195a05c759ef3ed9b5e6e19ba1ad1bae2362bdec8c6a9f2c3d18f4d5e8c369e808b03d498d5781cb9122c7 + languageName: node + linkType: hard + +"read-pkg@npm:^1.0.0": + version: 1.1.0 + resolution: "read-pkg@npm:1.1.0" + dependencies: + load-json-file: ^1.0.0 + normalize-package-data: ^2.3.2 + path-type: ^1.0.0 + checksum: a0f5d5e32227ec8e6a028dd5c5134eab229768dcb7a5d9a41a284ed28ad4b9284fecc47383dc1593b5694f4de603a7ffaee84b738956b9b77e0999567485a366 + languageName: node + linkType: hard + "read-pkg@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg@npm:3.0.0" @@ -37314,6 +42013,13 @@ __metadata: languageName: node linkType: hard +"regenerator-runtime@npm:^0.11.0": + version: 0.11.1 + resolution: "regenerator-runtime@npm:0.11.1" + checksum: 3c97bd2c7b2b3247e6f8e2147a002eb78c995323732dad5dc70fac8d8d0b758d0295e7015b90d3d444446ae77cbd24b9f9123ec3a77018e81d8999818301b4f4 + languageName: node + linkType: hard + "regenerator-runtime@npm:^0.13.3": version: 0.13.9 resolution: "regenerator-runtime@npm:0.13.9" @@ -37459,6 +42165,17 @@ __metadata: languageName: node linkType: hard +"relay-runtime@npm:12.0.0": + version: 12.0.0 + resolution: "relay-runtime@npm:12.0.0" + dependencies: + "@babel/runtime": ^7.0.0 + fbjs: ^3.0.0 + invariant: ^2.2.4 + checksum: 51cdc8a5e04188982452ae4e7c6ac7d6375ee769130d24ce8e8f9cdd45aa7e11ecd68670f56e30dcee1b4974585e88ecce19e69a9868b80cda0db7678c3b8f0a + languageName: node + linkType: hard + "release-it@npm:^17.1.1": version: 17.1.1 resolution: "release-it@npm:17.1.1" @@ -37509,6 +42226,55 @@ __metadata: languageName: node linkType: hard +"remark-html@npm:^14.0.1": + version: 14.0.1 + resolution: "remark-html@npm:14.0.1" + 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 + checksum: 5d689b05dc6b4f24e08ece07aabca98685949198a8b6ceacb2fbf7fba8f45f55cea5623caddfd92aaf6e6f082bc1c93797dfb82dc48a6f6e1c5263947a4779c9 + languageName: node + linkType: hard + +"remark-parse@npm:^10.0.0": + version: 10.0.2 + resolution: "remark-parse@npm:10.0.2" + dependencies: + "@types/mdast": ^3.0.0 + mdast-util-from-markdown: ^1.0.0 + unified: ^10.0.0 + checksum: 5041b4b44725f377e69986e02f8f072ae2222db5e7d3b6c80829756b842e811343ffc2069cae1f958a96bfa36104ab91a57d7d7e2f0cef521e210ab8c614d5c7 + languageName: node + linkType: hard + +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + micromark-util-types: ^2.0.0 + unified: ^11.0.0 + checksum: d83d245290fa84bb04fb3e78111f09c74f7417e7c012a64dd8dc04fccc3699036d828fbd8eeec8944f774b6c30cc1d925c98f8c46495ebcee7c595496342ab7f + languageName: node + linkType: hard + +"remark-rehype@npm:^11.0.0": + version: 11.1.0 + resolution: "remark-rehype@npm:11.1.0" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + mdast-util-to-hast: ^13.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: f0c731f0ab92a122e7f9c9bcbd10d6a31fdb99f0ea3595d232ddd9f9d11a308c4ec0aff4d56e1d0d256042dfad7df23b9941e50b5038da29786959a5926814e1 + languageName: node + linkType: hard + "remark-slug@npm:^6.0.0": version: 6.1.0 resolution: "remark-slug@npm:6.1.0" @@ -37520,6 +42286,29 @@ __metadata: languageName: node linkType: hard +"remark-stringify@npm:^10.0.0": + version: 10.0.3 + resolution: "remark-stringify@npm:10.0.3" + dependencies: + "@types/mdast": ^3.0.0 + mdast-util-to-markdown: ^1.0.0 + unified: ^10.0.0 + checksum: 6004e204fba672ee322c3cf0bef090e95802feedf7ef875f88b120c5e6208f1eb09c014486d5ca42a1e199c0a17ce0ed165fb248c66608458afed4bdca51dd3a + languageName: node + linkType: hard + +"remark@npm:^14.0.2": + version: 14.0.3 + resolution: "remark@npm:14.0.3" + dependencies: + "@types/mdast": ^3.0.0 + remark-parse: ^10.0.0 + remark-stringify: ^10.0.0 + unified: ^10.0.0 + checksum: 36eec9668c5f5e497507fa5d396c79183265a5f7dd204a608e7f031a4f61b48f7bb5cfaec212f5614ccd1266cc4a9f8d7a59a45e95aed9876986b4c453b191be + languageName: node + linkType: hard + "remarkable@npm:^2.0.1": version: 2.0.1 resolution: "remarkable@npm:2.0.1" @@ -37532,6 +42321,20 @@ __metadata: languageName: node linkType: hard +"remeda@npm:^1.24.1": + version: 1.61.0 + resolution: "remeda@npm:1.61.0" + checksum: c080da71953ccc178334ca774f0da5c3f4664ef25ff7bc1e1f09a921ff9c264bbf8be8e0ac876c4a3f851a4d3e017cd454319a0e24610fd744bd8f9177dd4c7b + languageName: node + linkType: hard + +"remedial@npm:^1.0.7": + version: 1.0.8 + resolution: "remedial@npm:1.0.8" + checksum: 12df7c55eb92501d7f33cfe5f5ad12be13bb6ac0c53f494aaa9963d5a5155bb8be2143e8d5e17afa1a500ef5dc71d13642920d35350f2a31b65a9778afab6869 + languageName: node + linkType: hard + "remove-accents@npm:0.5.0": version: 0.5.0 resolution: "remove-accents@npm:0.5.0" @@ -37546,6 +42349,20 @@ __metadata: languageName: node linkType: hard +"remove-trailing-separator@npm:^1.0.1": + version: 1.1.0 + resolution: "remove-trailing-separator@npm:1.1.0" + checksum: d3c20b5a2d987db13e1cca9385d56ecfa1641bae143b620835ac02a6b70ab88f68f117a0021838db826c57b31373d609d52e4f31aca75fc490c862732d595419 + languageName: node + linkType: hard + +"remove-trailing-spaces@npm:^1.0.6": + version: 1.0.8 + resolution: "remove-trailing-spaces@npm:1.0.8" + checksum: 81f615c5cd8dd6a5e3017dcc9af598965575d176d42ef99cfd7b894529991f464e629fd68aba089f5c6bebf5bb8070a5eee56f3b621aba55e8ef524d6a4d4f69 + languageName: node + linkType: hard + "renderkid@npm:^3.0.0": version: 3.0.0 resolution: "renderkid@npm:3.0.0" @@ -37626,6 +42443,13 @@ __metadata: languageName: node linkType: hard +"require-main-filename@npm:^1.0.1": + version: 1.0.1 + resolution: "require-main-filename@npm:1.0.1" + checksum: 1fef30754da961f4e13c450c3eb60c7ae898a529c6ad6fa708a70bd2eed01564ceb299187b2899f5562804d797a059f39a5789884d0ac7b7ae1defc68fba4abf + languageName: node + linkType: hard + "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -37654,7 +42478,7 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.2.0": +"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 @@ -37670,6 +42494,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -37677,13 +42508,6 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - "resolve-url-loader@npm:^5.0.0": version: 5.0.0 resolution: "resolve-url-loader@npm:5.0.0" @@ -37900,6 +42724,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: ^2.0.0 + checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a + languageName: node + linkType: hard + "responselike@npm:^3.0.0": version: 3.0.0 resolution: "responselike@npm:3.0.0" @@ -38324,7 +43157,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:7.8.1, rxjs@npm:^7.8.1": +"rxjs@npm:7.8.1, rxjs@npm:^7.0.0, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -38342,6 +43175,22 @@ __metadata: languageName: node linkType: hard +"s-ago@npm:^2.2.0": + version: 2.2.0 + resolution: "s-ago@npm:2.2.0" + checksum: f665fef44d9d88322ce5a798ca3c49b40f96231ddc7bd46dc23c883e98215675aa422985760d45d3779faa3c0bc94edb2a50630bf15f54c239d11963e53d998c + languageName: node + linkType: hard + +"sade@npm:^1.7.3": + version: 1.8.1 + resolution: "sade@npm:1.8.1" + dependencies: + mri: ^1.1.0 + checksum: 0756e5b04c51ccdc8221ebffd1548d0ce5a783a44a0fa9017a026659b97d632913e78f7dca59f2496aa996a0be0b0c322afd87ca72ccd909406f49dbffa0f45d + languageName: node + linkType: hard + "safe-array-concat@npm:^1.0.1": version: 1.1.0 resolution: "safe-array-concat@npm:1.1.0" @@ -38574,6 +43423,13 @@ __metadata: languageName: node linkType: hard +"scuid@npm:^1.1.0": + version: 1.1.0 + resolution: "scuid@npm:1.1.0" + checksum: cd094ac3718b0070a222f9a499b280c698fdea10268cc163fa244421099544c1766dd893fdee0e2a8eba5d53ab9d0bcb11067bedff166665030fa6fda25a096b + languageName: node + linkType: hard + "section-matter@npm:^1.0.0": version: 1.0.0 resolution: "section-matter@npm:1.0.0" @@ -38712,6 +43568,27 @@ __metadata: languageName: node linkType: hard +"sentence-case@npm:^2.1.0": + version: 2.1.1 + resolution: "sentence-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + upper-case-first: ^1.1.2 + checksum: ce5ca48804051e056a6956ad75a1a7d833e5d8f5021a015d380a22d3cf04496d5238de2e5c876d9701a9218633052c3a65911ca1b6460d36a41ecad46e81d139 + languageName: node + linkType: hard + +"sentence-case@npm:^3.0.4": + version: 3.0.4 + resolution: "sentence-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case-first: ^2.0.2 + checksum: 3cfe6c0143e649132365695706702d7f729f484fa7b25f43435876efe7af2478243eefb052bacbcce10babf9319fd6b5b6bc59b94c80a1c819bcbb40651465d5 + languageName: node + linkType: hard + "seq-queue@npm:^0.0.5": version: 0.0.5 resolution: "seq-queue@npm:0.0.5" @@ -38830,7 +43707,7 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.4": +"setimmediate@npm:^1.0.4, setimmediate@npm:^1.0.5": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd @@ -38928,6 +43805,13 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.7.3": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b + languageName: node + linkType: hard + "shelljs@npm:0.8.5": version: 0.8.5 resolution: "shelljs@npm:0.8.5" @@ -39002,6 +43886,13 @@ __metadata: languageName: node linkType: hard +"signedsource@npm:^1.0.0": + version: 1.0.0 + resolution: "signedsource@npm:1.0.0" + checksum: 64b2c8d7a48de9009cfd3aff62bb7c88abf3b8e0421f17ebb1d7f5ca9cc9c3ad10f5a1e3ae6cd804e4e6121c87b668202ae9057065f058ddfbf34ea65f63945d + languageName: node + linkType: hard + "simple-concat@npm:^1.0.0": version: 1.0.1 resolution: "simple-concat@npm:1.0.1" @@ -39159,6 +44050,25 @@ __metadata: languageName: node linkType: hard +"snake-case@npm:^2.1.0": + version: 2.1.0 + resolution: "snake-case@npm:2.1.0" + dependencies: + no-case: ^2.2.0 + checksum: 7e42b4841103be4dd050b2f57f5cb423d5164524c1cb3d81efda9809265a82a2d02ddf44361beae37d75a239308e6414be85fe441dc48cd70c708cb975387d10 + languageName: node + linkType: hard + +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: 0a7a79900bbb36f8aaa922cf111702a3647ac6165736d5dc96d3ef367efc50465cac70c53cd172c382b022dac72ec91710608e5393de71f76d7142e6fd80e8a3 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -39298,6 +44208,13 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 + languageName: node + linkType: hard + "spacetime@npm:^7.1.4": version: 7.1.4 resolution: "spacetime@npm:7.1.4" @@ -39314,6 +44231,13 @@ __metadata: languageName: node linkType: hard +"spawn-command@npm:^0.0.2-1": + version: 0.0.2 + resolution: "spawn-command@npm:0.0.2" + checksum: e35c5d28177b4d461d33c88cc11f6f3a5079e2b132c11e1746453bbb7a0c0b8a634f07541a2a234fa4758239d88203b758def509161b651e81958894c0b4b64b + languageName: node + linkType: hard + "spawndamnit@npm:^2.0.0": version: 2.0.0 resolution: "spawndamnit@npm:2.0.0" @@ -39390,6 +44314,15 @@ __metadata: languageName: node linkType: hard +"sponge-case@npm:^1.0.1": + version: 1.0.1 + resolution: "sponge-case@npm:1.0.1" + dependencies: + tslib: ^2.0.3 + checksum: 64f53d930f63c5a9e59d4cae487c1ffa87d25eab682833b01d572cc885e7e3fdbad4f03409a41f03ecb27f1f8959432253eb48332c7007c3388efddb24ba2792 + languageName: node + linkType: hard + "sprintf-js@npm:^1.1.2": version: 1.1.2 resolution: "sprintf-js@npm:1.1.2" @@ -39747,6 +44680,13 @@ __metadata: languageName: node linkType: hard +"string-env-interpolation@npm:^1.0.1": + version: 1.0.1 + resolution: "string-env-interpolation@npm:1.0.1" + checksum: d126329587f635bee65300e4451e7352b9b67e03daeb62f006ca84244cac12a1f6e45176b018653ba0c3ec3b5d980f9ca59d2eeed99cf799501cdaa7f871dc6f + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -39775,6 +44715,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^1.0.1, string-width@npm:^1.0.2": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: ^1.0.0 + is-fullwidth-code-point: ^1.0.0 + strip-ansi: ^3.0.0 + checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e + languageName: node + linkType: hard + "string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" @@ -39987,6 +44938,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" + dependencies: + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 + languageName: node + linkType: hard + "stringify-object@npm:^3.3.0": version: 3.3.0 resolution: "stringify-object@npm:3.3.0" @@ -40007,7 +44968,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^3.0.0": +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": version: 3.0.1 resolution: "strip-ansi@npm:3.0.1" dependencies: @@ -40041,6 +45002,15 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-bom@npm:2.0.0" + dependencies: + is-utf8: ^0.2.0 + checksum: 08efb746bc67b10814cd03d79eb31bac633393a782e3f35efbc1b61b5165d3806d03332a97f362822cf0d4dd14ba2e12707fcff44fe1c870c48a063a0c9e4944 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -40154,6 +45124,15 @@ __metadata: languageName: node linkType: hard +"style-to-object@npm:^1.0.0": + version: 1.0.8 + resolution: "style-to-object@npm:1.0.8" + dependencies: + inline-style-parser: 0.2.4 + checksum: 80ca4773fc728d7919edc552eb46bab11aa8cdd0b426528ee8b817ba6872ea7b9d38fbb97b6443fd2d4895a4c4b02ec32765387466a302d0b4d1b91deab1e1a0 + languageName: node + linkType: hard + "styled-jsx@npm:5.1.1": version: 5.1.1 resolution: "styled-jsx@npm:5.1.1" @@ -40248,6 +45227,15 @@ __metadata: languageName: node linkType: hard +"superjson@npm:^1.9.1": + version: 1.13.3 + resolution: "superjson@npm:1.13.3" + dependencies: + copy-anything: ^3.0.2 + checksum: f5aeb010f24163cb871a4bc402d9164112201c059afc247a75b03131c274aea6eec9cf08be9e4a9465fe4961689009a011584528531d52f7cc91c077e07e5c75 + languageName: node + linkType: hard + "supertest@npm:^6.3.3": version: 6.3.4 resolution: "supertest@npm:6.3.4" @@ -40283,7 +45271,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.0, supports-color@npm:^8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -40466,6 +45454,15 @@ __metadata: languageName: node linkType: hard +"swap-case@npm:^2.0.2": + version: 2.0.2 + resolution: "swap-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 6e21c9e1b3cd5735eb2af679a99ec3efc78a14e3d4d5e3fd594e254b91cfd37185b3d1c6e41b22f53a2cdf5d1b963ce30c0fe8b78337e3fd43d0137084670a5f + languageName: node + linkType: hard + "swc-loader@npm:^0.2.3": version: 0.2.3 resolution: "swc-loader@npm:0.2.3" @@ -40476,6 +45473,15 @@ __metadata: languageName: node linkType: hard +"swr@npm:^1.2.2": + version: 1.3.0 + resolution: "swr@npm:1.3.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + checksum: e7a184f0d560e9c8be85c023cc8e65e56a88a6ed46f9394b301b07f838edca23d2e303685319a4fcd620b81d447a7bcb489c7fa0a752c259f91764903c690cdb + languageName: node + linkType: hard + "symbol-observable@npm:4.0.0": version: 4.0.0 resolution: "symbol-observable@npm:4.0.0" @@ -41090,6 +46096,34 @@ __metadata: languageName: node linkType: hard +"title-case@npm:^2.1.0": + version: 2.1.1 + resolution: "title-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + upper-case: ^1.0.3 + checksum: e88ddfc4608a7fb18ed440139d9c42a5f8a50f916e07062be2aef5e2038720746ed51c4fdf9e7190d24a8cc10e6dec9773027fc44450b3a4a5e5c49b4a931fb1 + languageName: node + linkType: hard + +"title-case@npm:^3.0.3": + version: 3.0.3 + resolution: "title-case@npm:3.0.3" + dependencies: + tslib: ^2.0.3 + checksum: e8b7ea006b53cf3208d278455d9f1e22c409459d7f9878da324fa3b18cc0aef8560924c19c744e870394a5d9cddfdbe029ebae9875909ee7f4fc562e7cbfc53e + languageName: node + linkType: hard + +"tmp-promise@npm:^3.0.3": + version: 3.0.3 + resolution: "tmp-promise@npm:3.0.3" + dependencies: + tmp: ^0.2.0 + checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c + languageName: node + linkType: hard + "tmp@npm:0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" @@ -41108,6 +46142,13 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.0": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -41225,7 +46266,7 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2": +"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -41234,6 +46275,13 @@ __metadata: languageName: node linkType: hard +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: e241da104682a0e0d807222cc1496b92e716af4db7a002f4aeff33ae6a0024fef93165d49eab11aa07c71e1347c42d46563f91dfaa4d3fb945aa535cdead53ed + languageName: node + linkType: hard + "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" @@ -41248,6 +46296,13 @@ __metadata: languageName: node linkType: hard +"trough@npm:^2.0.0": + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 6097df63169aca1f9b08c263b1b501a9b878387f46e161dde93f6d0bba7febba93c95f876a293c5ea370f6cb03bcb687b2488c8955c3cfb66c2c0161ea8c00f6 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" @@ -41396,6 +46451,13 @@ __metadata: languageName: node linkType: hard +"ts-log@npm:^2.2.3": + version: 2.2.5 + resolution: "ts-log@npm:2.2.5" + checksum: 28f78ab15b8555d56c089dbc243327d8ce4331219956242a29fc4cb3bad6bb0cb8234dd17a292381a1b1dba99a7e4849a2181b2e1a303e8247e9f4ca4e284f2d + languageName: node + linkType: hard + "ts-morph@npm:^13.0.2": version: 13.0.3 resolution: "ts-morph@npm:13.0.3" @@ -41603,6 +46665,20 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.6.1, tslib@npm:^2.6.2, tslib@npm:^2.6.3": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 + languageName: node + linkType: hard + +"tslib@npm:~2.6.0": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 + languageName: node + linkType: hard + "tslog@npm:^4.9.2": version: 4.9.2 resolution: "tslog@npm:4.9.2" @@ -41741,6 +46817,13 @@ __metadata: languageName: node linkType: hard +"tween-functions@npm:^1.2.0": + version: 1.2.0 + resolution: "tween-functions@npm:1.2.0" + checksum: 880708d680eff5c347ddcb9f922ad121703a91c78ce308ed309073e73a794b633eb0b80589a839365803f150515ad34c9646809ae8a0e90f09e62686eefb1ab6 + languageName: node + linkType: hard + "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -41748,6 +46831,25 @@ __metadata: languageName: node linkType: hard +"twemoji-parser@npm:13.1.0": + version: 13.1.0 + resolution: "twemoji-parser@npm:13.1.0" + checksum: 8046ce003c03dd92d68c2648cfbfa39c659fca4f05c10da8d14957985dc3c0c680f3ecf2de8245dc1ddffedc5b2a675f2032053e1e77cc7474301a88fe192ad3 + languageName: node + linkType: hard + +"twemoji@npm:^13.0.1": + version: 13.1.1 + resolution: "twemoji@npm:13.1.1" + dependencies: + fs-extra: ^8.0.1 + jsonfile: ^5.0.0 + twemoji-parser: 13.1.0 + universalify: ^0.1.2 + checksum: f60a8785ad6eb1a673c4f1bccb00a852ead13639db9f763c0e3e9dee6e3e67d88f1d2b481bcee34c35570ab060918b30b6ee68aa65ea1042ad35cd83212a102a + languageName: node + linkType: hard + "twilio@npm:^3.80.1": version: 3.80.1 resolution: "twilio@npm:3.80.1" @@ -42160,6 +47262,15 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^1.0.33, ua-parser-js@npm:^1.0.35": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 19455df8c2348ef53f2e150e7406d3a025a619c2fd69722a1e63363d5ba8d91731ef7585f2dce7d8f14c8782734b4d704c05f246dca5f7565b5ae7d318084f2a + languageName: node + linkType: hard + "uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": version: 1.0.6 resolution: "uc.micro@npm:1.0.6" @@ -42209,7 +47320,14 @@ __metadata: languageName: node linkType: hard -"undici@npm:^5.28.2": +"unc-path-regex@npm:^0.1.2": + version: 0.1.2 + resolution: "unc-path-regex@npm:0.1.2" + checksum: a05fa2006bf4606051c10fc7968f08ce7b28fa646befafa282813aeb1ac1a56f65cb1b577ca7851af2726198d59475bb49b11776036257b843eaacee2860a4ec + languageName: node + linkType: hard + +"undici@npm:^5.12.0, undici@npm:^5.28.2": version: 5.28.4 resolution: "undici@npm:5.28.4" dependencies: @@ -42266,6 +47384,36 @@ __metadata: languageName: node linkType: hard +"unified@npm:^10.0.0": + version: 10.1.2 + resolution: "unified@npm:10.1.2" + dependencies: + "@types/unist": ^2.0.0 + bail: ^2.0.0 + extend: ^3.0.0 + is-buffer: ^2.0.0 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^5.0.0 + checksum: 053e7c65ede644607f87bd625a299e4b709869d2f76ec8138569e6e886903b6988b21cd9699e471eda42bee189527be0a9dac05936f1d069a5e65d0125d5d756 + languageName: node + linkType: hard + +"unified@npm:^11.0.0": + version: 11.0.5 + resolution: "unified@npm:11.0.5" + dependencies: + "@types/unist": ^3.0.0 + bail: ^2.0.0 + devlop: ^1.0.0 + extend: ^3.0.0 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^6.0.0 + checksum: b3bf7fd6f568cc261e074dae21188483b0f2a8ab858d62e6e85b75b96cc655f59532906ae3c64d56a9b257408722d71f1d4135292b3d7ee02907c8b592fb3cf0 + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -42302,6 +47450,22 @@ __metadata: languageName: node linkType: hard +"unist-builder@npm:^3.0.0": + version: 3.0.1 + resolution: "unist-builder@npm:3.0.1" + dependencies: + "@types/unist": ^2.0.0 + checksum: d8c42fe69aa55a3e9aed3c581007ec5371349bf9885bfa8b0b787634f8d12fa5081f066b205ded379b6d0aeaa884039bae9ebb65a3e71784005fb110aef30d0f + languageName: node + linkType: hard + +"unist-util-generated@npm:^2.0.0": + version: 2.0.1 + resolution: "unist-util-generated@npm:2.0.1" + checksum: 6221ad0571dcc9c8964d6b054f39ef6571ed59cc0ce3e88ae97ea1c70afe76b46412a5ffaa91f96814644ac8477e23fb1b477d71f8d70e625728c5258f5c0d99 + languageName: node + linkType: hard + "unist-util-is@npm:^4.0.0": version: 4.1.0 resolution: "unist-util-is@npm:4.1.0" @@ -42309,6 +47473,60 @@ __metadata: languageName: node linkType: hard +"unist-util-is@npm:^5.0.0": + version: 5.2.1 + resolution: "unist-util-is@npm:5.2.1" + dependencies: + "@types/unist": ^2.0.0 + checksum: ae76fdc3d35352cd92f1bedc3a0d407c3b9c42599a52ab9141fe89bdd786b51f0ec5a2ab68b93fb532e239457cae62f7e39eaa80229e1cb94875da2eafcbe5c4 + languageName: node + linkType: hard + +"unist-util-is@npm:^6.0.0": + version: 6.0.0 + resolution: "unist-util-is@npm:6.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f630a925126594af9993b091cf807b86811371e465b5049a6283e08537d3e6ba0f7e248e1e7dab52cfe33f9002606acef093441137181b327f6fe504884b20e2 + languageName: node + linkType: hard + +"unist-util-position@npm:^4.0.0": + version: 4.0.4 + resolution: "unist-util-position@npm:4.0.4" + dependencies: + "@types/unist": ^2.0.0 + checksum: e7487b6cec9365299695e3379ded270a1717074fa11fd2407c9b934fb08db6fe1d9077ddeaf877ecf1813665f8ccded5171693d3d9a7a01a125ec5cdd5e88691 + languageName: node + linkType: hard + +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f89b27989b19f07878de9579cd8db2aa0194c8360db69e2c99bd2124a480d79c08f04b73a64daf01a8fb3af7cba65ff4b45a0b978ca243226084ad5f5d441dde + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^3.0.0": + version: 3.0.3 + resolution: "unist-util-stringify-position@npm:3.0.3" + dependencies: + "@types/unist": ^2.0.0 + checksum: dbd66c15183607ca942a2b1b7a9f6a5996f91c0d30cf8966fb88955a02349d9eefd3974e9010ee67e71175d784c5a9fea915b0aa0b0df99dcb921b95c4c9e124 + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: e2e7aee4b92ddb64d314b4ac89eef7a46e4c829cbd3ee4aee516d100772b490eb6b4974f653ba0717a0071ca6ea0770bf22b0a2ea62c65fcba1d071285e96324 + languageName: node + linkType: hard + "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -42319,6 +47537,26 @@ __metadata: languageName: node linkType: hard +"unist-util-visit-parents@npm:^5.1.1": + version: 5.1.3 + resolution: "unist-util-visit-parents@npm:5.1.3" + dependencies: + "@types/unist": ^2.0.0 + unist-util-is: ^5.0.0 + checksum: 8ecada5978994f846b64658cf13b4092cd78dea39e1ba2f5090a5de842ba4852712c02351a8ae95250c64f864635e7b02aedf3b4a093552bb30cf1bd160efbaa + languageName: node + linkType: hard + +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-visit-parents@npm:6.0.1" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + checksum: 08927647c579f63b91aafcbec9966dc4a7d0af1e5e26fc69f4e3e6a01215084835a2321b06f3cbe7bf7914a852830fc1439f0fc3d7153d8804ac3ef851ddfa20 + languageName: node + linkType: hard + "unist-util-visit@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-visit@npm:2.0.3" @@ -42330,6 +47568,35 @@ __metadata: languageName: node linkType: hard +"unist-util-visit@npm:^4.0.0": + version: 4.1.2 + resolution: "unist-util-visit@npm:4.1.2" + dependencies: + "@types/unist": ^2.0.0 + unist-util-is: ^5.0.0 + unist-util-visit-parents: ^5.1.1 + checksum: 95a34e3f7b5b2d4b68fd722b6229972099eb97b6df18913eda44a5c11df8b1e27efe7206dd7b88c4ed244a48c474a5b2e2629ab79558ff9eb936840295549cee + languageName: node + linkType: hard + +"unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 9ec42e618e7e5d0202f3c191cd30791b51641285732767ee2e6bcd035931032e3c1b29093f4d7fd0c79175bbc1f26f24f26ee49770d32be76f8730a652a857e6 + languageName: node + linkType: hard + +"universal-base64@npm:^2.1.0": + version: 2.1.0 + resolution: "universal-base64@npm:2.1.0" + checksum: 03bc6f7de04aee83038c26038cd2639f470fd9665f99b3613934c4ccde5d59047d45e34ea4c843ac582da83ea1b050bf8defba8eb390e566f0be314646ddbc9b + languageName: node + linkType: hard + "universal-user-agent@npm:^6.0.0": version: 6.0.1 resolution: "universal-user-agent@npm:6.0.1" @@ -42337,7 +47604,7 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0": +"universalify@npm:^0.1.0, universalify@npm:^0.1.2": version: 0.1.2 resolution: "universalify@npm:0.1.2" checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff @@ -42358,6 +47625,15 @@ __metadata: languageName: node linkType: hard +"unixify@npm:^1.0.0": + version: 1.0.0 + resolution: "unixify@npm:1.0.0" + dependencies: + normalize-path: ^2.1.1 + checksum: 3be30e48579fc6c7390bd59b4ab9e745fede0c164dfb7351cf710bd1dbef8484b1441186205af6bcb13b731c0c88caf9b33459f7bf8c89e79c046e656ae433f0 + languageName: node + linkType: hard + "unload@npm:2.2.0": version: 2.2.0 resolution: "unload@npm:2.2.0" @@ -42448,6 +47724,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.1.0": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" + dependencies: + escalade: ^3.1.2 + picocolors: ^1.0.1 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562 + languageName: node + linkType: hard + "update-input-width@npm:^1.2.2": version: 1.4.2 resolution: "update-input-width@npm:1.4.2" @@ -42475,7 +47765,7 @@ __metadata: languageName: node linkType: hard -"upper-case-first@npm:^1.1.0": +"upper-case-first@npm:^1.1.0, upper-case-first@npm:^1.1.2": version: 1.1.2 resolution: "upper-case-first@npm:1.1.2" dependencies: @@ -42484,13 +47774,31 @@ __metadata: languageName: node linkType: hard -"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1": +"upper-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case-first@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 4487db4701effe3b54ced4b3e4aa4d9ab06c548f97244d04aafb642eedf96a76d5a03cf5f38f10f415531d5792d1ac6e1b50f2a76984dc6964ad530f12876409 + languageName: node + linkType: hard + +"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1, upper-case@npm:^1.1.3": version: 1.1.3 resolution: "upper-case@npm:1.1.3" checksum: 991c845de75fa56e5ad983f15e58494dd77b77cadd79d273cc11e8da400067e9881ae1a52b312aed79b3d754496e2e0712e08d22eae799e35c7f9ba6f3d8a85d languageName: node linkType: hard +"upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 508723a2b03ab90cf1d6b7e0397513980fab821cbe79c87341d0e96cedefadf0d85f9d71eac24ab23f526a041d585a575cfca120a9f920e44eb4f8a7cf89121c + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -42544,6 +47852,20 @@ __metadata: languageName: node linkType: hard +"urlpattern-polyfill@npm:^10.0.0": + version: 10.0.0 + resolution: "urlpattern-polyfill@npm:10.0.0" + checksum: 61d890f151ea4ecf34a3dcab32c65ad1f3cda857c9d154af198260c6e5b2ad96d024593409baaa6d4428dd1ab206c14799bf37fe011117ac93a6a44913ac5aa4 + languageName: node + linkType: hard + +"urlpattern-polyfill@npm:^8.0.0": + version: 8.0.2 + resolution: "urlpattern-polyfill@npm:8.0.2" + checksum: d2cc0905a613c77e330c426e8697ee522dd9640eda79ac51160a0f6350e103f09b8c327623880989f8ba7325e8d95267b745aa280fdcc2aead80b023e16bd09d + languageName: node + linkType: hard + "use-callback-ref@npm:^1.2.3": version: 1.2.5 resolution: "use-callback-ref@npm:1.2.5" @@ -42572,6 +47894,18 @@ __metadata: languageName: node linkType: hard +"use-deep-compare-effect@npm:^1.6.1": + version: 1.8.1 + resolution: "use-deep-compare-effect@npm:1.8.1" + dependencies: + "@babel/runtime": ^7.12.5 + dequal: ^2.0.2 + peerDependencies: + react: ">=16.13" + checksum: 2b9b6291df3f772f44d259b352e5d998963ccee0db2efeb76bb05525d928064aeeb69bb0dee5a5e428fea7cf3db67c097a770ebd30caa080662b565f6ef02b2e + languageName: node + linkType: hard + "use-isomorphic-layout-effect@npm:^1.1.2": version: 1.1.2 resolution: "use-isomorphic-layout-effect@npm:1.1.2" @@ -42633,6 +47967,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.2.0": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 + languageName: node + linkType: hard + "utif@npm:^2.0.1": version: 2.0.1 resolution: "utif@npm:2.0.1" @@ -42712,6 +48055,20 @@ __metadata: languageName: node linkType: hard +"uvu@npm:^0.5.0": + version: 0.5.6 + resolution: "uvu@npm:0.5.6" + dependencies: + dequal: ^2.0.0 + diff: ^5.0.0 + kleur: ^4.0.3 + sade: ^1.7.3 + bin: + uvu: bin.js + checksum: 09460a37975627de9fcad396e5078fb844d01aaf64a6399ebfcfd9e55f1c2037539b47611e8631f89be07656962af0cf48c334993db82b9ae9c3d25ce3862168 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -42747,6 +48104,13 @@ __metadata: languageName: node linkType: hard +"value-or-promise@npm:^1.0.11, value-or-promise@npm:^1.0.12": + version: 1.0.12 + resolution: "value-or-promise@npm:1.0.12" + checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -42765,6 +48129,58 @@ __metadata: languageName: node linkType: hard +"vfile-location@npm:^4.0.0": + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" + dependencies: + "@types/unist": ^2.0.0 + vfile: ^5.0.0 + checksum: c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 + languageName: node + linkType: hard + +"vfile-message@npm:^3.0.0": + version: 3.1.4 + resolution: "vfile-message@npm:3.1.4" + dependencies: + "@types/unist": ^2.0.0 + unist-util-stringify-position: ^3.0.0 + checksum: d0ee7da1973ad76513c274e7912adbed4d08d180eaa34e6bd40bc82459f4b7bc50fcaff41556135e3339995575eac5f6f709aba9332b80f775618ea4880a1367 + languageName: node + linkType: hard + +"vfile-message@npm:^4.0.0": + version: 4.0.2 + resolution: "vfile-message@npm:4.0.2" + dependencies: + "@types/unist": ^3.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 964e7e119f4c0e0270fc269119c41c96da20afa01acb7c9809a88365c8e0c64aa692fafbd952669382b978002ecd7ad31ef4446d85e8a22cdb62f6df20186c2d + languageName: node + linkType: hard + +"vfile@npm:^5.0.0": + version: 5.3.7 + resolution: "vfile@npm:5.3.7" + dependencies: + "@types/unist": ^2.0.0 + is-buffer: ^2.0.0 + unist-util-stringify-position: ^3.0.0 + vfile-message: ^3.0.0 + checksum: 642cce703afc186dbe7cabf698dc954c70146e853491086f5da39e1ce850676fc96b169fcf7898aa3ff245e9313aeec40da93acd1e1fcc0c146dc4f6308b4ef9 + languageName: node + linkType: hard + +"vfile@npm:^6.0.0": + version: 6.0.3 + resolution: "vfile@npm:6.0.3" + dependencies: + "@types/unist": ^3.0.0 + vfile-message: ^4.0.0 + checksum: 152b6729be1af70df723efb65c1a1170fd483d41086557da3651eea69a1dd1f0c22ea4344834d56d30734b9185bcab63e22edc81d3f0e9bed8aa4660d61080af + languageName: node + linkType: hard + "victory-vendor@npm:^36.6.8": version: 36.9.2 resolution: "victory-vendor@npm:36.9.2" @@ -43147,6 +48563,21 @@ __metadata: languageName: node linkType: hard +"wait-on@npm:^7.0.1": + version: 7.2.0 + resolution: "wait-on@npm:7.2.0" + dependencies: + axios: ^1.6.1 + joi: ^17.11.0 + lodash: ^4.17.21 + minimist: ^1.2.8 + rxjs: ^7.8.1 + bin: + wait-on: bin/wait-on + checksum: 69ec1432bb4479363fdd71f2f3f501a98aa356a562781108a4a89ef8fdf1e3d5fd0c2fd56c4cc5902abbb662065f1f22d4e436a1e6fc9331ce8b575eb023325e + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -43156,6 +48587,15 @@ __metadata: languageName: node linkType: hard +"warning@npm:^4.0.3": + version: 4.0.3 + resolution: "warning@npm:4.0.3" + dependencies: + loose-envify: ^1.0.0 + checksum: 4f2cb6a9575e4faf71ddad9ad1ae7a00d0a75d24521c193fa464f30e6b04027bd97aa5d9546b0e13d3a150ab402eda216d59c1d0f2d6ca60124d96cd40dfa35c + languageName: node + linkType: hard + "watchpack@npm:2.4.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" @@ -43192,6 +48632,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 + languageName: node + linkType: hard + "web-push@npm:^3.6.7": version: 3.6.7 resolution: "web-push@npm:3.6.7" @@ -43214,13 +48661,33 @@ __metadata: languageName: node linkType: hard -"web-streams-polyfill@npm:^3.0.3": +"web-streams-polyfill@npm:4.0.0-beta.3": + version: 4.0.0-beta.3 + resolution: "web-streams-polyfill@npm:4.0.0-beta.3" + checksum: dfec1fbf52b9140e4183a941e380487b6c3d5d3838dd1259be81506c1c9f2abfcf5aeb670aeeecfd9dff4271a6d8fef931b193c7bedfb42542a3b05ff36c0d16 + languageName: node + linkType: hard + +"web-streams-polyfill@npm:^3.0.3, web-streams-polyfill@npm:^3.2.0, web-streams-polyfill@npm:^3.2.1": version: 3.3.3 resolution: "web-streams-polyfill@npm:3.3.3" checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb languageName: node linkType: hard +"webcrypto-core@npm:^1.8.0": + version: 1.8.0 + resolution: "webcrypto-core@npm:1.8.0" + dependencies: + "@peculiar/asn1-schema": ^2.3.8 + "@peculiar/json-schema": ^1.1.12 + asn1js: ^3.0.1 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + checksum: 4f128f5283b258eda34844ee804b7d4f102b151a7cb3ae5e722309ea7d37db704184c726afb67bf53cc9eb41279379b24626270b6f4ff08ec5be6b420ff70f18 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -43501,6 +48968,13 @@ __metadata: languageName: node linkType: hard +"which-module@npm:^1.0.0": + version: 1.0.0 + resolution: "which-module@npm:1.0.0" + checksum: 98434f7deb36350cb543c1f15612188541737e1f12d39b23b1c371dff5cf4aa4746210f2bdec202d5fe9da8682adaf8e3f7c44c520687d30948cfc59d5534edb + languageName: node + linkType: hard + "which-module@npm:^2.0.0": version: 2.0.1 resolution: "which-module@npm:2.0.1" @@ -43612,6 +49086,15 @@ __metadata: languageName: node linkType: hard +"window-size@npm:^0.2.0": + version: 0.2.0 + resolution: "window-size@npm:0.2.0" + bin: + window-size: cli.js + checksum: a85e2acf156cfa194301294809867bdadd8a48ee5d972d9fa8e3e1b3420a1d0201b13ac8eb0348a0d14bbf2c3316565b6a749749c2384c5d286caf8a064c4f90 + languageName: node + linkType: hard + "windows-release@npm:^5.0.1": version: 5.1.1 resolution: "windows-release@npm:5.1.1" @@ -43676,6 +49159,16 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^2.0.0": + version: 2.1.0 + resolution: "wrap-ansi@npm:2.1.0" + dependencies: + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + checksum: 2dacd4b3636f7a53ee13d4d0fe7fa2ed9ad81e9967e17231924ea88a286ec4619a78288de8d41881ee483f4449ab2c0287cde8154ba1bd0126c10271101b2ee3 + languageName: node + linkType: hard + "wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -43762,6 +49255,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.12.0, ws@npm:^8.17.1": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + languageName: node + linkType: hard + "ws@npm:^8.13.0, ws@npm:^8.2.3": version: 8.16.0 resolution: "ws@npm:8.16.0" @@ -43852,7 +49360,7 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:0.6.2": +"xml2js@npm:0.6.2, xml2js@npm:^0.6.0": version: 0.6.2 resolution: "xml2js@npm:0.6.2" dependencies: @@ -43961,6 +49469,13 @@ __metadata: languageName: node linkType: hard +"y18n@npm:^3.2.1": + version: 3.2.2 + resolution: "y18n@npm:3.2.2" + checksum: 6154fd7544f8bbf5b18cdf77692ed88d389be49c87238ecb4e0d6a5276446cd2a5c29cc4bdbdddfc7e4e498b08df9d7e38df4a1453cf75eecfead392246ea74a + languageName: node + linkType: hard + "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -43996,6 +49511,13 @@ __metadata: languageName: node linkType: hard +"yaml-ast-parser@npm:^0.0.43": + version: 0.0.43 + resolution: "yaml-ast-parser@npm:0.0.43" + checksum: fb5df4c067b6ccbd00953a46faf6ff27f0e290d623c712dc41f330251118f110e22cfd184bbff498bd969cbcda3cd27e0f9d0adb9e6d90eb60ccafc0d8e28077 + languageName: node + linkType: hard + "yaml@npm:2.0.0-1": version: 2.0.0-1 resolution: "yaml@npm:2.0.0-1" @@ -44017,6 +49539,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.3.1": + version: 2.5.1 + resolution: "yaml@npm:2.5.1" + bin: + yaml: bin.mjs + checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 + languageName: node + linkType: hard + "yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -44041,6 +49572,16 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "yargs-parser@npm:3.2.0" + dependencies: + camelcase: ^3.0.0 + lodash.assign: ^4.1.0 + checksum: d86fd69816a28a617f4cad21f7bfe7f7c931b16d063c73449cd914db409b8d5981a0f29f9e2a05014a7229164aa47336adf5a8856fa9870ab892346d29138e9a + languageName: node + linkType: hard + "yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -44075,7 +49616,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.1, yargs@npm:^17.7.2": +"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -44090,6 +49631,28 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^5.0.0": + version: 5.0.0 + resolution: "yargs@npm:5.0.0" + dependencies: + cliui: ^3.2.0 + decamelize: ^1.1.1 + get-caller-file: ^1.0.1 + lodash.assign: ^4.2.0 + os-locale: ^1.4.0 + read-pkg-up: ^1.0.1 + require-directory: ^2.1.1 + require-main-filename: ^1.0.1 + set-blocking: ^2.0.0 + string-width: ^1.0.2 + which-module: ^1.0.0 + window-size: ^0.2.0 + y18n: ^3.2.1 + yargs-parser: ^3.2.0 + checksum: 478e9c8562c5cf5b9c2efc7c917e0b00c489cc50153d5d911ab68767c2cfddaf0b5bd4e04d6fefc00cb1d8f6263eab1d73df79a24d650ba95f5d45c819a1585a + languageName: node + linkType: hard + "yarn@npm:^1.22.18": version: 1.22.19 resolution: "yarn@npm:1.22.19" @@ -44276,3 +49839,10 @@ __metadata: checksum: 160052a7faaefbaad1071e890a06e5d7a04f6ff6985def30a7b4471f4ddbdd1d30bb05b3688a2777cd0b717d1f0d98dad24883a5caa3deeb3afb4d83b6dabc55 languageName: node linkType: hard + +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard \ No newline at end of file From 5ffe8a22346ee512bceda692f9f331fac7724003 Mon Sep 17 00:00:00 2001 From: Hariom Date: Mon, 23 Sep 2024 17:12:16 +0530 Subject: [PATCH 10/61] More fixes --- TODO.md | 17 +-- apps/web/components/apps/AppPage.tsx | 1 + .../components/AppConnectionItem.tsx | 30 +++- .../steps-views/ConnectedVideoStep.tsx | 2 + apps/web/pages/api/availability/calendar.ts | 17 ++- packages/app-store/_appRegistry.ts | 2 +- packages/app-store/components.tsx | 1 + .../googlecalendar/lib/CalendarService.ts | 34 +++-- packages/app-store/server.ts | 21 ++- packages/app-store/utils.ts | 4 + packages/core/EventManager.ts | 4 - .../apps/components/DisconnectIntegration.tsx | 5 +- .../getAllCredentials.ts | 2 +- .../lib/apps/getEnabledAppsFromCredentials.ts | 21 ++- .../domainWideDelegation/clientAndServer.ts | 4 + packages/lib/domainWideDelegation/server.ts | 141 ++++++++++++++++++ .../lib/getConnectedDestinationCalendars.ts | 6 +- packages/lib/server/domainWideDelegation.ts | 53 ------- packages/lib/server/getUsersCredentials.ts | 2 +- .../server/repository/domainWideDelegation.ts | 14 ++ .../appCredentialsByType.handler.ts | 3 - .../loggedInViewer/integrations.handler.ts | 21 ++- .../loggedInViewer/integrations.schema.ts | 1 + .../setDestinationCalendar.handler.ts | 6 +- .../apps/queryForDependencies.handler.ts | 12 +- .../toggleEnabled.handler.ts | 31 ++++ packages/types/Calendar.d.ts | 2 + .../DisconnectIntegration.tsx | 4 +- 28 files changed, 346 insertions(+), 115 deletions(-) create mode 100644 packages/lib/domainWideDelegation/clientAndServer.ts create mode 100644 packages/lib/domainWideDelegation/server.ts delete mode 100644 packages/lib/server/domainWideDelegation.ts diff --git a/TODO.md b/TODO.md index 6fb2a488190158..dbe2bb0160fcca 100644 --- a/TODO.md +++ b/TODO.md @@ -7,20 +7,19 @@ - Any domain can be added by a user - [x] Support multiple domains in DomainWideDelegation schema for an organization - [x] Use the domain as well to identify if the domain wide delegation is enabled - - [ ] Confirmation for DwD deletion - [ ] Don't allow disabled platform to be selected in the UI for creation. - We can restrict updating as well with that platform(i.e. show it in the list but not let it save) - But we shouldn't stop showing it in the UI, otherwise it might get changed to some other platform due to Select's nature. - - [ ] If the user doesn't exist in Google Workspace, and the user has connected personal account, should we correctly use the personal account? - - [ ] Fix installed status not showing correctly on apps/index.tsx. Install button isn't disabled there. - -### Follow-up release -- [ ] Just after creating Domain-wide delegation, there should be a check to ensure that the clientID has been added to the Workspace Platform and then only show it as enabled. + - [x] Before enabling Domain-wide delegation, there should be a check to ensure that the clientID has been added to the Workspace Platform + - [x] We should allow setting default conferencing app during onboarding +### Follow-up release + - [ ] Confirmation for DwD deletion and disabling + - [ ] If DWD is enabled and the org member doesn't exist in Google Workspace, and the user has connected personal account, should we correctly use the personal account? ### To discuss - - [ ] 1. When the calendar is connect the first calendar isn't enabled to check for double bookings. Should we toggle that? - + - + ### Security Testing - [ ] Because a single credential controls all the emails calendars, can someone not authorized trick us into giving access to some other organization's calendars? - [ ] We need to really make sure that service account key is NEVER exposed @@ -31,7 +30,7 @@ - [ ] Inviting a new user. - Verified that Google Calendar is shown pre-installed. - How about Google Meet? -- [ ] Troubleshooter. Seems to be not working +- [x] Troubleshooter ### Documentation - After enabling domain-wide delegation, the credential is shown pre-installed and the connection can't be removed(or the app can't be uninstalled by user) diff --git a/apps/web/components/apps/AppPage.tsx b/apps/web/components/apps/AppPage.tsx index ea4fe26af9e58c..7d14f16322ef40 100644 --- a/apps/web/components/apps/AppPage.tsx +++ b/apps/web/components/apps/AppPage.tsx @@ -18,6 +18,7 @@ import type { App as AppType } from "@calcom/types/App"; import { Badge, Button, Icon, SkeletonButton, SkeletonText, showToast } from "@calcom/ui"; import { InstallAppButtonChild } from "./InstallAppButtonChild"; + export type AppPageProps = { name: string; description: AppType["description"]; diff --git a/apps/web/components/getting-started/components/AppConnectionItem.tsx b/apps/web/components/getting-started/components/AppConnectionItem.tsx index 895eb0e36d85b4..57ded951297cce 100644 --- a/apps/web/components/getting-started/components/AppConnectionItem.tsx +++ b/apps/web/components/getting-started/components/AppConnectionItem.tsx @@ -6,7 +6,7 @@ import { WEBAPP_URL } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { App } from "@calcom/types/App"; -import { Badge, Button, Icon } from "@calcom/ui"; +import { Badge, Button, Icon, showToast } from "@calcom/ui"; interface IAppConnectionItem { title: string; @@ -23,7 +23,18 @@ interface IAppConnectionItem { const AppConnectionItem = (props: IAppConnectionItem) => { const { title, logo, type, installed, isDefault, defaultInstall, slug } = props; const { t } = useLocale(); - const setDefaultConferencingApp = trpc.viewer.appsRouter.setDefaultConferencingApp.useMutation(); + const utils = trpc.useUtils(); + const setDefaultConferencingApp = trpc.viewer.appsRouter.setDefaultConferencingApp.useMutation({ + onSuccess: async () => { + await utils.viewer.me.invalidate(); + }, + onError: (error) => { + showToast(t("something_went_wrong"), { + type: "error", + }); + console.error(error); + }, + }); const dependency = props.dependencyData?.find((data) => !data.installed); return (
    @@ -32,6 +43,7 @@ const AppConnectionItem = (props: IAppConnectionItem) => {

    {title}

    {isDefault && {t("default")}}
    +
    { )} /> + {installed && !isDefault && ( + + )} +
    ); }; diff --git a/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx b/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx index 4f81150dc97c79..acf26ce63e2dac 100644 --- a/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx +++ b/apps/web/components/getting-started/steps-views/ConnectedVideoStep.tsx @@ -17,7 +17,9 @@ const ConnectedVideoStep = (props: ConnectedAppStepProps) => { const { data: queryConnectedVideoApps, isPending } = trpc.viewer.integrations.useQuery({ variant: "conferencing", onlyInstalled: false, + // It sorts by most popular first, then by installed first sortByMostPopular: true, + sortByInstalledFirst: true, }); const { data } = useMeQuery(); const { t } = useLocale(); diff --git a/apps/web/pages/api/availability/calendar.ts b/apps/web/pages/api/availability/calendar.ts index 8fca441117f61c..e6a2fc6d129e6f 100644 --- a/apps/web/pages/api/availability/calendar.ts +++ b/apps/web/pages/api/availability/calendar.ts @@ -6,7 +6,7 @@ import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import notEmpty from "@calcom/lib/notEmpty"; import prisma from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; - +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; const selectedCalendarSelectSchema = z.object({ integration: z.string(), externalId: z.string(), @@ -42,7 +42,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const { credentials, ...user } = userWithCredentials; if (req.method === "POST") { - const { integration, externalId, credentialId, domainWideDelegationCredentialId } = selectedCalendarSelectSchema.parse(req.body); + const { integration, externalId, credentialId, domainWideDelegationCredentialId } = + selectedCalendarSelectSchema.parse(req.body); await prisma.selectedCalendar.upsert({ where: { userId_integration_externalId: { @@ -55,11 +56,13 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) userId: user.id, integration, externalId, - ...(credentialId && credentialId > 0 ? { - credentialId, - } : { - domainWideDelegationCredentialId, - }), + ...(!isDomainWideDelegationCredential({ credentialId }) + ? { + credentialId, + } + : { + domainWideDelegationCredentialId, + }), }, // already exists update: {}, diff --git a/packages/app-store/_appRegistry.ts b/packages/app-store/_appRegistry.ts index 9bfbe1378c2f2d..5c2611898be3ec 100644 --- a/packages/app-store/_appRegistry.ts +++ b/packages/app-store/_appRegistry.ts @@ -6,7 +6,7 @@ import prisma, { safeAppSelect, safeCredentialSelect } from "@calcom/prisma"; import { userMetadata } from "@calcom/prisma/zod-utils"; import type { AppFrontendPayload as App } from "@calcom/types/App"; import type { CredentialFrontendPayload as Credential } from "@calcom/types/Credential"; -import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; export type TDependencyData = { name?: string; diff --git a/packages/app-store/components.tsx b/packages/app-store/components.tsx index 472b2ad10ab1ae..5767679e09c796 100644 --- a/packages/app-store/components.tsx +++ b/packages/app-store/components.tsx @@ -20,6 +20,7 @@ import { InstallAppButtonMap } from "./apps.browser.generated"; import type { InstallAppButtonProps } from "./types"; export const InstallAppButtonWithoutPlanCheck = ( + props: { type: App["type"]; options?: UseAddAppMutationOptions; diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index ba2c7a2b771ae3..24c070c37291ad 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -185,30 +185,27 @@ export default class GoogleCalendarService implements Calendar { }; private getAuthedCalendarFromDomainWideDelegation = async () => { - const user = this.credential.user; - if (!user) { - this.log.error( - "Couldn't check for domain wide delegation without user", - safeStringify(this.credential) - ); - return null; - } + const user = this.credential.delegatedToId; //TODO: Compute it once and save it const domainWideDelegation = - await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ - user, + await DomainWideDelegationRepository.findByIdIncludeSensitiveServiceAccountKey({ + id: this.credential.delegatedToId, }); - const isDomainWideDelegationEnabled = domainWideDelegation && domainWideDelegation.enabled; - if (this.credential.delegatedToId && !isDomainWideDelegationEnabled) { + if (this.credential.delegatedToId && !domainWideDelegation) { + this.log.error("CalendarAppDomainWideDelegationNotSetupError", safeStringify({ + domainWideDelegationExists: !!domainWideDelegation, + domainWideDelegationEnabled: domainWideDelegation?.enabled, + forceEnableDomainWideDelegation, + })); throw new CalendarAppDomainWideDelegationNotSetupError( "Credential needs domain wide delegation to be setup and enabled" ); } - if (domainWideDelegation && domainWideDelegation.enabled) { + if (domainWideDelegation) { const emailToImpersonate = this.credential.user?.email; if (!emailToImpersonate) { this.log.error("No email to impersonate found for domain wide delegation"); @@ -271,8 +268,8 @@ export default class GoogleCalendarService implements Calendar { return null; }; - public authedCalendar = async () => { - const authedCalendarFromDomainWideDelegation = await this.getAuthedCalendarFromDomainWideDelegation(); + public authedCalendar = async ({ forceEnableDomainWideDelegation = false }: { forceEnableDomainWideDelegation?: boolean } = {}) => { + const authedCalendarFromDomainWideDelegation = await this.getAuthedCalendarFromDomainWideDelegation({ forceEnableDomainWideDelegation }); if (authedCalendarFromDomainWideDelegation) { return authedCalendarFromDomainWideDelegation; } @@ -783,6 +780,13 @@ export default class GoogleCalendarService implements Calendar { throw error; } } + + // It would error if the domain wide delegation is not set up correctly + async testDomainWideDelegationSetup() { + const calendar = await this.authedCalendar({ forceEnableDomainWideDelegation: true }); + const cals = await calendar.calendarList.list({ fields: "items(id)" }); + return !!cals.data.items; + } } class MyGoogleAuth extends google.auth.OAuth2 { diff --git a/packages/app-store/server.ts b/packages/app-store/server.ts index f6ee92e4156284..47f5489ca79034 100644 --- a/packages/app-store/server.ts +++ b/packages/app-store/server.ts @@ -8,7 +8,7 @@ import { AppCategories } from "@calcom/prisma/enums"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import { defaultLocations } from "./locations"; - +import { getAllDomainWideDelegationConferencingCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; export async function getLocationGroupedOptions( userOrTeamId: { userId: number } | { teamId: number }, t: TFunction @@ -27,7 +27,7 @@ export async function getLocationGroupedOptions( // don't default to {}, when you do TS no longer determines the right types. let idToSearchObject: Prisma.CredentialWhereInput; - + let user = null; if ("teamId" in userOrTeamId) { const teamId = userOrTeamId.teamId; // See if the team event belongs to an org @@ -52,9 +52,14 @@ export async function getLocationGroupedOptions( } } else { idToSearchObject = { userId: userOrTeamId.userId }; + user = await prisma.user.findFirst({ + where: { + id: userOrTeamId.userId, + }, + }); } - const credentials = await prisma.credential.findMany({ + let credentials = await prisma.credential.findMany({ where: { ...idToSearchObject, app: { @@ -73,7 +78,15 @@ export async function getLocationGroupedOptions( }, }); - const integrations = await getEnabledAppsFromCredentials(credentials, { filterOnCredentials: true }); + if (user) { + const domainWideDelegationCredentials = await getAllDomainWideDelegationConferencingCredentialsForUser({ + user + }) + + credentials = [...credentials, ...domainWideDelegationCredentials]; + } + + const integrations = await getEnabledAppsFromCredentials(credentials, { filterOnCredentials: true }); integrations.forEach((app) => { // All apps that are labeled as a locationOption are video apps. diff --git a/packages/app-store/utils.ts b/packages/app-store/utils.ts index dfd3a2cfa91fa1..59c167ce0a5f79 100644 --- a/packages/app-store/utils.ts +++ b/packages/app-store/utils.ts @@ -132,6 +132,10 @@ export function getAppFromSlug(slug: string | undefined): AppMeta | undefined { return ALL_APPS.find((app) => app.slug === slug); } +export function getAppFromType(type: string): AppMeta | undefined { + return ALL_APPS.find((app) => app.type === type); +} + export function getAppFromLocationValue(type: string): AppMeta | undefined { return ALL_APPS.find((app) => app?.appData?.location?.type === type); } diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 2d13700cc1c162..2601a14cd5130e 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -138,10 +138,6 @@ export default class EventManager { this.appOptions = this.generateAppOptions(eventTypeAppMetadata); } - private async getCalendarCredentials () { - return this.calendarCredentials; - } - /** * Takes a CalendarEvent and creates all necessary integration entries for it. * When a video integration is chosen as the event's location, a video integration diff --git a/packages/features/apps/components/DisconnectIntegration.tsx b/packages/features/apps/components/DisconnectIntegration.tsx index bb3a720beb1112..992907fce13c05 100644 --- a/packages/features/apps/components/DisconnectIntegration.tsx +++ b/packages/features/apps/components/DisconnectIntegration.tsx @@ -6,7 +6,7 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { ButtonProps } from "@calcom/ui"; import { DisconnectIntegrationComponent, showToast } from "@calcom/ui"; - +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; export default function DisconnectIntegration(props: { credentialId: number; label?: string; @@ -36,11 +36,14 @@ export default function DisconnectIntegration(props: { }, }); + // Such a credential is added in-memory and removed when Domain-wide delegation is disabled. + const disableDisconnect = isDomainWideDelegationCredential({ credentialId }); return ( mutation.mutate({ id: credentialId })} isModalOpen={modalOpen} onModalOpen={() => setModalOpen((prevValue) => !prevValue)} + disabled={disableDisconnect} {...props} /> ); diff --git a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts index 7dc319057351dd..67c31450f64f24 100644 --- a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts +++ b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts @@ -5,7 +5,7 @@ import prisma from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import type { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import type { CredentialPayload } from "@calcom/types/Credential"; -import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; /** * Gets credentials from the user, team, and org if applicable * diff --git a/packages/lib/apps/getEnabledAppsFromCredentials.ts b/packages/lib/apps/getEnabledAppsFromCredentials.ts index 18904e5b3be07a..f28e4309a31b27 100644 --- a/packages/lib/apps/getEnabledAppsFromCredentials.ts +++ b/packages/lib/apps/getEnabledAppsFromCredentials.ts @@ -29,7 +29,9 @@ const getEnabledAppsFromCredentials = async ( }, }, } satisfies Prisma.AppWhereInput; - + const domainWideDelegationCredentials = credentials.filter((credential) => { + return credential.id < 0 + }) if (filterOnCredentials) { const userIds: number[] = [], teamIds: number[] = []; @@ -48,10 +50,25 @@ const getEnabledAppsFromCredentials = async ( ...(filterOnIds.credentials.some.OR.length && filterOnIds), }; - const enabledApps = await prisma.app.findMany({ + let enabledApps = await prisma.app.findMany({ where, select: { slug: true, enabled: true }, }); + + let domainWideDelegationApps = await prisma.app.findMany({ + where: { + slug: { + in: domainWideDelegationCredentials.map((credential) => credential.appId) + } + }, + select: { slug: true, enabled: true }, + }); + console.log({ + domainWideDelegationCredentials, + domainWideDelegationApps, + }); + enabledApps = [...enabledApps, ...domainWideDelegationApps]; + const apps = getApps(credentials, filterOnCredentials); const filteredApps = apps.reduce((reducedArray, app) => { const appDbQuery = enabledApps.find((metadata) => metadata.slug === app.slug); diff --git a/packages/lib/domainWideDelegation/clientAndServer.ts b/packages/lib/domainWideDelegation/clientAndServer.ts new file mode 100644 index 00000000000000..79939153760419 --- /dev/null +++ b/packages/lib/domainWideDelegation/clientAndServer.ts @@ -0,0 +1,4 @@ +export function isDomainWideDelegationCredential({ credentialId }: { credentialId: number }) { + // Though it is set as -1 right now, but we might want to set it to some other negative value. + return credentialId < 0; +} diff --git a/packages/lib/domainWideDelegation/server.ts b/packages/lib/domainWideDelegation/server.ts new file mode 100644 index 00000000000000..e80e51aa857dda --- /dev/null +++ b/packages/lib/domainWideDelegation/server.ts @@ -0,0 +1,141 @@ +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; +import logger from "@calcom/lib/logger"; +import { metadata as googleCalendarMetadata } from "@calcom/app-store/googlecalendar/_metadata"; +import { metadata as googleMeetMetadata } from "@calcom/app-store/googlevideo/_metadata"; +import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; +import { safeStringify } from "@calcom/lib/safeStringify"; +import { defaultVideoAppCategories } from "@calcom/app-store/utils"; + +const log = logger.getSubLogger({ prefix: ["lib/domainWideDelegation/server"] }); +interface DomainWideDelegation { + id: string; + workspacePlatform: { + slug: string + }; +} + +interface User { + email: string; + id: number; +} + + +const buildDomainWideDelegationCalendarCredential = ({ + domainWideDelegation, + user, +}: { + domainWideDelegation: DomainWideDelegation; + user: User; +}) => { + log.debug("buildDomainWideDelegationCredential", safeStringify({ domainWideDelegation, user })); + if (domainWideDelegation.workspacePlatform.slug !== "google") { + return null; + } + return { + id: -1, + type: googleCalendarMetadata.type, + delegatedToId: domainWideDelegation.id, + appId: googleCalendarMetadata.slug, + userId: user.id, + user: { + email: user.email, + }, + key: { + access_token: "NOOP_UNUSED_DELEGATION_TOKEN", + }, + invalid: false, + teamId: null, + }; +}; + +const buildDomainWideDelegationConferencingCredential = ({ + domainWideDelegation, + user, +}: { + domainWideDelegation: DomainWideDelegation; + user: User; +}) => { + if (domainWideDelegation.workspacePlatform.slug !== "google") { + return null; + } + return { + id: -1, + type: googleMeetMetadata.type, + delegatedToId: domainWideDelegation.id, + appId: googleMeetMetadata.slug, + userId: user.id, + user: { + email: user.email, + }, + key: { + access_token: "NOOP_UNUSED_DELEGATION_TOKEN", + }, + invalid: false, + teamId: null, + } +} +export async function getAllDomainWideDelegationCredentialsForUser({ user }: { user: { email: string; id: number } }) { + const log = logger.getSubLogger({ prefix: ["getAllDomainWideDelegationCredentialsForUser"] }); + log.debug("called with", { user }); + console.trace('tracing') + const domainWideDelegation = await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ + user: { + email: user.email, + }, + }); + + + if (!domainWideDelegation || !domainWideDelegation.enabled) { + return []; + } + + const workspacePlatforms = await WorkspacePlatformRepository.findAll(); + + const domainWideDelegationCredentials = workspacePlatforms + .map((workspacePlatform) => { + if (workspacePlatform.slug !== domainWideDelegation.workspacePlatform.slug) { + return null; + } + + return [ + buildDomainWideDelegationCalendarCredential({ domainWideDelegation, user }), + buildDomainWideDelegationConferencingCredential({ domainWideDelegation, user }) + ]; + }) + .flat() + .filter((credential): credential is NonNullable => credential !== null); + + log.debug("Returned", { domainWideDelegationCredentials }); + return domainWideDelegationCredentials; +} + +export async function getAllDomainWideDelegationCalendarCredentialsForUser({ user }: { user: { email: string; id: number } }) { + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + return domainWideDelegationCredentials.filter((credential) => credential.type.endsWith("_calendar")); +} +export async function getAllDomainWideDelegationConferencingCredentialsForUser({ user }: { user: { email: string; id: number } }) { + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + return domainWideDelegationCredentials.filter((credential) => credential.type.endsWith("_video") || credential.type.endsWith("_conferencing") || credential.type.endsWith("_messaging")); +} + +export async function checkIfSuccessfullyConfiguredInWorkspace({ domainWideDelegation, user }: { domainWideDelegation: DomainWideDelegation; user: User }) { + if (domainWideDelegation.workspacePlatform.slug === "google") { + const googleCalendar = await getCalendar(buildDomainWideDelegationCalendarCredential({ domainWideDelegation, user })); + if (!googleCalendar) { + throw new Error("Google Calendar App not found"); + } + return await googleCalendar.testDomainWideDelegationSetup(); + } + return false; +} + +export async function getAllDomainWideDelegationCredentialsForUserByAppType({ user, appType }: { user: User, appType: string }) { + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + return domainWideDelegationCredentials.filter((credential) => credential.type === appType); +} + +export async function getAllDomainWideDelegationCredentialsForUserByAppSlug({ user, appSlug }: { user: User, appSlug: string }) { + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + return domainWideDelegationCredentials.filter((credential) => credential.appId === appSlug); +} \ No newline at end of file diff --git a/packages/lib/getConnectedDestinationCalendars.ts b/packages/lib/getConnectedDestinationCalendars.ts index bba87ab7bae7c9..e7511e0fc4ed7e 100644 --- a/packages/lib/getConnectedDestinationCalendars.ts +++ b/packages/lib/getConnectedDestinationCalendars.ts @@ -3,7 +3,9 @@ import type { PrismaClient } from "@calcom/prisma"; import type { DestinationCalendar, SelectedCalendar, User } from "@calcom/prisma/client"; import { AppCategories } from "@calcom/prisma/enums"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; -import { getAllDomainWideDelegationCalendarCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; +import { getAllDomainWideDelegationCalendarCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; + export type UserWithCalendars = Pick & { selectedCalendars: Pick[]; destinationCalendar: DestinationCalendar | null; @@ -86,7 +88,7 @@ export async function getConnectedDestinationCalendars( integration, externalId, primaryEmail, - ...(credentialId && credentialId > 0 ? { + ...(!isDomainWideDelegationCredential({ credentialId }) ? { credentialId, } : { domainWideDelegationCredentialId, diff --git a/packages/lib/server/domainWideDelegation.ts b/packages/lib/server/domainWideDelegation.ts deleted file mode 100644 index c28c4dcc95d467..00000000000000 --- a/packages/lib/server/domainWideDelegation.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; -import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; -import logger from "@calcom/lib/logger"; -import { metadata as googleCalendarMetadata } from "@calcom/app-store/googlecalendar/_metadata"; - -export async function getAllDomainWideDelegationCredentialsForUser({ user }: { user: { email: string; id: number } }) { - const log = logger.getSubLogger({ prefix: ["getAllDomainWideDelegationCredentialsForUser"] }); - const domainWideDelegation = await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ - user: { - email: user.email, - }, - }); - - - if (!domainWideDelegation || !domainWideDelegation.enabled) { - return []; - } - - const workspacePlatforms = await WorkspacePlatformRepository.findAll(); - - const domainWideDelegationCredentials = workspacePlatforms - .map((workspacePlatform) => { - if (workspacePlatform.slug !== domainWideDelegation.workspacePlatform.slug) { - return null; - } - - return { - // A negative ID confirms it isn't in DB. The code using this credential would check for -1 and use delegatedToId instead - id: -1, - type: googleCalendarMetadata.type, - delegatedToId: domainWideDelegation.id, - appId: googleCalendarMetadata.slug, - userId: user.id, - user: { - email: user.email, - }, - key: { - access_token: "NOOP_UNUSED_DELEGATION_TOKEN", - }, - invalid: false, - teamId: null, - }; - }) - .filter((credential): credential is NonNullable => credential !== null); - - log.silly("getAllDomainWideDelegationCredentialsForUser", { domainWideDelegationCredentials }); - return domainWideDelegationCredentials; -} - -export async function getAllDomainWideDelegationCalendarCredentialsForUser({ user }: { user: { email: string; id: number } }) { - const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); - return domainWideDelegationCredentials.filter((credential) => credential.type.endsWith("_calendar")); -} \ No newline at end of file diff --git a/packages/lib/server/getUsersCredentials.ts b/packages/lib/server/getUsersCredentials.ts index ee9f9cbaee5dc7..89281cd7bf5dea 100644 --- a/packages/lib/server/getUsersCredentials.ts +++ b/packages/lib/server/getUsersCredentials.ts @@ -1,7 +1,7 @@ import { prisma } from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; -import { getAllDomainWideDelegationCredentialsForUser } from "./domainWideDelegation"; +import { getAllDomainWideDelegationCredentialsForUser } from "../domainWideDelegation/server"; type SessionUser = NonNullable; type User = { id: SessionUser["id"] }; diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index 979623c49f7270..48cc25e600b472 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -76,6 +76,20 @@ export class DomainWideDelegationRepository { }); } + static async findById({ id }: { id: string }) { + return await prisma.domainWideDelegation.findUnique({ + where: { id }, + select: domainWideDelegationSafeSelect, + }); + } + + static async findByIdIncludeSensitiveServiceAccountKey({ id }: { id: string }) { + return await prisma.domainWideDelegation.findUnique({ + where: { id }, + select: domainWideDelegationSelectIncludesServiceAccountKey, + }); + } + static async findUniqueByOrganizationMemberEmail({ email }: { email: string }) { const log = repositoryLogger.getSubLogger({ prefix: ["findUniqueByOrganizationMemberEmail"] }); log.debug("called with", { email }); diff --git a/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts b/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts index a941433c94c394..ce9c648ae4fd97 100644 --- a/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts @@ -3,7 +3,6 @@ import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; import type { TAppCredentialsByTypeInputSchema } from "./appCredentialsByType.schema"; -import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/server/domainWideDelegation"; type AppCredentialsByTypeOptions = { ctx: { @@ -32,8 +31,6 @@ export const appCredentialsByTypeHandler = async ({ ctx, input }: AppCredentials }, }); - const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); - // For app pages need to return which teams the user can install the app on // return user.credentials.filter((app) => app.type == input.appType).map((credential) => credential.id); return { diff --git a/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts b/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts index ac9b06944c8e2b..0d4d4ddd87f2bc 100644 --- a/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts @@ -15,6 +15,7 @@ import type { CredentialPayload } from "@calcom/types/Credential"; import type { PaymentApp } from "@calcom/types/PaymentService"; import type { TIntegrationsInputSchema } from "./integrations.schema"; +import { getAllDomainWideDelegationCredentialsForUser, getAllDomainWideDelegationCredentialsForUserByAppSlug } from "@calcom/lib/domainWideDelegation/server"; type IntegrationsOptions = { ctx: { @@ -53,6 +54,7 @@ export const integrationsHandler = async ({ ctx, input }: IntegrationsOptions) = extendsFeature, teamId, sortByMostPopular, + sortByInstalledFirst, appId, } = input; let credentials = await getUsersCredentials(user); @@ -137,6 +139,9 @@ export const integrationsHandler = async ({ ctx, input }: IntegrationsOptions) = filterOnCredentials: onlyInstalled, ...(appId ? { where: { slug: appId } } : {}), }); + + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + //TODO: Refactor this to pick up only needed fields and prevent more leaking let apps = await Promise.all( enabledApps.map(async ({ credentials: _, credential, key: _2 /* don't leak to frontend */, ...app }) => { @@ -193,15 +198,21 @@ export const integrationsHandler = async ({ ctx, input }: IntegrationsOptions) = }); } + // let domainWideDelegationCredentialsForApp = domainWideDelegationCredentials.filter((c) => c.appId === app.slug); + // if (app.usesCredentialsOf) { + // const domainWideDelegationCredentialsForAppDependency = domainWideDelegationCredentials.filter((c) => c.appId === app.usesCredentialsOf); + // domainWideDelegationCredentialsForApp = [...domainWideDelegationCredentialsForApp, ...domainWideDelegationCredentialsForAppDependency]; + // console.log("domainWideDelegationCredentialsForAppDependency", domainWideDelegationCredentialsForAppDependency); + // } return { ...app, ...(teams.length && { credentialOwner, }), - userCredentialIds, + userCredentialIds: [...userCredentialIds, /*...domainWideDelegationCredentialsForApp.map((c) => c.id)*/], invalidCredentialIds, teams, - isInstalled: !!userCredentialIds.length || !!teams.length || app.isGlobal, + isInstalled: !!userCredentialIds.length || !!teams.length || app.isGlobal /*|| !!domainWideDelegationCredentialsForApp.length*/, isSetupAlready, ...(app.dependencies && { dependencyData }), }; @@ -246,6 +257,12 @@ export const integrationsHandler = async ({ ctx, input }: IntegrationsOptions) = }); } + if (sortByInstalledFirst) { + apps.sort((a, b) => { + return (a.isInstalled ? 0 : 1) - (b.isInstalled ? 0 : 1); + }); + } + return { items: apps, }; diff --git a/packages/trpc/server/routers/loggedInViewer/integrations.schema.ts b/packages/trpc/server/routers/loggedInViewer/integrations.schema.ts index 8a0fa0b8b41944..f2951bcc1267bf 100644 --- a/packages/trpc/server/routers/loggedInViewer/integrations.schema.ts +++ b/packages/trpc/server/routers/loggedInViewer/integrations.schema.ts @@ -10,6 +10,7 @@ export const ZIntegrationsInputSchema = z.object({ extendsFeature: z.literal("EventType").optional(), teamId: z.union([z.number(), z.null()]).optional(), sortByMostPopular: z.boolean().optional(), + sortByInstalledFirst: z.boolean().optional(), categories: z.nativeEnum(AppCategories).array().optional(), appId: z.string().optional(), }); diff --git a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts b/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts index 3990588fe06787..5ede1ef56a774a 100644 --- a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts @@ -4,7 +4,7 @@ import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; import { TRPCError } from "@trpc/server"; - +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; import type { TSetDestinationCalendarInputSchema } from "./setDestinationCalendar.schema"; type SessionUser = NonNullable; @@ -64,7 +64,7 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati update: { integration, externalId, - ...(credentialId && credentialId > 0 ? { + ...(!isDomainWideDelegationCredential({ credentialId }) ? { credentialId, } : { domainWideDelegationCredentialId, @@ -75,7 +75,7 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati ...where, integration, externalId, - ...(credentialId && credentialId > 0 ? { + ...(!isDomainWideDelegationCredential({ credentialId }) ? { credentialId, } : { domainWideDelegationCredentialId, diff --git a/packages/trpc/server/routers/viewer/apps/queryForDependencies.handler.ts b/packages/trpc/server/routers/viewer/apps/queryForDependencies.handler.ts index 5e78c83c6454e8..6752334623558c 100644 --- a/packages/trpc/server/routers/viewer/apps/queryForDependencies.handler.ts +++ b/packages/trpc/server/routers/viewer/apps/queryForDependencies.handler.ts @@ -3,7 +3,7 @@ import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "../../../trpc"; import type { TQueryForDependenciesInputSchema } from "./queryForDependencies.schema"; - +import { getAllDomainWideDelegationCredentialsForUserByAppSlug } from "@calcom/lib/domainWideDelegation/server"; type QueryForDependenciesOptions = { ctx: { user: NonNullable; @@ -18,14 +18,18 @@ export const queryForDependenciesHandler = async ({ ctx, input }: QueryForDepend await Promise.all( input.map(async (dependency) => { - const appInstalled = await prisma.credential.findFirst({ + const appId = dependency; + const dbCredential = await prisma.credential.findFirst({ where: { - appId: dependency, + appId, userId: ctx.user.id, }, }); - const app = await getAppFromSlug(dependency); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUserByAppSlug({ user: ctx.user, appSlug: appId }); + const appInstalled = !!dbCredential || !!domainWideDelegationCredentials.length + + const app = getAppFromSlug(dependency); dependencyData.push({ name: app?.name || dependency, slug: dependency, installed: !!appInstalled }); }) diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts index 73b491be52d2da..5d13f1667a4720 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts @@ -5,11 +5,42 @@ import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/do import type { DomainWideDelegationToggleEnabledSchema } from "./schema"; import { ensureNoServiceAccountKey } from "./utils"; +import { checkIfSuccessfullyConfiguredInWorkspace } from "@calcom/lib/domainWideDelegation/server"; + +const assertWorkspaceConfigured = async ({ + domainWideDelegationId, + user, +}: { + domainWideDelegationId: string; + user: { id: number; email: string; }; +}) => { + const domainWideDelegation = await DomainWideDelegationRepository.findById({ id: domainWideDelegationId }); + if (!domainWideDelegation) { + throw new Error("Domain wide delegation not found"); + } + const isSuccessfullyConfigured = await checkIfSuccessfullyConfiguredInWorkspace({ + domainWideDelegation, + user, + }); + + if (!isSuccessfullyConfigured) { + throw new Error("Workspace not successfully configured"); + } +}; + export default async function toggleEnabledHandler({ + ctx, input, }: { + ctx: { user: { id: number; email: string;} }; input: z.infer; }) { + const { user: loggedInUser } = ctx; + + if (input.enabled) { + await assertWorkspaceConfigured({ domainWideDelegationId: input.id, user: loggedInUser }); + } + const updatedDomainWideDelegation = await DomainWideDelegationRepository.updateById({ id: input.id, data: { diff --git a/packages/types/Calendar.d.ts b/packages/types/Calendar.d.ts index 8e0d1c6d40f3b0..278dc386ac43d0 100644 --- a/packages/types/Calendar.d.ts +++ b/packages/types/Calendar.d.ts @@ -258,6 +258,8 @@ export interface Calendar { ): Promise; listCalendars(event?: CalendarEvent): Promise; + + testDomainWideDelegationSetup(): Promise; } /** diff --git a/packages/ui/components/disconnect-calendar-integration/DisconnectIntegration.tsx b/packages/ui/components/disconnect-calendar-integration/DisconnectIntegration.tsx index be3209877a0ee6..52cb674d513aa5 100644 --- a/packages/ui/components/disconnect-calendar-integration/DisconnectIntegration.tsx +++ b/packages/ui/components/disconnect-calendar-integration/DisconnectIntegration.tsx @@ -10,6 +10,7 @@ export const DisconnectIntegrationComponent = ({ onModalOpen, onDeletionConfirmation, buttonProps, + disabled, }: { label?: string; trashIcon?: boolean; @@ -18,6 +19,7 @@ export const DisconnectIntegrationComponent = ({ onModalOpen: () => void; onDeletionConfirmation: () => void; buttonProps?: ButtonProps; + disabled?: boolean; }) => { const { t } = useLocale(); @@ -30,7 +32,7 @@ export const DisconnectIntegrationComponent = ({ StartIcon={!trashIcon ? undefined : "trash"} size="base" variant={trashIcon && !label ? "icon" : "button"} - disabled={isGlobal} + disabled={isGlobal || disabled} {...buttonProps}> {label} From 5c825c47227cf7270be33076f2e93ae9a1d0c305 Mon Sep 17 00:00:00 2001 From: Hariom Date: Wed, 23 Oct 2024 16:51:54 +0530 Subject: [PATCH 11/61] Fix new workspace platform add --- apps/web/pages/settings/admin/workspace-platforms.tsx | 6 +++--- apps/web/public/static/locales/en/common.json | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/web/pages/settings/admin/workspace-platforms.tsx b/apps/web/pages/settings/admin/workspace-platforms.tsx index e28ef10b174841..92763b18623c46 100644 --- a/apps/web/pages/settings/admin/workspace-platforms.tsx +++ b/apps/web/pages/settings/admin/workspace-platforms.tsx @@ -49,8 +49,8 @@ const WorkspacePlatformsPage = () => { const [isDialogOpen, setIsDialogOpen] = useState(false); const [editing, setEditing] = useState< - { platform: WorkspacePlatform; editType: EditType } | { platform: null; editType: null } - >({ platform: null, editType: null }); + { platform: WorkspacePlatform; editType: EditType } | { platform: null; editType: EditType } + >({ platform: null, editType: "meta" }); const utils = trpc.useUtils(); const { data: workspacePlatforms, isPending, error } = trpc.viewer.admin.workspacePlatform.list.useQuery(); @@ -102,7 +102,7 @@ const WorkspacePlatformsPage = () => { ); function handleAdd() { - setEditing({ platform: null, editType: null }); + setEditing({ platform: null, editType: "meta" }); setIsDialogOpen(true); } diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index aaa158b3545f30..36fb5fdb47c8a4 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2647,6 +2647,7 @@ "add_domain_wide_delegation": "Add domain-wide delegation", "edit_domain_wide_delegation": "Edit domain-wide delegation", "domain": "Domain", + "no_workspace_platforms": "No workspace platforms", "workspace_platform": "Workspace platform", "workspace_platforms": "Workspace platforms", "workspace_platforms_description": "Manage workspace platforms that can be used for domain-wide delegation", From 78c3e67c697276564e2dc41bc33febafd609e590 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Thu, 21 Nov 2024 16:01:46 +0530 Subject: [PATCH 12/61] refactor: improvements --- .../settings/admin/workspace-platforms.tsx | 2 +- .../googlecalendar/lib/CalendarService.ts | 60 ++++++++++++------- .../pages/settings/domainWideDelegation.tsx | 6 +- .../20241121091453_add_dwd/migration.sql | 29 +++++++++ packages/prisma/schema.prisma | 50 ++++++++-------- packages/prisma/zod-utils.ts | 9 +++ .../viewer/domainWideDelegation/utils.ts | 8 ++- 7 files changed, 115 insertions(+), 49 deletions(-) create mode 100644 packages/prisma/migrations/20241121091453_add_dwd/migration.sql diff --git a/apps/web/pages/settings/admin/workspace-platforms.tsx b/apps/web/pages/settings/admin/workspace-platforms.tsx index 92763b18623c46..111a6d954852e0 100644 --- a/apps/web/pages/settings/admin/workspace-platforms.tsx +++ b/apps/web/pages/settings/admin/workspace-platforms.tsx @@ -322,7 +322,7 @@ function CreatePlatformDialog({ isOpen, onOpenChange }: Pick - +
    diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 4219de54f18187..a744aa48e0d7f0 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -11,7 +11,12 @@ import dayjs from "@calcom/dayjs"; import { CalendarCache } from "@calcom/features/calendar-cache/calendar-cache"; import type { FreeBusyArgs } from "@calcom/features/calendar-cache/calendar-cache.repository.interface"; import { getLocation, getRichDescription } from "@calcom/lib/CalEventParser"; -import { CalendarAppDomainWideDelegationClientIdNotAuthorizedError, CalendarAppDomainWideDelegationNotSetupError, CalendarAppDomainWideDelegationInvalidGrantError, CalendarAppDomainWideDelegationError } from "@calcom/lib/CalendarAppError"; +import { + CalendarAppDomainWideDelegationClientIdNotAuthorizedError, + CalendarAppDomainWideDelegationNotSetupError, + CalendarAppDomainWideDelegationInvalidGrantError, + CalendarAppDomainWideDelegationError, +} from "@calcom/lib/CalendarAppError"; import type CalendarService from "@calcom/lib/CalendarService"; import { APP_CREDENTIAL_SHARING_ENABLED, @@ -165,7 +170,13 @@ export default class GoogleCalendarService implements Calendar { }; }; - private getAuthedCalendarFromDomainWideDelegation = async () => { + private getAuthedCalendarFromDomainWideDelegation = async ({ + forceEnableDomainWideDelegation, + }: { + forceEnableDomainWideDelegation?: boolean; + }) => { + if (!this.credential.delegatedToId) return null; + const user = this.credential.delegatedToId; //TODO: Compute it once and save it @@ -173,14 +184,16 @@ export default class GoogleCalendarService implements Calendar { await DomainWideDelegationRepository.findByIdIncludeSensitiveServiceAccountKey({ id: this.credential.delegatedToId, }); - if (this.credential.delegatedToId && !domainWideDelegation) { - this.log.error("CalendarAppDomainWideDelegationNotSetupError", safeStringify({ - domainWideDelegationExists: !!domainWideDelegation, - domainWideDelegationEnabled: domainWideDelegation?.enabled, - forceEnableDomainWideDelegation, - })); + this.log.error( + "CalendarAppDomainWideDelegationNotSetupError", + safeStringify({ + domainWideDelegationExists: !!domainWideDelegation, + domainWideDelegationEnabled: domainWideDelegation?.enabled, + forceEnableDomainWideDelegation, + }) + ); throw new CalendarAppDomainWideDelegationNotSetupError( "Credential needs domain wide delegation to be setup and enabled" ); @@ -192,10 +205,11 @@ export default class GoogleCalendarService implements Calendar { this.log.error("No email to impersonate found for domain wide delegation"); return null; } - + + // TODO: parse service account key const authClient = new JWT({ - email: domainWideDelegation.serviceAccountKey.client_email, - key: domainWideDelegation.serviceAccountKey.private_key, + email: domainWideDelegation?.serviceAccountKey?.client_email, + key: domainWideDelegation?.serviceAccountKey?.private_key, scopes: ["https://www.googleapis.com/auth/calendar"], subject: emailToImpersonate, }); @@ -204,26 +218,28 @@ export default class GoogleCalendarService implements Calendar { await authClient.authorize(); } catch (error) { this.log.error("Error authorizing domain wide delegation", JSON.stringify(error)); - + if ((error as any).response?.data?.error === "unauthorized_client") { throw new CalendarAppDomainWideDelegationClientIdNotAuthorizedError( "Make sure that the Client ID for the domain wide delegation is added to the Google Workspace Admin Console" ); } - - if (error.response?.data?.error === "invalid_grant") { - throw new CalendarAppDomainWideDelegationInvalidGrantError("User might not exist in Google Workspace"); + + if ((error as any).response?.data?.error === "invalid_grant") { + throw new CalendarAppDomainWideDelegationInvalidGrantError( + "User might not exist in Google Workspace" + ); } // Catch all error throw new CalendarAppDomainWideDelegationError("Error authorizing domain wide delegation"); } - + this.log.debug( "Using domain wide delegation with service account email", safeStringify({ - serviceAccountEmail: domainWideDelegation.serviceAccountKey.client_email, - clientId: domainWideDelegation.serviceAccountKey.client_id, + serviceAccountEmail: domainWideDelegation?.serviceAccountKey?.client_email, + clientId: domainWideDelegation?.serviceAccountKey?.client_id, emailToImpersonate, }) ); @@ -249,8 +265,12 @@ export default class GoogleCalendarService implements Calendar { return null; }; - public authedCalendar = async ({ forceEnableDomainWideDelegation = false }: { forceEnableDomainWideDelegation?: boolean } = {}) => { - const authedCalendarFromDomainWideDelegation = await this.getAuthedCalendarFromDomainWideDelegation({ forceEnableDomainWideDelegation }); + public authedCalendar = async ({ + forceEnableDomainWideDelegation = false, + }: { forceEnableDomainWideDelegation?: boolean } = {}) => { + const authedCalendarFromDomainWideDelegation = await this.getAuthedCalendarFromDomainWideDelegation({ + forceEnableDomainWideDelegation, + }); if (authedCalendarFromDomainWideDelegation) { return authedCalendarFromDomainWideDelegation; } diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx index 7c5d12c22aec61..05ce2d21067a5d 100644 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -56,7 +56,7 @@ function DelegationListItemActions({ onDelete, }: { delegation: DelegationItemProps["delegation"]; - toggleDelegation: DelegationItemProps["toggleDelegation"] + toggleDelegation: DelegationItemProps["toggleDelegation"]; onEdit: (delegation: DelegationItemProps["delegation"]) => void; onDelete: (id: string) => void; }) { @@ -134,7 +134,7 @@ function CreateDelegationDialog({ return ( - + @@ -305,6 +305,8 @@ function DomainWideDelegationList() { const { data: workspacePlatforms, isLoading: isLoadingWorkspacePlatforms } = trpc.viewer.domainWideDelegation.listWorkspacePlatforms.useQuery(); + console.log("workspacePlatforms", workspacePlatforms); + const onEditClick = (delegation: DelegationItemProps["delegation"]) => { setCreateEditDialog({ isOpen: true, delegation }); }; diff --git a/packages/prisma/migrations/20241121091453_add_dwd/migration.sql b/packages/prisma/migrations/20241121091453_add_dwd/migration.sql new file mode 100644 index 00000000000000..51345045b3f3df --- /dev/null +++ b/packages/prisma/migrations/20241121091453_add_dwd/migration.sql @@ -0,0 +1,29 @@ +/* + Warnings: + + - You are about to drop the column `inErrorState` on the `DomainWideDelegation` table. All the data in the column will be lost. + - You are about to drop the column `serviceAccountClientId` on the `DomainWideDelegation` table. All the data in the column will be lost. + - You are about to drop the column `defaultServiceAccountClientId` on the `WorkspacePlatform` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "DomainWideDelegation_domain_key"; + +-- AlterTable +ALTER TABLE "DestinationCalendar" ADD COLUMN "domainWideDelegationCredentialId" TEXT; + +-- AlterTable +ALTER TABLE "DomainWideDelegation" DROP COLUMN "inErrorState", +DROP COLUMN "serviceAccountClientId"; + +-- AlterTable +ALTER TABLE "SelectedCalendar" ADD COLUMN "domainWideDelegationCredentialId" TEXT; + +-- AlterTable +ALTER TABLE "WorkspacePlatform" DROP COLUMN "defaultServiceAccountClientId"; + +-- AddForeignKey +ALTER TABLE "DestinationCalendar" ADD CONSTRAINT "DestinationCalendar_domainWideDelegationCredentialId_fkey" FOREIGN KEY ("domainWideDelegationCredentialId") REFERENCES "DomainWideDelegation"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SelectedCalendar" ADD CONSTRAINT "SelectedCalendar_domainWideDelegationCredentialId_fkey" FOREIGN KEY ("domainWideDelegationCredentialId") REFERENCES "DomainWideDelegation"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 9197cb3f33053c..bfa502dc8fdaec 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -212,20 +212,21 @@ enum IdentityProvider { } model DestinationCalendar { - id Int @id @default(autoincrement()) - integration String - externalId String + id Int @id @default(autoincrement()) + integration String + externalId String /// @zod.custom(imports.emailSchema) - primaryEmail String? - user User? @relation(fields: [userId], references: [id], onDelete: Cascade) - userId Int? @unique - booking Booking[] - eventType EventType? @relation(fields: [eventTypeId], references: [id], onDelete: Cascade) - eventTypeId Int? @unique - credentialId Int? - credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade) - domainWideDelegation DomainWideDelegation? @relation(fields: [domainWideDelegationCredentialId], references: [id], onDelete: Cascade) + primaryEmail String? + user User? @relation(fields: [userId], references: [id], onDelete: Cascade) + userId Int? @unique + booking Booking[] + eventType EventType? @relation(fields: [eventTypeId], references: [id], onDelete: Cascade) + eventTypeId Int? @unique + credentialId Int? + credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade) + domainWideDelegation DomainWideDelegation? @relation(fields: [domainWideDelegationCredentialId], references: [id], onDelete: Cascade) domainWideDelegationCredentialId String? + @@index([userId]) @@index([eventTypeId]) @@index([credentialId]) @@ -691,18 +692,18 @@ model Availability { } model SelectedCalendar { - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - userId Int - integration String - externalId String - credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade) - credentialId Int? + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId Int + integration String + externalId String + credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade) + credentialId Int? // Used to identify a watched calendar channel in Google Calendar - googleChannelId String? @unique - googleChannelKind String? - googleChannelResourceId String? - googleChannelResourceUri String? - googleChannelExpiration String? + googleChannelId String? @unique + googleChannelKind String? + googleChannelResourceId String? + googleChannelResourceUri String? + googleChannelExpiration String? domainWideDelegationCredential DomainWideDelegation? @relation(fields: [domainWideDelegationCredentialId], references: [id], onDelete: Cascade) domainWideDelegationCredentialId String? @@ -1632,7 +1633,7 @@ model DomainWideDelegation { @@unique([organizationId, domain]) } -// It is for domain-wide delegation +// It is for domain-wide delegation model WorkspacePlatform { id Int @id @default(autoincrement()) @@ -1644,6 +1645,7 @@ model WorkspacePlatform { description String + /// @zod.custom(imports.serviceAccountKeySchema) defaultServiceAccountKey Json createdAt DateTime @default(now()) diff --git a/packages/prisma/zod-utils.ts b/packages/prisma/zod-utils.ts index 58c97fee790c89..c956964207a061 100644 --- a/packages/prisma/zod-utils.ts +++ b/packages/prisma/zod-utils.ts @@ -757,3 +757,12 @@ export const bookingSeatDataSchema = z.object({ description: z.string().optional(), responses: bookingResponses, }); + +export const serviceAccountKeySchema = z + .object({ + type: z.string(), + client_id: z.string(), + client_email: z.string(), + private_key: z.string(), + }) + .passthrough(); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts index 03be51aeb7ec1e..884f6b51ce5268 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/utils.ts @@ -1,9 +1,11 @@ import { z } from "zod"; +import logger from "@calcom/lib/logger"; +import { safeStringify } from "@calcom/lib/safeStringify"; import type { Prisma } from "@calcom/prisma/client"; import { TRPCError } from "@trpc/server"; -import logger from "@calcom/lib/logger"; + const log = logger.getSubLogger({ prefix: ["domainWideDelegation/utils"] }); export class InvalidServiceAccountKeyError extends Error { constructor(message: string) { @@ -53,7 +55,9 @@ export const handleDomainWideDelegationError = (error: unknown) => { }); }; -export const ensureNoServiceAccountKey = (domainWideDelegation: T) => { +export const ensureNoServiceAccountKey = ( + domainWideDelegation: T +) => { const { serviceAccountKey: _1, ...rest } = domainWideDelegation; return { ...rest, From 94eb887b83daf607028fb2c8564cf7748dc39e8c Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 22 Nov 2024 15:08:56 +0530 Subject: [PATCH 13/61] refactor: bug fixes and improvements --- .../settings/admin/workspace-platforms.tsx | 41 ++++++- apps/web/public/static/locales/en/common.json | 4 +- .../getAllCredentials.ts | 15 ++- .../domainWideDelegation/clientAndServer.ts | 6 +- packages/lib/domainWideDelegation/server.ts | 108 ++++++++++++------ .../lib/getConnectedDestinationCalendars.ts | 20 ++-- packages/lib/server/getUsersCredentials.ts | 11 +- .../server/repository/domainWideDelegation.ts | 4 +- .../server/repository/workspacePlatform.ts | 22 ++-- packages/prisma/zod-utils.ts | 2 + .../viewer/admin/workspacePlatform/schema.ts | 6 +- .../updateServiceAccount.handler.ts | 1 + 12 files changed, 163 insertions(+), 77 deletions(-) diff --git a/apps/web/pages/settings/admin/workspace-platforms.tsx b/apps/web/pages/settings/admin/workspace-platforms.tsx index 111a6d954852e0..c6410f94722aa3 100644 --- a/apps/web/pages/settings/admin/workspace-platforms.tsx +++ b/apps/web/pages/settings/admin/workspace-platforms.tsx @@ -1,10 +1,13 @@ "use client"; +import { zodResolver } from "@hookform/resolvers/zod"; import { useState } from "react"; import type { SubmitHandler } from "react-hook-form"; import { useForm, useFormContext } from "react-hook-form"; +import { z } from "zod"; import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { serviceAccountKeySchema } from "@calcom/prisma/zod-utils"; import { trpc, type RouterOutputs } from "@calcom/trpc"; import { Button, @@ -213,7 +216,12 @@ function UpdateServiceAccountFieldsDialog({ const { t } = useLocale(); const utils = trpc.useUtils(); type FormValues = { defaultServiceAccountKey: string }; - const form = useForm(); + const form = useForm({ + defaultValues: { + defaultServiceAccountKey: "", + }, + resolver: zodResolver(z.object({ defaultServiceAccountKey: z.string() })), + }); const updateServiceAccountMutation = trpc.viewer.admin.workspacePlatform.updateServiceAccount.useMutation({ onSuccess: () => { @@ -227,7 +235,17 @@ function UpdateServiceAccountFieldsDialog({ }); const onSubmit: SubmitHandler = (values) => { - updateServiceAccountMutation.mutate({ id: platformId, ...values }); + const parsedKey = JSON.parse(values.defaultServiceAccountKey); + const validatedKey = serviceAccountKeySchema.safeParse(parsedKey); + if (!validatedKey.success) { + form.setError("defaultServiceAccountKey", { message: t("invalid_service_account_key") }); + return; + } + updateServiceAccountMutation.mutate({ + id: platformId, + ...values, + defaultServiceAccountKey: validatedKey.data, + }); }; return ( @@ -301,6 +319,14 @@ function CreatePlatformDialog({ isOpen, onOpenChange }: Pick = (values) => { - addMutation.mutate(values); + const parsedKey = JSON.parse(values.defaultServiceAccountKey); + const validatedKey = serviceAccountKeySchema.safeParse(parsedKey); + if (!validatedKey.success) { + form.setError("defaultServiceAccountKey", { message: t("invalid_service_account_key") }); + return; + } + addMutation.mutate({ + ...values, + defaultServiceAccountKey: validatedKey.data, + }); }; return ( diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 1c626ce40e7314..4c4f3cd9bc12e6 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2695,8 +2695,8 @@ "edit_service_account": "Edit service account", "add_workspace_platform": "Add workspace platform", "slug": "Slug", - "service_account_key": "Service account key", - "edit_service_account_key": "Edit service account key", + "service_account_key": "Service account key JSON", + "edit_service_account_key": "Edit service account key JSON", "domain_wide_delegation_restricts_adding_more_than_one_installation": "Domain-wide delegation restricts adding more than one installation", "app_successfully_installed_and_is_using_delegated_credentials": "App successfully installed and is using delegated credentials", "matching_members": "Matching members", diff --git a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts index 67c31450f64f24..e2f40c607bd76a 100644 --- a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts +++ b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts @@ -1,17 +1,18 @@ import type z from "zod"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import { UserRepository } from "@calcom/lib/server/repository/user"; import prisma from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import type { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import type { CredentialPayload } from "@calcom/types/Credential"; -import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; + /** * Gets credentials from the user, team, and org if applicable * */ export const getAllCredentials = async ( - user: { id: number; username: string | null; email: string ; credentials: CredentialPayload[] }, + user: { id: number; username: string | null; email: string; credentials: CredentialPayload[] }, eventType: { userId?: number | null; team?: { id: number | null; parentId: number | null } | null; @@ -117,8 +118,10 @@ export const getAllCredentials = async ( } }); - const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({user: { - email: user.email, - }}); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ + user: { + email: user.email, + }, + }); return allCredentials.concat(domainWideDelegationCredentials); -}; \ No newline at end of file +}; diff --git a/packages/lib/domainWideDelegation/clientAndServer.ts b/packages/lib/domainWideDelegation/clientAndServer.ts index 79939153760419..b9206c14f07d8a 100644 --- a/packages/lib/domainWideDelegation/clientAndServer.ts +++ b/packages/lib/domainWideDelegation/clientAndServer.ts @@ -1,4 +1,4 @@ -export function isDomainWideDelegationCredential({ credentialId }: { credentialId: number }) { - // Though it is set as -1 right now, but we might want to set it to some other negative value. - return credentialId < 0; +export function isDomainWideDelegationCredential({ credentialId }: { credentialId?: number }) { + // Though it is set as -1 right now, but we might want to set it to some other negative value. + return !!credentialId && credentialId < 0; } diff --git a/packages/lib/domainWideDelegation/server.ts b/packages/lib/domainWideDelegation/server.ts index e80e51aa857dda..2da82f1bbe8a70 100644 --- a/packages/lib/domainWideDelegation/server.ts +++ b/packages/lib/domainWideDelegation/server.ts @@ -1,17 +1,16 @@ -import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; -import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; -import logger from "@calcom/lib/logger"; +import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; import { metadata as googleCalendarMetadata } from "@calcom/app-store/googlecalendar/_metadata"; import { metadata as googleMeetMetadata } from "@calcom/app-store/googlevideo/_metadata"; -import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; +import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; -import { defaultVideoAppCategories } from "@calcom/app-store/utils"; +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; +import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; const log = logger.getSubLogger({ prefix: ["lib/domainWideDelegation/server"] }); interface DomainWideDelegation { id: string; workspacePlatform: { - slug: string + slug: string; }; } @@ -20,7 +19,6 @@ interface User { id: number; } - const buildDomainWideDelegationCalendarCredential = ({ domainWideDelegation, user, @@ -73,55 +71,77 @@ const buildDomainWideDelegationConferencingCredential = ({ }, invalid: false, teamId: null, - } -} -export async function getAllDomainWideDelegationCredentialsForUser({ user }: { user: { email: string; id: number } }) { - const log = logger.getSubLogger({ prefix: ["getAllDomainWideDelegationCredentialsForUser"] }); + }; +}; +export async function getAllDomainWideDelegationCredentialsForUser({ + user, +}: { + user: { email: string; id: number }; +}) { log.debug("called with", { user }); - console.trace('tracing') - const domainWideDelegation = await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ - user: { - email: user.email, - }, - }); + const domainWideDelegation = + await DomainWideDelegationRepository.findByUserIncludeSensitiveServiceAccountKey({ + user: { + email: user.email, + }, + }); if (!domainWideDelegation || !domainWideDelegation.enabled) { return []; } - const workspacePlatforms = await WorkspacePlatformRepository.findAll(); - - const domainWideDelegationCredentials = workspacePlatforms - .map((workspacePlatform) => { - if (workspacePlatform.slug !== domainWideDelegation.workspacePlatform.slug) { - return null; - } + const workspacePlatform = await WorkspacePlatformRepository.findBySlug({ + slug: domainWideDelegation.workspacePlatform.slug, + }); - return [ + const domainWideDelegationCredentials = !!workspacePlatform + ? [ buildDomainWideDelegationCalendarCredential({ domainWideDelegation, user }), - buildDomainWideDelegationConferencingCredential({ domainWideDelegation, user }) - ]; - }) - .flat() - .filter((credential): credential is NonNullable => credential !== null); + buildDomainWideDelegationConferencingCredential({ domainWideDelegation, user }), + ] + .flat() + .filter((credential): credential is NonNullable => credential !== null) + : []; log.debug("Returned", { domainWideDelegationCredentials }); + console.log("domainWideDelegationCredentials", domainWideDelegationCredentials); return domainWideDelegationCredentials; } -export async function getAllDomainWideDelegationCalendarCredentialsForUser({ user }: { user: { email: string; id: number } }) { +export async function getAllDomainWideDelegationCalendarCredentialsForUser({ + user, +}: { + user: { email: string; id: number }; +}) { const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); return domainWideDelegationCredentials.filter((credential) => credential.type.endsWith("_calendar")); } -export async function getAllDomainWideDelegationConferencingCredentialsForUser({ user }: { user: { email: string; id: number } }) { +export async function getAllDomainWideDelegationConferencingCredentialsForUser({ + user, +}: { + user: { email: string; id: number }; +}) { const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); - return domainWideDelegationCredentials.filter((credential) => credential.type.endsWith("_video") || credential.type.endsWith("_conferencing") || credential.type.endsWith("_messaging")); + return domainWideDelegationCredentials.filter( + (credential) => + credential.type.endsWith("_video") || + credential.type.endsWith("_conferencing") || + credential.type.endsWith("_messaging") + ); } -export async function checkIfSuccessfullyConfiguredInWorkspace({ domainWideDelegation, user }: { domainWideDelegation: DomainWideDelegation; user: User }) { +export async function checkIfSuccessfullyConfiguredInWorkspace({ + domainWideDelegation, + user, +}: { + domainWideDelegation: DomainWideDelegation; + user: User; +}) { if (domainWideDelegation.workspacePlatform.slug === "google") { - const googleCalendar = await getCalendar(buildDomainWideDelegationCalendarCredential({ domainWideDelegation, user })); + const googleCalendar = await getCalendar( + buildDomainWideDelegationCalendarCredential({ domainWideDelegation, user }) + ); if (!googleCalendar) { throw new Error("Google Calendar App not found"); } @@ -130,12 +150,24 @@ export async function checkIfSuccessfullyConfiguredInWorkspace({ domainWideDeleg return false; } -export async function getAllDomainWideDelegationCredentialsForUserByAppType({ user, appType }: { user: User, appType: string }) { +export async function getAllDomainWideDelegationCredentialsForUserByAppType({ + user, + appType, +}: { + user: User; + appType: string; +}) { const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); return domainWideDelegationCredentials.filter((credential) => credential.type === appType); } -export async function getAllDomainWideDelegationCredentialsForUserByAppSlug({ user, appSlug }: { user: User, appSlug: string }) { +export async function getAllDomainWideDelegationCredentialsForUserByAppSlug({ + user, + appSlug, +}: { + user: User; + appSlug: string; +}) { const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); return domainWideDelegationCredentials.filter((credential) => credential.appId === appSlug); -} \ No newline at end of file +} diff --git a/packages/lib/getConnectedDestinationCalendars.ts b/packages/lib/getConnectedDestinationCalendars.ts index e7511e0fc4ed7e..f7402e19d2083f 100644 --- a/packages/lib/getConnectedDestinationCalendars.ts +++ b/packages/lib/getConnectedDestinationCalendars.ts @@ -1,10 +1,10 @@ import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager"; +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; +import { getAllDomainWideDelegationCalendarCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import type { PrismaClient } from "@calcom/prisma"; import type { DestinationCalendar, SelectedCalendar, User } from "@calcom/prisma/client"; import { AppCategories } from "@calcom/prisma/enums"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; -import { getAllDomainWideDelegationCalendarCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; -import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; export type UserWithCalendars = Pick & { selectedCalendars: Pick[]; @@ -29,7 +29,9 @@ export async function getConnectedDestinationCalendars( select: credentialForCalendarServiceSelect, }); - const domainWideDelegationCredentials = await getAllDomainWideDelegationCalendarCredentialsForUser({ user }); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCalendarCredentialsForUser({ + user, + }); const allCredentials = [...userCredentials, ...domainWideDelegationCredentials]; // get user's credentials + their connected integrations @@ -88,11 +90,13 @@ export async function getConnectedDestinationCalendars( integration, externalId, primaryEmail, - ...(!isDomainWideDelegationCredential({ credentialId }) ? { - credentialId, - } : { - domainWideDelegationCredentialId, - }), + ...(!isDomainWideDelegationCredential({ credentialId }) + ? { + credentialId, + } + : { + domainWideDelegationCredentialId, + }), }, }); } else { diff --git a/packages/lib/server/getUsersCredentials.ts b/packages/lib/server/getUsersCredentials.ts index 89281cd7bf5dea..98968eb87f2ff1 100644 --- a/packages/lib/server/getUsersCredentials.ts +++ b/packages/lib/server/getUsersCredentials.ts @@ -1,9 +1,11 @@ import { prisma } from "@calcom/prisma"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; + import { getAllDomainWideDelegationCredentialsForUser } from "../domainWideDelegation/server"; + type SessionUser = NonNullable; -type User = { id: SessionUser["id"] }; +type User = { id: SessionUser["id"]; email: SessionUser["email"] }; export async function getUsersCredentials(user: User) { const credentials = await prisma.credential.findMany({ @@ -16,6 +18,11 @@ export async function getUsersCredentials(user: User) { }, }); - const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ + user: { + email: user.email, + id: user.id, + }, + }); return [...credentials, ...domainWideDelegationCredentials]; } diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index 48cc25e600b472..aec4d2f955f762 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -110,7 +110,7 @@ export class DomainWideDelegationRepository { select: domainWideDelegationSafeSelect, }); - return domainWideDelegation + return domainWideDelegation; } static async findByUserIncludeSensitiveServiceAccountKey({ @@ -125,6 +125,7 @@ export class DomainWideDelegationRepository { const organization = await OrganizationRepository.findByMemberEmailId({ email: user.email, }); + if (!organization) { log.debug("No organization found for user", safeStringify(user)); return null; @@ -163,7 +164,6 @@ export class DomainWideDelegationRepository { organizationId: number; }>; }) { - const { workspacePlatformId, organizationId, ...rest } = data; return await prisma.domainWideDelegation.update({ where: { id }, diff --git a/packages/lib/server/repository/workspacePlatform.ts b/packages/lib/server/repository/workspacePlatform.ts index cbbd076b55e144..1f6c6f9f80a92b 100644 --- a/packages/lib/server/repository/workspacePlatform.ts +++ b/packages/lib/server/repository/workspacePlatform.ts @@ -1,7 +1,8 @@ import type { Prisma } from "@prisma/client"; -import { z } from "zod"; import { prisma } from "@calcom/prisma"; +import type { TServiceAccountKeySchema } from "@calcom/prisma/zod-utils"; +import { serviceAccountKeySchema } from "@calcom/prisma/zod-utils"; const safeWorkspacePlatformSelect = { id: true, @@ -16,14 +17,6 @@ const workspacePlatformSelectWithServiceAccountKey = { defaultServiceAccountKey: true, }; -const serviceAccountKeySchema = z - .object({ - client_email: z.string(), - private_key: z.string(), - client_id: z.string(), - }) - .passthrough(); - export class WorkspacePlatformRepository { private static withParsedServiceAccountKey( data: T @@ -38,7 +31,7 @@ export class WorkspacePlatformRepository { slug: string; name: string; description: string; - defaultServiceAccountKey: string; + defaultServiceAccountKey: TServiceAccountKeySchema; enabled: boolean; }) { return await prisma.workspacePlatform.create({ @@ -53,6 +46,13 @@ export class WorkspacePlatformRepository { }); } + static async findAllBySlug({ slug }: { slug: string }) { + return await prisma.workspacePlatform.findMany({ + where: { slug }, + select: safeWorkspacePlatformSelect, + }); + } + static async findBySlug({ slug }: { slug: string }) { return await prisma.workspacePlatform.findUnique({ where: { slug }, @@ -80,7 +80,7 @@ export class WorkspacePlatformRepository { slug: string; name: string; description: string; - defaultServiceAccountKey: string; + defaultServiceAccountKey: TServiceAccountKeySchema; enabled: boolean; }>; }) { diff --git a/packages/prisma/zod-utils.ts b/packages/prisma/zod-utils.ts index c956964207a061..fee4d2374c577c 100644 --- a/packages/prisma/zod-utils.ts +++ b/packages/prisma/zod-utils.ts @@ -766,3 +766,5 @@ export const serviceAccountKeySchema = z private_key: z.string(), }) .passthrough(); + +export type TServiceAccountKeySchema = z.infer; diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts index 01181e8b134782..bed4ef7649c927 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/schema.ts @@ -1,10 +1,12 @@ import { z } from "zod"; +import { serviceAccountKeySchema } from "@calcom/prisma/zod-utils"; + export const workspacePlatformCreateSchema = z.object({ slug: z.string().min(1), name: z.string().min(1), description: z.string().min(1), - defaultServiceAccountKey: z.string(), + defaultServiceAccountKey: serviceAccountKeySchema, enabled: z.boolean().optional().default(true), }); @@ -16,7 +18,7 @@ export const workspacePlatformUpdateSchema = z.object({ export const workspacePlatformUpdateServiceAccountSchema = z.object({ id: z.number(), - defaultServiceAccountKey: z.string(), + defaultServiceAccountKey: serviceAccountKeySchema, }); export const workspacePlatformToggleEnabledSchema = z.object({ diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts index fd7516b3cd83bc..bc6948b0d95f80 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/updateServiceAccount.handler.ts @@ -6,6 +6,7 @@ import { TRPCError } from "@trpc/server"; import type { workspacePlatformUpdateServiceAccountSchema } from "./schema"; import { ensureNoServiceAccountKey } from "./utils"; + export default async function updateServiceAccountHandler({ input, }: { From 571d19b375038be24d669dc3d76a0b17f624318b Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 22 Nov 2024 19:18:14 +0530 Subject: [PATCH 14/61] fix: type errors --- packages/app-store/_appRegistry.ts | 8 ++--- packages/app-store/applecalendar/api/add.ts | 1 + packages/app-store/caldavcalendar/api/add.ts | 1 + .../dailyvideo/lib/VideoApiAdapter.ts | 1 + .../app-store/exchange2013calendar/api/add.ts | 1 + .../app-store/exchange2016calendar/api/add.ts | 1 + .../exchangecalendar/api/_postAdd.ts | 1 + .../googlecalendar/lib/CalendarService.ts | 9 ++---- .../app-store/ics-feedcalendar/api/add.ts | 1 + .../lib/VideoApiAdapter.test.ts | 1 + packages/app-store/server.ts | 9 +++--- packages/app-store/utils.ts | 1 + packages/core/videoClient.ts | 9 ++++++ .../getAllCredentials.ts | 1 + .../features/calendars/CalendarSwitch.tsx | 17 ++++++++--- .../lib/apps/getEnabledAppsFromCredentials.ts | 20 +++++++------ packages/lib/buildCalEventFromBooking.ts | 1 + packages/lib/domainWideDelegation/server.ts | 4 ++- packages/lib/server/getDefaultLocations.ts | 1 + .../server/repository/domainWideDelegation.ts | 10 +++---- packages/prisma/schema.prisma | 1 + packages/prisma/selects/credential.ts | 1 + .../appCredentialsByType.handler.ts | 5 ++++ .../loggedInViewer/integrations.handler.ts | 12 ++++++-- .../setDestinationCalendar.handler.ts | 30 +++++++++++-------- .../availability/calendarOverlay.handler.ts | 1 + .../viewer/bookings/editLocation.handler.ts | 2 +- .../domainWideDelegation/list.handler.ts | 16 +++++----- .../toggleEnabled.handler.ts | 7 ++--- .../viewer/eventTypes/create.handler.ts | 1 + .../viewer/eventTypes/update.handler.ts | 1 + packages/types/Calendar.d.ts | 5 ++-- packages/types/Credential.d.ts | 4 +-- 33 files changed, 116 insertions(+), 68 deletions(-) diff --git a/packages/app-store/_appRegistry.ts b/packages/app-store/_appRegistry.ts index 5c2611898be3ec..808222771bd3c5 100644 --- a/packages/app-store/_appRegistry.ts +++ b/packages/app-store/_appRegistry.ts @@ -1,12 +1,12 @@ import { appStoreMetadata } from "@calcom/app-store/appStoreMetaData"; import { getAppFromSlug } from "@calcom/app-store/utils"; import getInstallCountPerApp from "@calcom/lib/apps/getInstallCountPerApp"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import type { UserAdminTeams } from "@calcom/lib/server/repository/user"; import prisma, { safeAppSelect, safeCredentialSelect } from "@calcom/prisma"; import { userMetadata } from "@calcom/prisma/zod-utils"; import type { AppFrontendPayload as App } from "@calcom/types/App"; import type { CredentialFrontendPayload as Credential } from "@calcom/types/Credential"; -import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; export type TDependencyData = { name?: string; @@ -81,7 +81,6 @@ export async function getAppRegistryWithCredentials(userId: number, userAdminTea }, }); - const user = await prisma.user.findUnique({ where: { id: userId, @@ -93,8 +92,9 @@ export async function getAppRegistryWithCredentials(userId: number, userAdminTea }, }); - - const domainWideDelegationCredentials = user ? await getAllDomainWideDelegationCredentialsForUser({ user: {id:userId, email: user.email} }) : []; + const domainWideDelegationCredentials = user + ? await getAllDomainWideDelegationCredentialsForUser({ user: { id: userId, email: user.email } }) + : []; const usersDefaultApp = userMetadata.parse(user?.metadata)?.defaultConferencingApp?.appSlug; const apps = [] as (App & { diff --git a/packages/app-store/applecalendar/api/add.ts b/packages/app-store/applecalendar/api/add.ts index c3335040fa9dab..eb329334291b81 100644 --- a/packages/app-store/applecalendar/api/add.ts +++ b/packages/app-store/applecalendar/api/add.ts @@ -53,6 +53,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) teamId: null, appId: "apple-calendar", invalid: false, + delegatedToId: null, }; try { diff --git a/packages/app-store/caldavcalendar/api/add.ts b/packages/app-store/caldavcalendar/api/add.ts index f0eca3987853b5..0c3f2f5def4ba3 100644 --- a/packages/app-store/caldavcalendar/api/add.ts +++ b/packages/app-store/caldavcalendar/api/add.ts @@ -31,6 +31,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) teamId: null, appId: "caldav-calendar", invalid: false, + delegatedToId: null, }; try { diff --git a/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts b/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts index 4d694c640b09e5..7ee129167aa913 100644 --- a/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts +++ b/packages/app-store/dailyvideo/lib/VideoApiAdapter.ts @@ -52,6 +52,7 @@ export const FAKE_DAILY_CREDENTIAL: CredentialPayload & { invalid: boolean } = { appId: "daily-video", invalid: false, teamId: null, + delegatedToId: null, }; function postToDailyAPI(endpoint: string, body: Record) { diff --git a/packages/app-store/exchange2013calendar/api/add.ts b/packages/app-store/exchange2013calendar/api/add.ts index f41a3f8a922359..7fec107b2f92e8 100644 --- a/packages/app-store/exchange2013calendar/api/add.ts +++ b/packages/app-store/exchange2013calendar/api/add.ts @@ -37,6 +37,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) { teamId: null, appId: "exchange2013-calendar", invalid: false, + delegatedToId: null, }; try { diff --git a/packages/app-store/exchange2016calendar/api/add.ts b/packages/app-store/exchange2016calendar/api/add.ts index c8509a1ee7636d..aafb787e5e3faa 100644 --- a/packages/app-store/exchange2016calendar/api/add.ts +++ b/packages/app-store/exchange2016calendar/api/add.ts @@ -37,6 +37,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) { teamId: null, appId: "exchange2016-calendar", invalid: false, + delegatedToId: null, }; try { diff --git a/packages/app-store/exchangecalendar/api/_postAdd.ts b/packages/app-store/exchangecalendar/api/_postAdd.ts index 0a7709f4e2a44a..9ab5efbe54a58a 100644 --- a/packages/app-store/exchangecalendar/api/_postAdd.ts +++ b/packages/app-store/exchangecalendar/api/_postAdd.ts @@ -34,6 +34,7 @@ export async function getHandler(req: NextApiRequest, res: NextApiResponse) { teamId: null, appId: "exchange", invalid: false, + delegatedToId: null, }; try { diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index a744aa48e0d7f0..52e12b2ae2584f 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -189,9 +189,7 @@ export default class GoogleCalendarService implements Calendar { this.log.error( "CalendarAppDomainWideDelegationNotSetupError", safeStringify({ - domainWideDelegationExists: !!domainWideDelegation, - domainWideDelegationEnabled: domainWideDelegation?.enabled, - forceEnableDomainWideDelegation, + domainWideDelegation, }) ); throw new CalendarAppDomainWideDelegationNotSetupError( @@ -251,10 +249,7 @@ export default class GoogleCalendarService implements Calendar { this.log.debug( "Not using domain wide delegation, using default OAuth2 client for Google Calendar", safeStringify({ - domainWideDelegation: { - enabled: domainWideDelegation?.enabled, - }, - serviceAccountKeyIsSet: !!domainWideDelegation?.serviceAccountKey, + domainWideDelegation, credential: { id: this.credential.id, userId: this.credential.userId, diff --git a/packages/app-store/ics-feedcalendar/api/add.ts b/packages/app-store/ics-feedcalendar/api/add.ts index 626a838206aa76..5ad804f1dc8119 100644 --- a/packages/app-store/ics-feedcalendar/api/add.ts +++ b/packages/app-store/ics-feedcalendar/api/add.ts @@ -29,6 +29,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) teamId: null, appId: appConfig.slug, invalid: false, + delegatedToId: null, }; try { diff --git a/packages/app-store/office365video/lib/VideoApiAdapter.test.ts b/packages/app-store/office365video/lib/VideoApiAdapter.test.ts index 413968be3c4d3e..b0cccbbb40cc04 100644 --- a/packages/app-store/office365video/lib/VideoApiAdapter.test.ts +++ b/packages/app-store/office365video/lib/VideoApiAdapter.test.ts @@ -54,6 +54,7 @@ const testCredential = { userId: 1, user: { email: "example@cal.com" }, teamId: 1, + delegatedToId: null, }; describe("createMeeting", () => { diff --git a/packages/app-store/server.ts b/packages/app-store/server.ts index 47f5489ca79034..dd49772b0721d9 100644 --- a/packages/app-store/server.ts +++ b/packages/app-store/server.ts @@ -3,12 +3,13 @@ import type { TFunction } from "next-i18next"; import { defaultVideoAppCategories } from "@calcom/app-store/utils"; import getEnabledAppsFromCredentials from "@calcom/lib/apps/getEnabledAppsFromCredentials"; +import { getAllDomainWideDelegationConferencingCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import { prisma } from "@calcom/prisma"; import { AppCategories } from "@calcom/prisma/enums"; import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; import { defaultLocations } from "./locations"; -import { getAllDomainWideDelegationConferencingCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; + export async function getLocationGroupedOptions( userOrTeamId: { userId: number } | { teamId: number }, t: TFunction @@ -80,13 +81,13 @@ export async function getLocationGroupedOptions( if (user) { const domainWideDelegationCredentials = await getAllDomainWideDelegationConferencingCredentialsForUser({ - user - }) + user, + }); credentials = [...credentials, ...domainWideDelegationCredentials]; } - const integrations = await getEnabledAppsFromCredentials(credentials, { filterOnCredentials: true }); + const integrations = await getEnabledAppsFromCredentials(credentials, { filterOnCredentials: true }); integrations.forEach((app) => { // All apps that are labeled as a locationOption are video apps. diff --git a/packages/app-store/utils.ts b/packages/app-store/utils.ts index 87c01f2ed02f6b..0025633089d8e7 100644 --- a/packages/app-store/utils.ts +++ b/packages/app-store/utils.ts @@ -68,6 +68,7 @@ function getApps(credentials: CredentialDataWithTeamName[], filterOnCredentials? team: { name: "Global", }, + delegatedToId: null, }; logger.debug( `${appMeta.type} is a global app, injecting credential`, diff --git a/packages/core/videoClient.ts b/packages/core/videoClient.ts index acb7aeecfce3ea..4b30e0442931c4 100644 --- a/packages/core/videoClient.ts +++ b/packages/core/videoClient.ts @@ -203,6 +203,7 @@ const createMeetingWithCalVideo = async (calEvent: CalendarEvent) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); return videoAdapter?.createMeeting(calEvent); @@ -225,6 +226,7 @@ export const createInstantMeetingWithCalVideo = async (endTime: string) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); return videoAdapter?.createInstantCalVideoRoom?.(endTime); @@ -250,6 +252,7 @@ const getRecordingsOfCalVideoByRoomName = async ( teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); return videoAdapter?.getRecordings?.(roomName); @@ -273,6 +276,7 @@ const getDownloadLinkOfCalVideoByRecordingId = async (recordingId: string) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); return videoAdapter?.getRecordingDownloadLink?.(recordingId); @@ -296,6 +300,7 @@ const getAllTranscriptsAccessLinkFromRoomName = async (roomName: string) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); return videoAdapter?.getAllTranscriptsAccessLinkFromRoomName?.(roomName); @@ -319,6 +324,7 @@ const getAllTranscriptsAccessLinkFromMeetingId = async (meetingId: string) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); return videoAdapter?.getAllTranscriptsAccessLinkFromMeetingId?.(meetingId); @@ -342,6 +348,7 @@ const submitBatchProcessorTranscriptionJob = async (recordingId: string) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); @@ -377,6 +384,7 @@ const getTranscriptsAccessLinkFromRecordingId = async (recordingId: string) => { teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); @@ -401,6 +409,7 @@ const checkIfRoomNameMatchesInRecording = async (roomName: string, recordingId: teamId: null, key: dailyAppKeys, invalid: false, + delegatedToId: null, }, ]); diff --git a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts index e2f40c607bd76a..75078772160cf9 100644 --- a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts +++ b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts @@ -121,6 +121,7 @@ export const getAllCredentials = async ( const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user: { email: user.email, + id: user.id, }, }); return allCredentials.concat(domainWideDelegationCredentials); diff --git a/packages/features/calendars/CalendarSwitch.tsx b/packages/features/calendars/CalendarSwitch.tsx index 82596eb8aaf608..cf1801d9a1464d 100644 --- a/packages/features/calendars/CalendarSwitch.tsx +++ b/packages/features/calendars/CalendarSwitch.tsx @@ -17,10 +17,19 @@ export type ICalendarSwitchProps = { isLastItemInList?: boolean; destination?: boolean; credentialId: number; - domainWideDelegationCredentialId: string; + domainWideDelegationCredentialId: string | null; }; const CalendarSwitch = (props: ICalendarSwitchProps) => { - const { title, externalId, type, isChecked, name, isLastItemInList = false, credentialId, domainWideDelegationCredentialId } = props; + const { + title, + externalId, + type, + isChecked, + name, + isLastItemInList = false, + credentialId, + domainWideDelegationCredentialId, + } = props; const [checkedInternal, setCheckedInternal] = useState(isChecked); const utils = trpc.useUtils(); const { t } = useLocale(); @@ -29,7 +38,7 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => { const body = { integration: type, externalId: externalId, - domainWideDelegationCredentialId: domainWideDelegationCredentialId ?? null, + ...(domainWideDelegationCredentialId && { domainWideDelegationCredentialId }), // new URLSearchParams does not accept numbers credentialId: String(credentialId), }; @@ -40,7 +49,7 @@ const CalendarSwitch = (props: ICalendarSwitchProps) => { headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ ...body, credentialId, domainWideDelegationCredentialId: domainWideDelegationCredentialId ?? null }), + body: JSON.stringify({ ...body, credentialId }), }); if (!res.ok) { diff --git a/packages/lib/apps/getEnabledAppsFromCredentials.ts b/packages/lib/apps/getEnabledAppsFromCredentials.ts index f28e4309a31b27..d65dfa9b0c174a 100644 --- a/packages/lib/apps/getEnabledAppsFromCredentials.ts +++ b/packages/lib/apps/getEnabledAppsFromCredentials.ts @@ -30,8 +30,9 @@ const getEnabledAppsFromCredentials = async ( }, } satisfies Prisma.AppWhereInput; const domainWideDelegationCredentials = credentials.filter((credential) => { - return credential.id < 0 - }) + return credential.id < 0; + }); + if (filterOnCredentials) { const userIds: number[] = [], teamIds: number[] = []; @@ -55,18 +56,19 @@ const getEnabledAppsFromCredentials = async ( select: { slug: true, enabled: true }, }); - let domainWideDelegationApps = await prisma.app.findMany({ + const domainWideDelegationApps = await prisma.app.findMany({ where: { slug: { - in: domainWideDelegationCredentials.map((credential) => credential.appId) - } + in: domainWideDelegationCredentials + .filter( + (credential): credential is typeof credential & { appId: string } => credential.appId !== null + ) + .map((credential) => credential.appId), + }, }, select: { slug: true, enabled: true }, }); - console.log({ - domainWideDelegationCredentials, - domainWideDelegationApps, - }); + enabledApps = [...enabledApps, ...domainWideDelegationApps]; const apps = getApps(credentials, filterOnCredentials); diff --git a/packages/lib/buildCalEventFromBooking.ts b/packages/lib/buildCalEventFromBooking.ts index ede1d436f18561..247fd6594ee25e 100644 --- a/packages/lib/buildCalEventFromBooking.ts +++ b/packages/lib/buildCalEventFromBooking.ts @@ -13,6 +13,7 @@ type DestinationCalendar = { userId: number | null; eventTypeId: number | null; credentialId: number | null; + domainWideDelegationCredentialId: string | null; } | null; type Attendee = { diff --git a/packages/lib/domainWideDelegation/server.ts b/packages/lib/domainWideDelegation/server.ts index 2da82f1bbe8a70..c814d63921b968 100644 --- a/packages/lib/domainWideDelegation/server.ts +++ b/packages/lib/domainWideDelegation/server.ts @@ -44,6 +44,7 @@ const buildDomainWideDelegationCalendarCredential = ({ }, invalid: false, teamId: null, + team: null, }; }; @@ -71,6 +72,7 @@ const buildDomainWideDelegationConferencingCredential = ({ }, invalid: false, teamId: null, + team: null, }; }; export async function getAllDomainWideDelegationCredentialsForUser({ @@ -145,7 +147,7 @@ export async function checkIfSuccessfullyConfiguredInWorkspace({ if (!googleCalendar) { throw new Error("Google Calendar App not found"); } - return await googleCalendar.testDomainWideDelegationSetup(); + return await googleCalendar?.testDomainWideDelegationSetup?.(); } return false; } diff --git a/packages/lib/server/getDefaultLocations.ts b/packages/lib/server/getDefaultLocations.ts index 7d7bdc36ec2459..09a770aaecea49 100644 --- a/packages/lib/server/getDefaultLocations.ts +++ b/packages/lib/server/getDefaultLocations.ts @@ -9,6 +9,7 @@ import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; type SessionUser = NonNullable; type User = { id: SessionUser["id"]; + email: SessionUser["email"]; metadata: SessionUser["metadata"]; }; diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index aec4d2f955f762..9bd4be03ff0c45 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -84,10 +84,12 @@ export class DomainWideDelegationRepository { } static async findByIdIncludeSensitiveServiceAccountKey({ id }: { id: string }) { - return await prisma.domainWideDelegation.findUnique({ + const domainWideDelegation = await prisma.domainWideDelegation.findUnique({ where: { id }, select: domainWideDelegationSelectIncludesServiceAccountKey, }); + if (!domainWideDelegation) return null; + return DomainWideDelegationRepository.withParsedServiceAccountKey(domainWideDelegation); } static async findUniqueByOrganizationMemberEmail({ email }: { email: string }) { @@ -194,11 +196,7 @@ export class DomainWideDelegationRepository { }); } - static async findManyByOrganizationIdIncludeWorkspacePlatformAndSensitiveServiceAccountKey({ - organizationId, - }: { - organizationId: number; - }) { + static async findDelegationsWithServiceAccount({ organizationId }: { organizationId: number }) { return await prisma.domainWideDelegation.findMany({ where: { organizationId }, select: { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index bfa502dc8fdaec..6c6bb57048efbc 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1614,6 +1614,7 @@ model DomainWideDelegation { workspacePlatformId Int // Provides possibility to have different service accounts for different organizations if the need arises, but normally they should be the same + /// @zod.custom(imports.serviceAccountKeySchema) serviceAccountKey Json enabled Boolean @default(false) diff --git a/packages/prisma/selects/credential.ts b/packages/prisma/selects/credential.ts index c6c7916e409f35..17cbce474ccd2c 100644 --- a/packages/prisma/selects/credential.ts +++ b/packages/prisma/selects/credential.ts @@ -30,4 +30,5 @@ export const safeCredentialSelect = Prisma.validator()( teamId: true, appId: true, invalid: true, + delegatedToId: true, }); diff --git a/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts b/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts index ce9c648ae4fd97..1c6ccbacae89fa 100644 --- a/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/appCredentialsByType.handler.ts @@ -1,3 +1,4 @@ +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import { UserRepository } from "@calcom/lib/server/repository/user"; import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; @@ -31,6 +32,10 @@ export const appCredentialsByTypeHandler = async ({ ctx, input }: AppCredentials }, }); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ + user: { id: user.id, email: user.email }, + }); + // For app pages need to return which teams the user can install the app on // return user.credentials.filter((app) => app.type == input.appType).map((credential) => credential.id); return { diff --git a/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts b/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts index 83269f221b3ce5..0bab95a7067024 100644 --- a/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/integrations.handler.ts @@ -6,6 +6,7 @@ import type { CredentialOwner } from "@calcom/app-store/types"; import { getAppFromSlug } from "@calcom/app-store/utils"; import getEnabledAppsFromCredentials from "@calcom/lib/apps/getEnabledAppsFromCredentials"; import getInstallCountPerApp from "@calcom/lib/apps/getInstallCountPerApp"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import { getUsersCredentials } from "@calcom/lib/server/getUsersCredentials"; import prisma from "@calcom/prisma"; import { MembershipRole } from "@calcom/prisma/enums"; @@ -15,7 +16,6 @@ import type { CredentialPayload } from "@calcom/types/Credential"; import type { PaymentApp } from "@calcom/types/PaymentService"; import type { TIntegrationsInputSchema } from "./integrations.schema"; -import { getAllDomainWideDelegationCredentialsForUser, getAllDomainWideDelegationCredentialsForUserByAppSlug } from "@calcom/lib/domainWideDelegation/server"; type IntegrationsOptions = { ctx: { @@ -140,6 +140,7 @@ export const integrationsHandler = async ({ ctx, input }: IntegrationsOptions) = ...(appId ? { where: { slug: appId } } : {}), }); + // ?? Do we need this? const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ user }); //TODO: Refactor this to pick up only needed fields and prevent more leaking @@ -209,10 +210,15 @@ export const integrationsHandler = async ({ ctx, input }: IntegrationsOptions) = ...(teams.length && { credentialOwner, }), - userCredentialIds: [...userCredentialIds, /*...domainWideDelegationCredentialsForApp.map((c) => c.id)*/], + userCredentialIds: [ + ...userCredentialIds /*...domainWideDelegationCredentialsForApp.map((c) => c.id)*/, + ], invalidCredentialIds, teams, - isInstalled: !!userCredentialIds.length || !!teams.length || app.isGlobal /*|| !!domainWideDelegationCredentialsForApp.length*/, + isInstalled: + !!userCredentialIds.length || + !!teams.length || + app.isGlobal /*|| !!domainWideDelegationCredentialsForApp.length*/, isSetupAlready, ...(app.dependencies && { dependencyData }), }; diff --git a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts b/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts index 5ede1ef56a774a..d946d4f448ae55 100644 --- a/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts +++ b/packages/trpc/server/routers/loggedInViewer/setDestinationCalendar.handler.ts @@ -1,16 +1,18 @@ import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager"; +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; import { getUsersCredentials } from "@calcom/lib/server/getUsersCredentials"; import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; import { TRPCError } from "@trpc/server"; -import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; + import type { TSetDestinationCalendarInputSchema } from "./setDestinationCalendar.schema"; type SessionUser = NonNullable; type User = { id: SessionUser["id"]; selectedCalendars: SessionUser["selectedCalendars"]; + email: SessionUser["email"]; }; type SetDestinationCalendarOptions = { @@ -30,7 +32,7 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati const cal = allCals.find( (cal) => cal.externalId === externalId && cal.integration === integration && cal.readOnly === false - ) + ); const { credentialId, domainWideDelegationCredentialId } = cal || {}; if (!credentialId) { @@ -64,22 +66,26 @@ export const setDestinationCalendarHandler = async ({ ctx, input }: SetDestinati update: { integration, externalId, - ...(!isDomainWideDelegationCredential({ credentialId }) ? { - credentialId, - } : { - domainWideDelegationCredentialId, - }), + ...(!isDomainWideDelegationCredential({ credentialId }) + ? { + credentialId, + } + : { + domainWideDelegationCredentialId, + }), primaryEmail, }, create: { ...where, integration, externalId, - ...(!isDomainWideDelegationCredential({ credentialId }) ? { - credentialId, - } : { - domainWideDelegationCredentialId, - }), + ...(!isDomainWideDelegationCredential({ credentialId }) + ? { + credentialId, + } + : { + domainWideDelegationCredentialId, + }), primaryEmail, }, }); diff --git a/packages/trpc/server/routers/viewer/availability/calendarOverlay.handler.ts b/packages/trpc/server/routers/viewer/availability/calendarOverlay.handler.ts index 876d95eb58f1c0..37716cc2e9debe 100644 --- a/packages/trpc/server/routers/viewer/availability/calendarOverlay.handler.ts +++ b/packages/trpc/server/routers/viewer/availability/calendarOverlay.handler.ts @@ -44,6 +44,7 @@ export const calendarOverlayHandler = async ({ ctx, input }: ListOptions) => { teamId: true, appId: true, invalid: true, + delegatedToId: true, user: { select: { email: true, diff --git a/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts b/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts index 3bf85bbf7d7831..23beaff61081ca 100644 --- a/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts +++ b/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts @@ -125,7 +125,7 @@ async function getAllCredentials({ user, conferenceCredentialId, }: { - user: { id: number }; + user: { id: number; email: string }; conferenceCredentialId: number | null; }) { const credentials = await getUsersCredentials(user); diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts index 82c243f3f48f18..10cd31c05dd96c 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/list.handler.ts @@ -1,5 +1,6 @@ import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; import type { PrismaClient } from "@calcom/prisma"; +import { serviceAccountKeySchema } from "@calcom/prisma/zod-utils"; import { ensureNoServiceAccountKey } from "./utils"; @@ -16,20 +17,17 @@ export default async function handler({ throw new Error("You must be in an organization to list domain wide delegations"); } - const domainWideDelegations = - await DomainWideDelegationRepository.findManyByOrganizationIdIncludeWorkspacePlatformAndSensitiveServiceAccountKey( - { - organizationId, - } - ); + const domainWideDelegations = await DomainWideDelegationRepository.findDelegationsWithServiceAccount({ + organizationId, + }); return domainWideDelegations.map((delegation) => { // Let's not parse the service account key here, we should be able to fix the item with the problem, so we always try to return the complete list - const serviceAccountKey = delegation.serviceAccountKey; + const serviceAccountKey = serviceAccountKeySchema.safeParse(delegation.serviceAccountKey); + return ensureNoServiceAccountKey({ ...delegation, - // @ts-expect-error - serviceAccountKey is not typed - serviceAccountClientId: serviceAccountKey?.client_id || null, + serviceAccountClientId: serviceAccountKey.success ? serviceAccountKey.data?.client_id ?? null : null, }); }); } diff --git a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts index 5d13f1667a4720..7f0c6305815635 100644 --- a/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts +++ b/packages/trpc/server/routers/viewer/domainWideDelegation/toggleEnabled.handler.ts @@ -1,18 +1,17 @@ import type { z } from "zod"; +import { checkIfSuccessfullyConfiguredInWorkspace } from "@calcom/lib/domainWideDelegation/server"; import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; import type { DomainWideDelegationToggleEnabledSchema } from "./schema"; import { ensureNoServiceAccountKey } from "./utils"; -import { checkIfSuccessfullyConfiguredInWorkspace } from "@calcom/lib/domainWideDelegation/server"; - const assertWorkspaceConfigured = async ({ domainWideDelegationId, user, }: { domainWideDelegationId: string; - user: { id: number; email: string; }; + user: { id: number; email: string }; }) => { const domainWideDelegation = await DomainWideDelegationRepository.findById({ id: domainWideDelegationId }); if (!domainWideDelegation) { @@ -32,7 +31,7 @@ export default async function toggleEnabledHandler({ ctx, input, }: { - ctx: { user: { id: number; email: string;} }; + ctx: { user: { id: number; email: string } }; input: z.infer; }) { const { user: loggedInUser } = ctx; diff --git a/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts index 4e3368b740fd0c..02ae1147e8938d 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/create.handler.ts @@ -24,6 +24,7 @@ type User = { id: SessionUser["id"] | null; }; metadata: SessionUser["metadata"]; + email: SessionUser["email"]; }; type CreateOptions = { diff --git a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts index 9a73c89379ca80..614bb7af252876 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts @@ -36,6 +36,7 @@ type User = { }; selectedCalendars: SessionUser["selectedCalendars"]; organizationId: number | null; + email: SessionUser["email"]; }; type UpdateOptions = { diff --git a/packages/types/Calendar.d.ts b/packages/types/Calendar.d.ts index bf87882d49f334..3d6e278cbb804b 100644 --- a/packages/types/Calendar.d.ts +++ b/packages/types/Calendar.d.ts @@ -217,6 +217,7 @@ export interface CalendarEvent { platformCancelUrl?: string | null; platformBookingUrl?: string | null; oneTimePassword?: string | null; + domainWideDelegationCredentialId?: string | null; } export interface EntryPoint { @@ -268,8 +269,8 @@ export interface Calendar { listCalendars(event?: CalendarEvent): Promise; - testDomainWideDelegationSetup(): Promise; - + testDomainWideDelegationSetup?(): Promise; + watchCalendar?(options: { calendarId: string }): Promise; unwatchCalendar?(options: { calendarId: string }): Promise; diff --git a/packages/types/Credential.d.ts b/packages/types/Credential.d.ts index c12e8fe0d48fa5..22f289b8b7ec8c 100644 --- a/packages/types/Credential.d.ts +++ b/packages/types/Credential.d.ts @@ -8,8 +8,8 @@ import type { Prisma } from "@prisma/client"; export type CredentialPayload = Prisma.CredentialGetPayload<{ select: typeof import("@calcom/prisma/selects/credential").credentialForCalendarServiceSelect; }> & { - delegatedToId: string | null; -} + delegatedToId?: string | null; +}; export type CredentialFrontendPayload = Omit & { /** We should type error if keys are leaked to the frontend */ From f241adc740da8f79115635d6b5005a7aa8608c32 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 22 Nov 2024 19:59:24 +0530 Subject: [PATCH 15/61] fix: conflicts --- packages/app-store/googlecalendar/api/add.ts | 3 --- packages/app-store/googlecalendar/lib/CalendarService.ts | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index e4575cfe0261dd..865ca0c6977815 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -1,7 +1,6 @@ import { google } from "googleapis"; import type { NextApiRequest, NextApiResponse } from "next"; -import { createDefaultInstallation, isAppInstalled } from "@calcom/app-store/_utils/installation"; import { GOOGLE_CALENDAR_SCOPES, SCOPE_USERINFO_PROFILE, WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; import { HttpError } from "@calcom/lib/http-error"; import logger from "@calcom/lib/logger"; @@ -12,8 +11,6 @@ import type { App } from "@calcom/types/App"; import { encodeOAuthState } from "../../_utils/oauth/encodeOAuthState"; import { metadata } from "../_metadata"; -import { SCOPES } from "../lib/constants"; - import { getGoogleAppKeys } from "../lib/getGoogleAppKeys"; async function getDomainWideDelegationForApp({ diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 7bd5d4a6780cfc..5e49bff2fbc17d 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -27,9 +27,8 @@ import { import { formatCalEvent } from "@calcom/lib/formatCalendarEvent"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; -import { GoogleRepository } from "@calcom/lib/server/repository/google"; +import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; import { GoogleService } from "@calcom/lib/server/service/google"; - import prisma from "@calcom/prisma"; import type { Calendar, From 51f334418d4dc55df7ad648c76051c18c1365801 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 22 Nov 2024 20:02:04 +0530 Subject: [PATCH 16/61] chore: update test --- packages/app-store/googlecalendar/lib/CalendarService.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.test.ts b/packages/app-store/googlecalendar/lib/CalendarService.test.ts index dab13bb5be9df2..96115a4a5fd6c8 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.test.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.test.ts @@ -132,6 +132,7 @@ test("Calendar can be watched and unwatched", async () => { googleChannelResourceId: "mock-resource-id", googleChannelResourceUri: "mock-resource-uri", googleChannelExpiration: "1111111111", + domainWideDelegationCredentialId: null, }); await calendarCache.unwatchCalendar({ calendarId: testSelectedCalendar.externalId }); // There's a bug in prismock where upsert creates duplicate records so we need to acces the second element From 64a4ff7677d2a39cc52de281e4994537278a6f7c Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 22 Nov 2024 20:08:59 +0530 Subject: [PATCH 17/61] fix: logic --- apps/api/v1/pages/api/destination-calendars/[id]/_patch.ts | 1 + packages/lib/server/repository/domainWideDelegation.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/api/v1/pages/api/destination-calendars/[id]/_patch.ts b/apps/api/v1/pages/api/destination-calendars/[id]/_patch.ts index 064634b2f22ac4..0fec4ab699df56 100644 --- a/apps/api/v1/pages/api/destination-calendars/[id]/_patch.ts +++ b/apps/api/v1/pages/api/destination-calendars/[id]/_patch.ts @@ -80,6 +80,7 @@ type UserCredentialType = { teamId: number | null; key: Prisma.JsonValue; invalid: boolean | null; + domainWideDelegationCredentialId?: string | null; }; export async function patchHandler(req: NextApiRequest) { diff --git a/packages/lib/server/repository/domainWideDelegation.ts b/packages/lib/server/repository/domainWideDelegation.ts index 9bd4be03ff0c45..ed38b72db8dd05 100644 --- a/packages/lib/server/repository/domainWideDelegation.ts +++ b/packages/lib/server/repository/domainWideDelegation.ts @@ -43,9 +43,11 @@ export class DomainWideDelegationRepository { if (!domainWideDelegation) { return null; } + const parsedServiceAccountKey = serviceAccountKeySchema.safeParse(domainWideDelegation.serviceAccountKey); + return { ...domainWideDelegation, - serviceAccountKey: serviceAccountKeySchema.parse(domainWideDelegation.serviceAccountKey), + serviceAccountKey: parsedServiceAccountKey.success ? parsedServiceAccountKey.data : null, }; } From dd29641521865470f33f9937bb2199e2e4ce7dbf Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 22 Nov 2024 20:10:31 +0530 Subject: [PATCH 18/61] chore: improvements --- packages/app-store/googlecalendar/lib/CalendarService.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 5e49bff2fbc17d..6f90e357b4aabe 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -196,17 +196,16 @@ export default class GoogleCalendarService implements Calendar { ); } - if (domainWideDelegation) { + if (domainWideDelegation?.serviceAccountKey) { const emailToImpersonate = this.credential.user?.email; if (!emailToImpersonate) { this.log.error("No email to impersonate found for domain wide delegation"); return null; } - // TODO: parse service account key const authClient = new JWT({ - email: domainWideDelegation?.serviceAccountKey?.client_email, - key: domainWideDelegation?.serviceAccountKey?.private_key, + email: domainWideDelegation.serviceAccountKey.client_email, + key: domainWideDelegation.serviceAccountKey.private_key, scopes: ["https://www.googleapis.com/auth/calendar"], subject: emailToImpersonate, }); From d30c1bafaa769658a576b4171e460220c91263b5 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Sat, 23 Nov 2024 00:49:47 +0530 Subject: [PATCH 19/61] fix: toglle --- apps/web/pages/api/availability/calendar.ts | 66 +++++++++------------ 1 file changed, 27 insertions(+), 39 deletions(-) diff --git a/apps/web/pages/api/availability/calendar.ts b/apps/web/pages/api/availability/calendar.ts index b023365b8756fb..3d5a66a7758e82 100644 --- a/apps/web/pages/api/availability/calendar.ts +++ b/apps/web/pages/api/availability/calendar.ts @@ -4,15 +4,13 @@ import { z } from "zod"; import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { CalendarCache } from "@calcom/features/calendar-cache/calendar-cache"; +import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; import { HttpError } from "@calcom/lib/http-error"; import notEmpty from "@calcom/lib/notEmpty"; -import prisma from "@calcom/prisma"; -import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/credential"; -import { isDomainWideDelegationCredential } from "@calcom/lib/domainWideDelegation/clientAndServer"; - import { defaultHandler, defaultResponder } from "@calcom/lib/server"; import { SelectedCalendarRepository } from "@calcom/lib/server/repository/selectedCalendar"; import { UserRepository } from "@calcom/lib/server/repository/user"; +import prisma from "@calcom/prisma"; const selectedCalendarSelectSchema = z.object({ integration: z.string(), @@ -38,35 +36,6 @@ async function authMiddleware(req: CustomNextApiRequest) { return userWithCredentials; } - if (req.method === "POST") { - const { integration, externalId, credentialId, domainWideDelegationCredentialId } = - selectedCalendarSelectSchema.parse(req.body); - await prisma.selectedCalendar.upsert({ - where: { - userId_integration_externalId: { - userId: user.id, - integration, - externalId, - }, - }, - create: { - userId: user.id, - integration, - externalId, - ...(!isDomainWideDelegationCredential({ credentialId }) - ? { - credentialId, - } - : { - domainWideDelegationCredentialId, - }), - }, - // already exists - update: {}, - }); - res.status(200).json({ message: "Calendar Selection Saved" }); - } - type CustomNextApiRequest = NextApiRequest & { userWithCredentials?: Awaited>; }; @@ -74,12 +43,31 @@ type CustomNextApiRequest = NextApiRequest & { async function postHandler(req: CustomNextApiRequest) { if (!req.userWithCredentials) throw new HttpError({ statusCode: 401, message: "Not authenticated" }); const user = req.userWithCredentials; - const { integration, externalId, credentialId } = selectedCalendarSelectSchema.parse(req.body); - await SelectedCalendarRepository.upsert({ - userId: user.id, - integration, - externalId, - credentialId, + + const { integration, externalId, credentialId, domainWideDelegationCredentialId } = + selectedCalendarSelectSchema.parse(req.body); + await prisma.selectedCalendar.upsert({ + where: { + userId_integration_externalId: { + userId: user.id, + integration, + externalId, + }, + }, + create: { + userId: user.id, + integration, + externalId, + ...(!isDomainWideDelegationCredential({ credentialId }) + ? { + credentialId, + } + : { + domainWideDelegationCredentialId, + }), + }, + // already exists + update: {}, }); return { message: "Calendar Selection Saved" }; From 3ce6322e753ac0666012d6bf35f7a870f834798c Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Sat, 23 Nov 2024 01:12:35 +0530 Subject: [PATCH 20/61] fix: bugs --- .../components/AppConnectionItem.tsx | 131 +++++++++--------- .../components/ConnectedCalendarItem.tsx | 2 + 2 files changed, 67 insertions(+), 66 deletions(-) diff --git a/apps/web/components/getting-started/components/AppConnectionItem.tsx b/apps/web/components/getting-started/components/AppConnectionItem.tsx index 57ded951297cce..b958851bf9bd9d 100644 --- a/apps/web/components/getting-started/components/AppConnectionItem.tsx +++ b/apps/web/components/getting-started/components/AppConnectionItem.tsx @@ -29,9 +29,7 @@ const AppConnectionItem = (props: IAppConnectionItem) => { await utils.viewer.me.invalidate(); }, onError: (error) => { - showToast(t("something_went_wrong"), { - type: "error", - }); + showToast(t("something_went_wrong"), "error"); console.error(error); }, }); @@ -44,76 +42,77 @@ const AppConnectionItem = (props: IAppConnectionItem) => { {isDefault && {t("default")}}
    - { - if (defaultInstall && slug) { - setDefaultConferencingApp.mutate({ slug }); - } - }, - }} - render={(buttonProps) => ( -
    - - ) : undefined - } - onClick={(event) => { - // Save cookie key to return url step - document.cookie = `return-to=${window.location.href};path=/;max-age=3600;SameSite=Lax`; - buttonProps && buttonProps.onClick && buttonProps?.onClick(event); + ) : undefined + } + onClick={(event) => { + // Save cookie key to return url step + document.cookie = `return-to=${window.location.href};path=/;max-age=3600;SameSite=Lax`; + buttonProps && buttonProps.onClick && buttonProps?.onClick(event); + }}> + {installed ? t("installed") : t("connect")} + + )} + /> + {installed && !isDefault && ( + - )} - /> - {installed && !isDefault && ( - )} diff --git a/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx b/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx index a611fe69b94d46..9598528a3f97c7 100644 --- a/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx +++ b/apps/web/components/getting-started/components/ConnectedCalendarItem.tsx @@ -14,6 +14,7 @@ interface IConnectedCalendarItem { userId?: number | undefined; integration?: string | undefined; externalId: string; + domainWideDelegationCredentialId?: string | null; }[]; } @@ -61,6 +62,7 @@ const ConnectedCalendarItem = (prop: IConnectedCalendarItem) => { type={integrationType} isChecked={calendar.isSelected} isLastItemInList={i === calendars.length - 1} + domainWideDelegationCredentialId={calendar.domainWideDelegationCredentialId} /> ))} From c62ad22fd81348c20b05e7f750d9bb5cc448c71d Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Sat, 23 Nov 2024 01:32:45 +0530 Subject: [PATCH 21/61] fix: type err --- apps/web/pages/settings/admin/workspace-platforms.tsx | 2 +- packages/features/calendars/CalendarSwitch.tsx | 2 +- .../ee/organizations/pages/settings/domainWideDelegation.tsx | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/web/pages/settings/admin/workspace-platforms.tsx b/apps/web/pages/settings/admin/workspace-platforms.tsx index c6410f94722aa3..4605d1ec517e3a 100644 --- a/apps/web/pages/settings/admin/workspace-platforms.tsx +++ b/apps/web/pages/settings/admin/workspace-platforms.tsx @@ -434,7 +434,7 @@ function CreateUpdatePlatformDialog({ isOpen, onOpenChange, editingPlatform, -}: Pick) { +}: Pick & { editingPlatform?: Props["editingPlatform"] }) { if (editingPlatform) { return ( diff --git a/packages/features/calendars/CalendarSwitch.tsx b/packages/features/calendars/CalendarSwitch.tsx index cf1801d9a1464d..c4eb7bfa83bd2c 100644 --- a/packages/features/calendars/CalendarSwitch.tsx +++ b/packages/features/calendars/CalendarSwitch.tsx @@ -17,7 +17,7 @@ export type ICalendarSwitchProps = { isLastItemInList?: boolean; destination?: boolean; credentialId: number; - domainWideDelegationCredentialId: string | null; + domainWideDelegationCredentialId?: string | null; }; const CalendarSwitch = (props: ICalendarSwitchProps) => { const { diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx index 05ce2d21067a5d..d1d1aa72b4b54f 100644 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -25,7 +25,7 @@ interface DelegationItemProps { id: string; domain: string; enabled: boolean; - serviceAccountClientId: string; + serviceAccountClientId: string | null; workspacePlatform: { name: string; slug: string; @@ -305,8 +305,6 @@ function DomainWideDelegationList() { const { data: workspacePlatforms, isLoading: isLoadingWorkspacePlatforms } = trpc.viewer.domainWideDelegation.listWorkspacePlatforms.useQuery(); - console.log("workspacePlatforms", workspacePlatforms); - const onEditClick = (delegation: DelegationItemProps["delegation"]) => { setCreateEditDialog({ isOpen: true, delegation }); }; From 63187ead0397a7541006b2ecc4f48003891efb74 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Sat, 23 Nov 2024 02:04:09 +0530 Subject: [PATCH 22/61] chore: check number type --- packages/lib/domainWideDelegation/clientAndServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/domainWideDelegation/clientAndServer.ts b/packages/lib/domainWideDelegation/clientAndServer.ts index b9206c14f07d8a..32c62ede8d8c01 100644 --- a/packages/lib/domainWideDelegation/clientAndServer.ts +++ b/packages/lib/domainWideDelegation/clientAndServer.ts @@ -1,4 +1,4 @@ export function isDomainWideDelegationCredential({ credentialId }: { credentialId?: number }) { // Though it is set as -1 right now, but we might want to set it to some other negative value. - return !!credentialId && credentialId < 0; + return typeof credentialId === "number" && credentialId < 0; } From e4d54215ca0a7a8249f4333342c25c5bd42692a0 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 26 Nov 2024 14:05:56 +0530 Subject: [PATCH 23/61] fix: after conflicts --- packages/app-store/googlecalendar/api/add.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index 46efb851265f08..ece313787d037d 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -1,7 +1,7 @@ import { google } from "googleapis"; import type { NextApiRequest, NextApiResponse } from "next"; -import { GOOGLE_CALENDAR_SCOPES, SCOPE_USERINFO_PROFILE, WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; +import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; import { HttpError } from "@calcom/lib/http-error"; import logger from "@calcom/lib/logger"; import { defaultHandler, defaultResponder } from "@calcom/lib/server"; @@ -11,6 +11,7 @@ import type { App } from "@calcom/types/App"; import { encodeOAuthState } from "../../_utils/oauth/encodeOAuthState"; import { metadata } from "../_metadata"; +import { SCOPES } from "../lib/constants"; import { getGoogleAppKeys } from "../lib/getGoogleAppKeys"; async function getDomainWideDelegationForApp({ From 2fef7cf3636ff5af530af9de1359c0a786e7f1e6 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 26 Nov 2024 14:14:07 +0530 Subject: [PATCH 24/61] chore: fix type err --- packages/app-store/googlecalendar/lib/CalendarService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 5f09d5cf1aa6cb..ae3dfc32161bea 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -29,7 +29,6 @@ import { getAllCalendars } from "@calcom/lib/google"; import logger from "@calcom/lib/logger"; import { safeStringify } from "@calcom/lib/safeStringify"; import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; -import { GoogleService } from "@calcom/lib/server/service/google"; import { GoogleRepository } from "@calcom/lib/server/repository/google"; import prisma from "@calcom/prisma"; import type { From 1b42a1f2efb2d17619f4cfb9ccfe71ba1a03052b Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 26 Nov 2024 14:50:25 +0530 Subject: [PATCH 25/61] fix: type errors and tests --- apps/web/pages/settings/admin/workspace-platforms.tsx | 6 ++++-- .../app-store/googlecalendar/lib/CalendarService.test.ts | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/web/pages/settings/admin/workspace-platforms.tsx b/apps/web/pages/settings/admin/workspace-platforms.tsx index 4605d1ec517e3a..5938dbc63e570c 100644 --- a/apps/web/pages/settings/admin/workspace-platforms.tsx +++ b/apps/web/pages/settings/admin/workspace-platforms.tsx @@ -43,7 +43,7 @@ type Props = { editingPlatform: WorkspacePlatform; isCreate: boolean; platform: WorkspacePlatform; - platformId: number; + platformId?: number; platforms: WorkspacePlatform[]; }; @@ -90,7 +90,7 @@ const WorkspacePlatformsPage = () => { )} @@ -235,6 +235,8 @@ function UpdateServiceAccountFieldsDialog({ }); const onSubmit: SubmitHandler = (values) => { + if (!platformId) return; + const parsedKey = JSON.parse(values.defaultServiceAccountKey); const validatedKey = serviceAccountKeySchema.safeParse(parsedKey); if (!validatedKey.success) { diff --git a/packages/app-store/googlecalendar/lib/CalendarService.test.ts b/packages/app-store/googlecalendar/lib/CalendarService.test.ts index 96115a4a5fd6c8..dab13bb5be9df2 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.test.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.test.ts @@ -132,7 +132,6 @@ test("Calendar can be watched and unwatched", async () => { googleChannelResourceId: "mock-resource-id", googleChannelResourceUri: "mock-resource-uri", googleChannelExpiration: "1111111111", - domainWideDelegationCredentialId: null, }); await calendarCache.unwatchCalendar({ calendarId: testSelectedCalendar.externalId }); // There's a bug in prismock where upsert creates duplicate records so we need to acces the second element From e306763db2a3e89e543066732b1943b5aaa6d38f Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 26 Nov 2024 15:10:05 +0530 Subject: [PATCH 26/61] fix: tets --- packages/app-store/googlecalendar/lib/CalendarService.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.test.ts b/packages/app-store/googlecalendar/lib/CalendarService.test.ts index dab13bb5be9df2..f4ea3526bf4826 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.test.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.test.ts @@ -127,6 +127,7 @@ test("Calendar can be watched and unwatched", async () => { integration: "google_calendar", externalId: "example@cal.com", credentialId: 1, + domainWideDelegationCredentialId: null, googleChannelId: "mock-channel-id", googleChannelKind: "api#channel", googleChannelResourceId: "mock-resource-id", From b1a01bc1d9afbd725440c2c776c6de87a7d80b0a Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 26 Nov 2024 15:18:57 +0530 Subject: [PATCH 27/61] test --- packages/app-store/googlecalendar/lib/CalendarService.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.test.ts b/packages/app-store/googlecalendar/lib/CalendarService.test.ts index f4ea3526bf4826..ccb9aebd6f4b8e 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.test.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.test.ts @@ -148,6 +148,7 @@ test("Calendar can be watched and unwatched", async () => { userId: 1, integration: "google_calendar", externalId: "example@cal.com", + domainWideDelegationCredentialId: null, credentialId: 1, googleChannelId: null, googleChannelKind: null, From 425ead81b0769ce32326d04adc67e435ab0b7ab7 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Wed, 27 Nov 2024 12:36:27 +0530 Subject: [PATCH 28/61] chore: remove unused --- packages/app-store/googlecalendar/api/add.ts | 109 +++++++------------ 1 file changed, 37 insertions(+), 72 deletions(-) diff --git a/packages/app-store/googlecalendar/api/add.ts b/packages/app-store/googlecalendar/api/add.ts index ece313787d037d..30a6ed8e1a2a45 100644 --- a/packages/app-store/googlecalendar/api/add.ts +++ b/packages/app-store/googlecalendar/api/add.ts @@ -3,54 +3,50 @@ import type { NextApiRequest, NextApiResponse } from "next"; import { WEBAPP_URL_FOR_OAUTH } from "@calcom/lib/constants"; import { HttpError } from "@calcom/lib/http-error"; -import logger from "@calcom/lib/logger"; import { defaultHandler, defaultResponder } from "@calcom/lib/server"; import { getTranslation } from "@calcom/lib/server/i18n"; -import { DomainWideDelegationRepository } from "@calcom/lib/server/repository/domainWideDelegation"; -import type { App } from "@calcom/types/App"; import { encodeOAuthState } from "../../_utils/oauth/encodeOAuthState"; -import { metadata } from "../_metadata"; import { SCOPES } from "../lib/constants"; import { getGoogleAppKeys } from "../lib/getGoogleAppKeys"; -async function getDomainWideDelegationForApp({ - user, - appMetadata, -}: { - user: { - email: string; - }; - appMetadata: Pick; -}) { - const log = logger.getSubLogger({ prefix: ["getDomainWideDelegationForApp"] }); - - const domainWideDelegation = await DomainWideDelegationRepository.findUniqueByOrganizationMemberEmail({ - email: user.email, - }); - - if (!domainWideDelegation || !domainWideDelegation.enabled || !appMetadata.domainWideDelegation) { - log.debug("Domain-wide delegation isn't enabled for this app", { - domainWideDelegationEnabled: domainWideDelegation?.enabled, - metadataDomainWideDelegation: appMetadata.domainWideDelegation, - }); - return null; - } - - if ( - domainWideDelegation.workspacePlatform.slug !== appMetadata.domainWideDelegation.workspacePlatformSlug - ) { - log.info("Domain-wide delegation isn't compatible with this app", { - domainWideDelegation: domainWideDelegation.workspacePlatform.slug, - appSlug: metadata.slug, - }); - return null; - } - - log.debug("Domain-wide delegation is enabled"); - - return domainWideDelegation; -} +// async function getDomainWideDelegationForApp({ +// user, +// appMetadata, +// }: { +// user: { +// email: string; +// }; +// appMetadata: Pick; +// }) { +// const log = logger.getSubLogger({ prefix: ["getDomainWideDelegationForApp"] }); + +// const domainWideDelegation = await DomainWideDelegationRepository.findUniqueByOrganizationMemberEmail({ +// email: user.email, +// }); + +// if (!domainWideDelegation || !domainWideDelegation.enabled || !appMetadata.domainWideDelegation) { +// log.debug("Domain-wide delegation isn't enabled for this app", { +// domainWideDelegationEnabled: domainWideDelegation?.enabled, +// metadataDomainWideDelegation: appMetadata.domainWideDelegation, +// }); +// return null; +// } + +// if ( +// domainWideDelegation.workspacePlatform.slug !== appMetadata.domainWideDelegation.workspacePlatformSlug +// ) { +// log.info("Domain-wide delegation isn't compatible with this app", { +// domainWideDelegation: domainWideDelegation.workspacePlatform.slug, +// appSlug: metadata.slug, +// }); +// return null; +// } + +// log.debug("Domain-wide delegation is enabled"); + +// return domainWideDelegation; +// } async function getHandler(req: NextApiRequest, res: NextApiResponse) { const loggedInUser = req.session?.user; @@ -67,37 +63,6 @@ async function getHandler(req: NextApiRequest, res: NextApiResponse) { throw new HttpError({ statusCode: 400, message: "Session user must have an email" }); } - // const domainWideDelegation = await getDomainWideDelegationForApp({ - // user: { - // email: loggedInUser.email, - // }, - // appMetadata: metadata, - // }); - - // if (domainWideDelegation) { - // if (await isAppInstalled({ appId: metadata.slug, userId: loggedInUser.id })) { - // throw new HttpError({ - // statusCode: 422, - // message: translate("domain_wide_delegation_restricts_adding_more_than_one_installation"), - // }); - // } - - // await createDefaultInstallation({ - // appType: metadata.type, - // user: loggedInUser, - // slug: metadata.slug, - // delegatedToId: domainWideDelegation.id, - // key: { - // // FIXME: zod validation somewhere requires access_token, when infact it isn't needed for domain-wide delegation - // access_token: "NOT_A_TOKEN", - // }, - // }); - // res - // .status(200) - // .json({ message: translate("app_successfully_installed_and_is_using_delegated_credentials") }); - // return; - // } - const { client_id, client_secret } = await getGoogleAppKeys(); const redirect_uri = `${WEBAPP_URL_FOR_OAUTH}/api/integrations/googlecalendar/callback`; const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uri); From e1e53a27dd86d40d3b2499cb37f5414fe191f6bf Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Wed, 27 Nov 2024 19:21:44 +0530 Subject: [PATCH 29/61] fix: google meet url on booking page and secondary calendar --- .../app-store/googlecalendar/lib/CalendarService.ts | 11 ++++++++--- packages/core/CalendarManager.ts | 7 +++++-- packages/core/EventManager.ts | 11 ++++++++--- .../pages/settings/domainWideDelegation.tsx | 4 ++-- .../migration.sql | 5 +++++ packages/prisma/schema.prisma | 5 ++++- .../viewer/admin/workspacePlatform/list.handler.ts | 4 +++- 7 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 packages/prisma/migrations/20241127131307_add_dwd_in_booking_reference/migration.sql diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index ae3dfc32161bea..791241128321d5 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -319,7 +319,11 @@ export default class GoogleCalendarService implements Calendar { return attendees; }; - async createEvent(calEventRaw: CalendarEvent, credentialId: number): Promise { + async createEvent( + calEventRaw: CalendarEvent, + credentialId: number, + overrideExternalId?: string + ): Promise { this.log.debug("Creating event"); const formattedCalEvent = formatCalEvent(calEventRaw); @@ -368,8 +372,9 @@ export default class GoogleCalendarService implements Calendar { // Find in formattedCalEvent.destinationCalendar the one with the same credentialId const selectedCalendar = - formattedCalEvent.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId || - "primary"; + overrideExternalId ?? + (formattedCalEvent.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId || + "primary"); try { let event; diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index 1fba362bf2592f..ecbf3ab63c09b0 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -5,7 +5,7 @@ import { getCalendar } from "@calcom/app-store/_utils/getCalendar"; import getApps from "@calcom/app-store/utils"; import dayjs from "@calcom/dayjs"; import { getUid } from "@calcom/lib/CalEventParser"; -import { CalendarAppDomainWideDelegationClientIdNotAuthorizedError, CalendarAppDomainWideDelegationError } from "@calcom/lib/CalendarAppError"; +import { CalendarAppDomainWideDelegationError } from "@calcom/lib/CalendarAppError"; import logger from "@calcom/lib/logger"; import { getPiiFreeCalendarEvent, getPiiFreeCredential } from "@calcom/lib/piiFreeData"; import { safeStringify } from "@calcom/lib/safeStringify"; @@ -251,10 +251,12 @@ export const createEvent = async ( calEvent.additionalNotes = "Notes have been hidden by the organizer"; // TODO: i18n this string? } + const overrideExternalIdForDelegatedCredential = credential.delegatedToId ? externalId : undefined; + // TODO: Surface success/error messages coming from apps to improve end user visibility const creationResult = calendar ? await calendar - .createEvent(calEvent, credential.id) + .createEvent(calEvent, credential.id, overrideExternalIdForDelegatedCredential) .catch(async (error: { code: number; calError: string }) => { success = false; /** @@ -309,6 +311,7 @@ export const createEvent = async ( calWarnings: creationResult?.additionalInfo?.calWarnings || [], externalId, credentialId: credential.id, + delegatedToId: credential.delegatedToId, }; }; diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index a1c41c0afee02f..95ace747fa44bc 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -243,7 +243,8 @@ export default class EventManager { meetingPassword: createdEventObj ? createdEventObj.password : result.createdEvent?.password, meetingUrl: createdEventObj ? createdEventObj.onlineMeetingUrl : result.createdEvent?.url, externalCalendarId: isCalendarType ? result.externalId : undefined, - credentialId: result?.credentialId || undefined, + credentialId: result?.credentialId !== -1 ? result?.credentialId ?? undefined : undefined, + delegatedToId: result?.delegatedToId || undefined, }; }); @@ -671,8 +672,12 @@ export default class EventManager { for (const destination of destinationCalendars) { if (eventCreated) break; log.silly("Creating Calendar event", JSON.stringify({ destination })); - if (destination.credentialId) { - let credential = this.calendarCredentials.find((c) => c.id === destination.credentialId); + if (destination.credentialId || destination.domainWideDelegationCredentialId) { + let credential = destination.domainWideDelegationCredentialId + ? this.calendarCredentials.find( + (c) => c.delegatedToId === destination.domainWideDelegationCredentialId + ) + : this.calendarCredentials.find((c) => c.id === destination.credentialId); if (!credential) { // Fetch credential from DB const credentialFromDB = await prisma.credential.findUnique({ diff --git a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx index d1d1aa72b4b54f..d2a118b2c5bab1 100644 --- a/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx +++ b/packages/features/ee/organizations/pages/settings/domainWideDelegation.tsx @@ -192,7 +192,7 @@ function DelegationFormFields({ workspacePlatforms }: { workspacePlatforms: Work const { t } = useLocale(); const form = useFormContext(); return ( - <> +
    - +
    ); } diff --git a/packages/prisma/migrations/20241127131307_add_dwd_in_booking_reference/migration.sql b/packages/prisma/migrations/20241127131307_add_dwd_in_booking_reference/migration.sql new file mode 100644 index 00000000000000..cca48240fa222c --- /dev/null +++ b/packages/prisma/migrations/20241127131307_add_dwd_in_booking_reference/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "BookingReference" ADD COLUMN "delegatedToId" TEXT; + +-- AddForeignKey +ALTER TABLE "BookingReference" ADD CONSTRAINT "BookingReference_delegatedToId_fkey" FOREIGN KEY ("delegatedToId") REFERENCES "DomainWideDelegation"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 1b38ce09494487..8e7c717f607f6f 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -567,6 +567,9 @@ model BookingReference { credential Credential? @relation(fields: [credentialId], references: [id], onDelete: SetNull) credentialId Int? + delegatedTo DomainWideDelegation? @relation(fields: [delegatedToId], references: [id], onDelete: Cascade) + delegatedToId String? + @@index([bookingId]) @@index([type]) @@index([uid]) @@ -1636,6 +1639,7 @@ model DomainWideDelegation { selectedCalendars SelectedCalendar[] destinationCalendar DestinationCalendar[] + bookingReferences BookingReference[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -1670,7 +1674,6 @@ model WorkspacePlatform { @@unique([slug]) } - enum AssignmentReasonEnum { ROUTING_FORM_ROUTING ROUTING_FORM_ROUTING_FALLBACK diff --git a/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts b/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts index 94ffb3461143bf..4071f6dddfb031 100644 --- a/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/workspacePlatform/list.handler.ts @@ -1,7 +1,9 @@ import { WorkspacePlatformRepository } from "@calcom/lib/server/repository/workspacePlatform"; -import { ensureNoServiceAccountKey } from "./utils"; + import { TRPCError } from "@trpc/server"; +import { ensureNoServiceAccountKey } from "./utils"; + export default async function listHandler() { try { const workspacePlatforms = await WorkspacePlatformRepository.findAll(); From d394fe29ef485ba955fc55305a592a76582c46f4 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Thu, 28 Nov 2024 12:43:50 +0530 Subject: [PATCH 30/61] fix: add property --- packages/app-store/googlecalendar/lib/CalendarService.ts | 4 ++-- packages/core/CalendarManager.ts | 2 +- packages/core/EventManager.ts | 2 +- packages/types/Calendar.d.ts | 7 ++++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index 791241128321d5..c8fe1c183ca440 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -322,7 +322,7 @@ export default class GoogleCalendarService implements Calendar { async createEvent( calEventRaw: CalendarEvent, credentialId: number, - overrideExternalId?: string + overrideExternalIdForDelegatedCredential?: string ): Promise { this.log.debug("Creating event"); const formattedCalEvent = formatCalEvent(calEventRaw); @@ -372,7 +372,7 @@ export default class GoogleCalendarService implements Calendar { // Find in formattedCalEvent.destinationCalendar the one with the same credentialId const selectedCalendar = - overrideExternalId ?? + overrideExternalIdForDelegatedCredential ?? (formattedCalEvent.destinationCalendar?.find((cal) => cal.credentialId === credentialId)?.externalId || "primary"); diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index ecbf3ab63c09b0..bb2f33362d091b 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -311,7 +311,7 @@ export const createEvent = async ( calWarnings: creationResult?.additionalInfo?.calWarnings || [], externalId, credentialId: credential.id, - delegatedToId: credential.delegatedToId, + delegatedToId: credential.delegatedToId ?? undefined, }; }; diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 95ace747fa44bc..926fceac4036ad 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -678,7 +678,7 @@ export default class EventManager { (c) => c.delegatedToId === destination.domainWideDelegationCredentialId ) : this.calendarCredentials.find((c) => c.id === destination.credentialId); - if (!credential) { + if (!credential && destination.credentialId) { // Fetch credential from DB const credentialFromDB = await prisma.credential.findUnique({ where: { diff --git a/packages/types/Calendar.d.ts b/packages/types/Calendar.d.ts index 3d6e278cbb804b..eb41db3a14227c 100644 --- a/packages/types/Calendar.d.ts +++ b/packages/types/Calendar.d.ts @@ -80,6 +80,7 @@ export type NewCalendarEventType = { location?: string | null; hangoutLink?: string | null; conferenceData?: ConferenceData; + delegatedToId?: string | null; }; export type CalendarEventType = { @@ -249,7 +250,11 @@ export interface IntegrationCalendar extends Ensure, } export interface Calendar { - createEvent(event: CalendarEvent, credentialId: number): Promise; + createEvent( + event: CalendarEvent, + credentialId: number, + overrideExternalIdForDelegatedCredential?: string + ): Promise; updateEvent( uid: string, From 5ce0627ca481668508a02f4421851468bd8d32db Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Thu, 28 Nov 2024 12:54:39 +0530 Subject: [PATCH 31/61] fix: type err --- packages/types/EventManager.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/types/EventManager.d.ts b/packages/types/EventManager.d.ts index 3c133cc93d63ee..3c6408d96ec14f 100644 --- a/packages/types/EventManager.d.ts +++ b/packages/types/EventManager.d.ts @@ -24,6 +24,7 @@ export interface EventResult { calError?: string; calWarnings?: string[]; credentialId?: number; + delegatedToId?: string | null; externalId?: string | null; } From 0b7b9aaef110c6b882d394d137307a4029e4b6dd Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Fri, 29 Nov 2024 15:21:44 +0530 Subject: [PATCH 32/61] fix: re assingment bug --- .../app-store/googlecalendar/lib/CalendarService.ts | 2 -- packages/core/EventManager.ts | 12 ++++++++++-- .../ee/round-robin/roundRobinManualReassignment.ts | 10 +++++++++- .../settings/appDir/SettingsLayoutAppDirClient.tsx | 5 +++++ packages/lib/CalEventParser.ts | 2 +- packages/types/EventManager.d.ts | 1 + 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/app-store/googlecalendar/lib/CalendarService.ts b/packages/app-store/googlecalendar/lib/CalendarService.ts index c8fe1c183ca440..c6ad5b55a6278b 100644 --- a/packages/app-store/googlecalendar/lib/CalendarService.ts +++ b/packages/app-store/googlecalendar/lib/CalendarService.ts @@ -177,8 +177,6 @@ export default class GoogleCalendarService implements Calendar { }) => { if (!this.credential.delegatedToId) return null; - const user = this.credential.delegatedToId; - //TODO: Compute it once and save it const domainWideDelegation = await DomainWideDelegationRepository.findByIdIncludeSensitiveServiceAccountKey({ diff --git a/packages/core/EventManager.ts b/packages/core/EventManager.ts index 926fceac4036ad..1e59b5139bafd4 100644 --- a/packages/core/EventManager.ts +++ b/packages/core/EventManager.ts @@ -334,8 +334,10 @@ export default class EventManager { const calendarCredential = await this.getCredentialAndWarnIfNotFound( credentialId, this.calendarCredentials, - credentialType + credentialType, + reference.delegatedToId ); + if (calendarCredential) { await deleteEvent({ credential: calendarCredential, @@ -364,8 +366,12 @@ export default class EventManager { private async getCredentialAndWarnIfNotFound( credentialId: number | null | undefined, credentials: CredentialPayload[], - type: string + type: string, + delegatedToId?: string | null ) { + if (delegatedToId) { + return this.calendarCredentials.find((cred) => cred.delegatedToId === delegatedToId); + } const credential = credentials.find((cred) => cred.id === credentialId); if (credential) { return credential; @@ -440,6 +446,7 @@ export default class EventManager { meetingUrl: true, externalCalendarId: true, credentialId: true, + delegatedToId: true, }, }, destinationCalendar: true, @@ -630,6 +637,7 @@ export default class EventManager { */ private async createAllCalendarEvents(event: CalendarEvent) { let createdEvents: EventResult[] = []; + console.log("createAllCalendarEvents.this.calendarCredentials", this.calendarCredentials); const fallbackToFirstCalendarInTheList = async () => { /** diff --git a/packages/features/ee/round-robin/roundRobinManualReassignment.ts b/packages/features/ee/round-robin/roundRobinManualReassignment.ts index 92d805e208c495..a223534fbadd25 100644 --- a/packages/features/ee/round-robin/roundRobinManualReassignment.ts +++ b/packages/features/ee/round-robin/roundRobinManualReassignment.ts @@ -17,6 +17,7 @@ import { scheduleWorkflowReminders } from "@calcom/features/ee/workflows/lib/rem import { isPrismaObjOrUndefined } from "@calcom/lib"; import { getVideoCallUrlFromCalEvent } from "@calcom/lib/CalEventParser"; import { SENDER_NAME } from "@calcom/lib/constants"; +import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import { getBookerBaseUrl } from "@calcom/lib/getBookerUrl/server"; import logger from "@calcom/lib/logger"; import { getTranslation } from "@calcom/lib/server/i18n"; @@ -267,6 +268,13 @@ export const roundRobinManualReassignment = async ({ include: { user: { select: { email: true } } }, }); + const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ + user: { + email: newUser.email, + id: newUser.id, + }, + }); + const previousHostDestinationCalendar = hasOrganizerChanged ? await prisma.destinationCalendar.findFirst({ where: { userId: originalOrganizer.id }, @@ -280,7 +288,7 @@ export const roundRobinManualReassignment = async ({ changedOrganizer: hasOrganizerChanged, previousHostDestinationCalendar: previousHostDestinationCalendar ? [previousHostDestinationCalendar] : [], initParams: { - user: { ...newUser, credentials }, + user: { ...newUser, credentials: credentials.concat(domainWideDelegationCredentials) }, }, bookingId, bookingLocation, diff --git a/packages/features/settings/appDir/SettingsLayoutAppDirClient.tsx b/packages/features/settings/appDir/SettingsLayoutAppDirClient.tsx index 52639c6e6726d3..cef3f1f4e6f4c1 100644 --- a/packages/features/settings/appDir/SettingsLayoutAppDirClient.tsx +++ b/packages/features/settings/appDir/SettingsLayoutAppDirClient.tsx @@ -103,6 +103,10 @@ const tabs: VerticalTabItemProps[] = [ name: "admin_api", href: "https://cal.com/docs/enterprise-features/api/api-reference/bookings#admin-access", }, + { + name: "domain_wide_delegation", + href: "/settings/organizations/domain-wide-delegation", + }, ], }, { @@ -131,6 +135,7 @@ const tabs: VerticalTabItemProps[] = [ { name: "organizations", href: "/settings/admin/organizations" }, { name: "lockedSMS", href: "/settings/admin/lockedSMS" }, { name: "oAuth", href: "/settings/admin/oAuth" }, + { name: "Workspace Platforms", href: "/settings/admin/workspace-platforms" }, ], }, ]; diff --git a/packages/lib/CalEventParser.ts b/packages/lib/CalEventParser.ts index 5afa4ebd2b3fc0..3e4cb3f381f18d 100644 --- a/packages/lib/CalEventParser.ts +++ b/packages/lib/CalEventParser.ts @@ -30,7 +30,7 @@ ${calEvent.organizer.timeZone} ` : ` ${t("invitee_timezone")}: -${calEvent.attendees[0].timeZone} +${calEvent.attendees?.[0]?.timeZone} `; }; diff --git a/packages/types/EventManager.d.ts b/packages/types/EventManager.d.ts index 3c6408d96ec14f..ab61c150c13fbe 100644 --- a/packages/types/EventManager.d.ts +++ b/packages/types/EventManager.d.ts @@ -10,6 +10,7 @@ export interface PartialReference { meetingUrl?: string | null; externalCalendarId?: string | null; credentialId?: number | null; + delegatedToId?: string | null; } export interface EventResult { From 0ade51fbead1d6cf621e7561ba55a9470daac659 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Mon, 2 Dec 2024 02:05:37 +0530 Subject: [PATCH 33/61] fix: use getAllCredentials --- .../getAllCredentials.ts | 14 +++++++----- packages/features/ee/payments/api/webhook.ts | 8 ++++++- .../handleRescheduleEventManager.ts | 22 +++++++++++++++++-- .../roundRobinManualReassignment.ts | 11 ++-------- packages/lib/payment/handlePaymentSuccess.ts | 7 +++++- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts index 75078772160cf9..28d5a81f454af9 100644 --- a/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts +++ b/packages/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials.ts @@ -7,18 +7,20 @@ import { credentialForCalendarServiceSelect } from "@calcom/prisma/selects/crede import type { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import type { CredentialPayload } from "@calcom/types/Credential"; +export type EventType = { + userId?: number | null; + team?: { id: number | null; parentId: number | null } | null; + parentId?: number | null; + metadata: z.infer; +} | null; + /** * Gets credentials from the user, team, and org if applicable * */ export const getAllCredentials = async ( user: { id: number; username: string | null; email: string; credentials: CredentialPayload[] }, - eventType: { - userId?: number | null; - team?: { id: number | null; parentId: number | null } | null; - parentId?: number | null; - metadata: z.infer; - } | null + eventType: EventType ) => { let allCredentials = user.credentials; diff --git a/packages/features/ee/payments/api/webhook.ts b/packages/features/ee/payments/api/webhook.ts index 2474b010dd64f4..a2ef384d033c24 100644 --- a/packages/features/ee/payments/api/webhook.ts +++ b/packages/features/ee/payments/api/webhook.ts @@ -1,4 +1,5 @@ import type { Prisma } from "@prisma/client"; +import { getAllCredentials } from "bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { buffer } from "micro"; import type { NextApiRequest, NextApiResponse } from "next"; import type Stripe from "stripe"; @@ -72,7 +73,12 @@ const handleSetupSuccess = async (event: Stripe.Event) => { }, }); if (!requiresConfirmation) { - const eventManager = new EventManager(user, eventType?.metadata?.apps); + const allCredentials = await getAllCredentials(user, eventType); + + const eventManager = new EventManager( + { ...user, credentials: allCredentials }, + eventType?.metadata?.apps + ); const scheduleResult = await eventManager.create(evt); bookingData.references = { create: scheduleResult.referencesToCreate }; bookingData.status = BookingStatus.ACCEPTED; diff --git a/packages/features/ee/round-robin/handleRescheduleEventManager.ts b/packages/features/ee/round-robin/handleRescheduleEventManager.ts index afda6e3f9d26cc..e8de6ff1c76018 100644 --- a/packages/features/ee/round-robin/handleRescheduleEventManager.ts +++ b/packages/features/ee/round-robin/handleRescheduleEventManager.ts @@ -1,10 +1,12 @@ import type { DestinationCalendar } from "@prisma/client"; import type { Prisma } from "@prisma/client"; +import { getAllCredentials } from "bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { metadata as GoogleMeetMetadata } from "@calcom/app-store/googlevideo/_metadata"; import { MeetLocationType } from "@calcom/app-store/locations"; import EventManager from "@calcom/core/EventManager"; import type { EventManagerInitParams } from "@calcom/core/EventManager"; +import type { EventType } from "@calcom/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { getVideoCallDetails } from "@calcom/features/bookings/lib/handleNewBooking/getVideoCallDetails"; import { getVideoCallUrlFromCalEvent } from "@calcom/lib/CalEventParser"; import logger from "@calcom/lib/logger"; @@ -13,6 +15,17 @@ import { BookingReferenceRepository } from "@calcom/lib/server/repository/bookin import { prisma } from "@calcom/prisma"; import type { CalendarEvent, AdditionalInformation } from "@calcom/types/Calendar"; +type InitParams = { + user: { + id: number; + name: string | null; + email: string; + username: string | null; + } & EventManagerInitParams["user"]; + eventTypeAppMetadata?: EventManagerInitParams["eventTypeAppMetadata"]; + eventType: EventType; +}; + export const handleRescheduleEventManager = async ({ evt, rescheduleUid, @@ -30,7 +43,7 @@ export const handleRescheduleEventManager = async ({ newBookingId?: number; changedOrganizer?: boolean; previousHostDestinationCalendar?: DestinationCalendar[] | null; - initParams: EventManagerInitParams; + initParams: InitParams; bookingLocation: string | null; bookingId: number; bookingICalUID?: string | null; @@ -40,7 +53,12 @@ export const handleRescheduleEventManager = async ({ prefix: ["handleRescheduleEventManager", `${bookingId}`], }); - const eventManager = new EventManager(initParams.user, initParams?.eventTypeAppMetadata); + const allCredentials = await getAllCredentials(initParams.user, initParams?.eventType); + + const eventManager = new EventManager( + { ...initParams.user, credentials: allCredentials }, + initParams?.eventTypeAppMetadata + ); const updateManager = await eventManager.reschedule( evt, diff --git a/packages/features/ee/round-robin/roundRobinManualReassignment.ts b/packages/features/ee/round-robin/roundRobinManualReassignment.ts index a223534fbadd25..49b792dfab0c58 100644 --- a/packages/features/ee/round-robin/roundRobinManualReassignment.ts +++ b/packages/features/ee/round-robin/roundRobinManualReassignment.ts @@ -17,7 +17,6 @@ import { scheduleWorkflowReminders } from "@calcom/features/ee/workflows/lib/rem import { isPrismaObjOrUndefined } from "@calcom/lib"; import { getVideoCallUrlFromCalEvent } from "@calcom/lib/CalEventParser"; import { SENDER_NAME } from "@calcom/lib/constants"; -import { getAllDomainWideDelegationCredentialsForUser } from "@calcom/lib/domainWideDelegation/server"; import { getBookerBaseUrl } from "@calcom/lib/getBookerUrl/server"; import logger from "@calcom/lib/logger"; import { getTranslation } from "@calcom/lib/server/i18n"; @@ -268,13 +267,6 @@ export const roundRobinManualReassignment = async ({ include: { user: { select: { email: true } } }, }); - const domainWideDelegationCredentials = await getAllDomainWideDelegationCredentialsForUser({ - user: { - email: newUser.email, - id: newUser.id, - }, - }); - const previousHostDestinationCalendar = hasOrganizerChanged ? await prisma.destinationCalendar.findFirst({ where: { userId: originalOrganizer.id }, @@ -288,7 +280,8 @@ export const roundRobinManualReassignment = async ({ changedOrganizer: hasOrganizerChanged, previousHostDestinationCalendar: previousHostDestinationCalendar ? [previousHostDestinationCalendar] : [], initParams: { - user: { ...newUser, credentials: credentials.concat(domainWideDelegationCredentials) }, + user: { ...newUser, credentials: credentials }, + eventType, }, bookingId, bookingLocation, diff --git a/packages/lib/payment/handlePaymentSuccess.ts b/packages/lib/payment/handlePaymentSuccess.ts index 84db4bd57bc1ec..5ca7c3d0236121 100644 --- a/packages/lib/payment/handlePaymentSuccess.ts +++ b/packages/lib/payment/handlePaymentSuccess.ts @@ -3,6 +3,7 @@ import type { Prisma } from "@prisma/client"; import EventManager from "@calcom/core/EventManager"; import { sendScheduledEmailsAndSMS } from "@calcom/emails"; import { doesBookingRequireConfirmation } from "@calcom/features/bookings/lib/doesBookingRequireConfirmation"; +import { getAllCredentials } from "@calcom/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { handleBookingRequested } from "@calcom/features/bookings/lib/handleBookingRequested"; import { handleConfirmation } from "@calcom/features/bookings/lib/handleConfirmation"; import { HttpError as HttpCode } from "@calcom/lib/http-error"; @@ -26,7 +27,11 @@ export async function handlePaymentSuccess(paymentId: number, bookingId: number) const isConfirmed = booking.status === BookingStatus.ACCEPTED; if (isConfirmed) { - const eventManager = new EventManager(userWithCredentials, eventType?.metadata?.apps); + const allCredentials = await getAllCredentials(userWithCredentials, eventType); + const eventManager = new EventManager( + { ...userWithCredentials, credentials: allCredentials }, + eventType?.metadata?.apps + ); const scheduleResult = await eventManager.create(evt); bookingData.references = { create: scheduleResult.referencesToCreate }; } From 8193c62512f0b3fe23798d867f6e1bc5f63c21ef Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Mon, 2 Dec 2024 02:12:54 +0530 Subject: [PATCH 34/61] chore: fix import --- packages/core/CalendarManager.ts | 1 - .../features/ee/round-robin/handleRescheduleEventManager.ts | 2 +- packages/lib/domainWideDelegation/server.ts | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core/CalendarManager.ts b/packages/core/CalendarManager.ts index bb2f33362d091b..e03e51eddcf023 100644 --- a/packages/core/CalendarManager.ts +++ b/packages/core/CalendarManager.ts @@ -49,7 +49,6 @@ export const getConnectedCalendars = async ( calendarCredentials.map(async (item) => { try { const { integration, credential } = item; - console.log("credential", credential); const calendar = await item.calendar; // Don't leak credentials to the client const credentialId = credential.id; diff --git a/packages/features/ee/round-robin/handleRescheduleEventManager.ts b/packages/features/ee/round-robin/handleRescheduleEventManager.ts index e8de6ff1c76018..1bd158036af18d 100644 --- a/packages/features/ee/round-robin/handleRescheduleEventManager.ts +++ b/packages/features/ee/round-robin/handleRescheduleEventManager.ts @@ -1,11 +1,11 @@ import type { DestinationCalendar } from "@prisma/client"; import type { Prisma } from "@prisma/client"; -import { getAllCredentials } from "bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { metadata as GoogleMeetMetadata } from "@calcom/app-store/googlevideo/_metadata"; import { MeetLocationType } from "@calcom/app-store/locations"; import EventManager from "@calcom/core/EventManager"; import type { EventManagerInitParams } from "@calcom/core/EventManager"; +import { getAllCredentials } from "@calcom/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import type { EventType } from "@calcom/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { getVideoCallDetails } from "@calcom/features/bookings/lib/handleNewBooking/getVideoCallDetails"; import { getVideoCallUrlFromCalEvent } from "@calcom/lib/CalEventParser"; diff --git a/packages/lib/domainWideDelegation/server.ts b/packages/lib/domainWideDelegation/server.ts index c814d63921b968..819bf1a824d76a 100644 --- a/packages/lib/domainWideDelegation/server.ts +++ b/packages/lib/domainWideDelegation/server.ts @@ -107,7 +107,6 @@ export async function getAllDomainWideDelegationCredentialsForUser({ : []; log.debug("Returned", { domainWideDelegationCredentials }); - console.log("domainWideDelegationCredentials", domainWideDelegationCredentials); return domainWideDelegationCredentials; } From 7f284e863d4d4bc309a383107ca10a776ef99690 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Mon, 2 Dec 2024 14:00:30 +0530 Subject: [PATCH 35/61] fix: installed count --- packages/app-store/_appRegistry.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/app-store/_appRegistry.ts b/packages/app-store/_appRegistry.ts index 808222771bd3c5..32b87e1a43a658 100644 --- a/packages/app-store/_appRegistry.ts +++ b/packages/app-store/_appRegistry.ts @@ -103,7 +103,10 @@ export async function getAppRegistryWithCredentials(userId: number, userAdminTea })[]; const installCountPerApp = await getInstallCountPerApp(); for await (const dbapp of dbApps) { - const allCredentials = [...dbapp.credentials, ...domainWideDelegationCredentials]; + const dbAppDomainWideDelegationCredentials = domainWideDelegationCredentials.filter( + (credential) => credential.appId === dbapp.slug + ); + const allCredentials = [...dbapp.credentials, ...dbAppDomainWideDelegationCredentials]; const app = await getAppWithMetadata(dbapp); if (!app) continue; // Skip if app isn't installed From 1169cde9691d8e9399935a88beabad7b3fa47260 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Mon, 2 Dec 2024 16:04:24 +0530 Subject: [PATCH 36/61] fix: pass event type --- .../features/ee/round-robin/roundRobinManualReassignment.ts | 2 +- packages/features/ee/round-robin/roundRobinReassignment.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/features/ee/round-robin/roundRobinManualReassignment.ts b/packages/features/ee/round-robin/roundRobinManualReassignment.ts index 49b792dfab0c58..a12875f73112a6 100644 --- a/packages/features/ee/round-robin/roundRobinManualReassignment.ts +++ b/packages/features/ee/round-robin/roundRobinManualReassignment.ts @@ -280,7 +280,7 @@ export const roundRobinManualReassignment = async ({ changedOrganizer: hasOrganizerChanged, previousHostDestinationCalendar: previousHostDestinationCalendar ? [previousHostDestinationCalendar] : [], initParams: { - user: { ...newUser, credentials: credentials }, + user: { ...newUser, credentials }, eventType, }, bookingId, diff --git a/packages/features/ee/round-robin/roundRobinReassignment.ts b/packages/features/ee/round-robin/roundRobinReassignment.ts index 709b4e8aed2b58..8c5e43b5046a1e 100644 --- a/packages/features/ee/round-robin/roundRobinReassignment.ts +++ b/packages/features/ee/round-robin/roundRobinReassignment.ts @@ -312,7 +312,8 @@ export const roundRobinReassignment = async ({ changedOrganizer: hasOrganizerChanged, previousHostDestinationCalendar: previousHostDestinationCalendar ? [previousHostDestinationCalendar] : [], initParams: { - user: { ...organizer, credentials: [...credentials] }, + user: { ...organizer, credentials }, + eventType, }, bookingId, bookingLocation, From e43500f04db0bacc85b67f4d42821480782a3c14 Mon Sep 17 00:00:00 2001 From: Udit Takkar Date: Tue, 3 Dec 2024 14:28:11 +0530 Subject: [PATCH 37/61] fix: import --- packages/features/ee/payments/api/webhook.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/features/ee/payments/api/webhook.ts b/packages/features/ee/payments/api/webhook.ts index a2ef384d033c24..d22f412121826a 100644 --- a/packages/features/ee/payments/api/webhook.ts +++ b/packages/features/ee/payments/api/webhook.ts @@ -1,5 +1,4 @@ import type { Prisma } from "@prisma/client"; -import { getAllCredentials } from "bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { buffer } from "micro"; import type { NextApiRequest, NextApiResponse } from "next"; import type Stripe from "stripe"; @@ -8,6 +7,7 @@ import stripe from "@calcom/app-store/stripepayment/lib/server"; import EventManager from "@calcom/core/EventManager"; import { sendAttendeeRequestEmailAndSMS, sendOrganizerRequestEmail } from "@calcom/emails"; import { doesBookingRequireConfirmation } from "@calcom/features/bookings/lib/doesBookingRequireConfirmation"; +import { getAllCredentials } from "@calcom/features/bookings/lib/getAllCredentialsForUsersOnEvent/getAllCredentials"; import { handleConfirmation } from "@calcom/features/bookings/lib/handleConfirmation"; import { IS_PRODUCTION } from "@calcom/lib/constants"; import { getErrorFromUnknown } from "@calcom/lib/errors"; From 2a1e1661dc06efb2840ce8886610bec9f5f2d666 Mon Sep 17 00:00:00 2001 From: Hariom Balhara Date: Tue, 3 Dec 2024 16:23:45 +0530 Subject: [PATCH 38/61] fix: [Stacked PR] Review fixes (#17958) * Review fixes * fix: destination calendar bug --------- Co-authored-by: Udit Takkar --- .../components/AppConnectionItem.tsx | 1 + .../components/ConnectedCalendarItem.tsx | 2 +- .../steps-views/ConnectedVideoStep.tsx | 9 ++- domain-wide-delegation.md | 9 ++- .../app-store/googlecalendar/_metadata.ts | 2 + packages/app-store/googlecalendar/api/add.ts | 3 + packages/app-store/utils.ts | 4 -- .../features/calendars/CalendarSwitch.tsx | 6 +- packages/features/ee/payments/api/webhook.ts | 2 + .../domainWideDelegation/clientAndServer.ts | 6 +- packages/lib/domainWideDelegation/server.ts | 65 +++++++++--------- .../server/repository/destinationCalendar.ts | 68 ++++++++++++++++++- packages/prisma/schema.prisma | 3 +- packages/prisma/zod-utils.ts | 1 + .../loggedInViewer/integrations.handler.ts | 19 +----- .../setDestinationCalendar.handler.ts | 26 +++---- 16 files changed, 145 insertions(+), 81 deletions(-) diff --git a/apps/web/components/getting-started/components/AppConnectionItem.tsx b/apps/web/components/getting-started/components/AppConnectionItem.tsx index 86d6d649c3cd1f..174f1941fd4459 100644 --- a/apps/web/components/getting-started/components/AppConnectionItem.tsx +++ b/apps/web/components/getting-started/components/AppConnectionItem.tsx @@ -113,6 +113,7 @@ const AppConnectionItem = (props: IAppConnectionItem) => { )} /> + {/* It is possible that app is already installed here during onboarding due to Domain Wide Delegation enabled at organization level. We allow the user to set it as default */} {installed && !isDefault && (