Merge branch 'main' into chor/text-colors+weights
# Conflicts: # yarn.lock
This commit is contained in:
commit
539489e41a
|
@ -32,12 +32,12 @@ jobs:
|
|||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: test-results-core
|
||||
name: test-results-embed-core
|
||||
path: packages/embeds/embed-core/playwright/results
|
||||
|
||||
- name: Upload embed-react results
|
||||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: test-results-react
|
||||
name: test-results-embed-react
|
||||
path: packages/embeds/embed-react/playwright/results
|
||||
|
|
|
@ -2,38 +2,20 @@
|
|||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Next.js: Server",
|
||||
"type": "node-terminal",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"command": "npm run dev",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/**/*.js",
|
||||
"!**/node_modules/**"
|
||||
],
|
||||
"sourceMaps": true,
|
||||
"resolveSourceMapLocations": [
|
||||
"${workspaceFolder}/**",
|
||||
"!**/node_modules/**"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Next.js: Client",
|
||||
"type": "pwa-chrome",
|
||||
"request": "launch",
|
||||
"url": "http://localhost:3000"
|
||||
},
|
||||
{
|
||||
"name": "Next.js: Full Stack",
|
||||
"type": "node-terminal",
|
||||
"request": "launch",
|
||||
"command": "npm run dev",
|
||||
"name": "Next.js Node Debug",
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/next/dist/bin/next",
|
||||
"env": {
|
||||
"NODE_OPTIONS": "--inspect"
|
||||
},
|
||||
"cwd": "${workspaceFolder}/apps/web",
|
||||
"console": "integratedTerminal",
|
||||
"serverReadyAction": {
|
||||
"pattern": "started server on .+, url: (https?://.+)",
|
||||
"uriFormat": "%s",
|
||||
"action": "debugWithChrome"
|
||||
"sourceMapPathOverrides": {
|
||||
"meteor://💻app/*": "${workspaceFolder}/*",
|
||||
"webpack:///./~/*": "${workspaceFolder}/node_modules/*",
|
||||
"webpack://?:*/*": "${workspaceFolder}/*"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -128,6 +128,6 @@ If you get errors, be sure to fix them before committing.
|
|||
## Making a Pull Request
|
||||
|
||||
- Be sure to [check the "Allow edits from maintainers" option](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) while creating you PR.
|
||||
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. Se more about [Linking a pull request to an issue
|
||||
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. See more about [Linking a pull request to an issue
|
||||
](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
|
||||
- Be sure to fill the PR Template accordingly.
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
"@hookform/resolvers": "^2.9.7",
|
||||
"@next-auth/prisma-adapter": "^1.0.4",
|
||||
"@next/bundle-analyzer": "^13.1.6",
|
||||
"@next/font": "^13.1.6",
|
||||
"@radix-ui/react-avatar": "^1.0.0",
|
||||
"@radix-ui/react-collapsible": "^1.0.0",
|
||||
"@radix-ui/react-dialog": "^1.0.0",
|
||||
|
@ -76,6 +75,7 @@
|
|||
"handlebars": "^4.7.7",
|
||||
"ical.js": "^1.4.0",
|
||||
"ics": "^2.37.0",
|
||||
"jose": "^4.13.1",
|
||||
"kbar": "^0.1.0-beta.36",
|
||||
"libphonenumber-js": "^1.10.12",
|
||||
"lodash": "^4.17.21",
|
||||
|
|
|
@ -2,6 +2,7 @@ import type { UserPermissionRole } from "@prisma/client";
|
|||
import { IdentityProvider } from "@prisma/client";
|
||||
import { readFileSync } from "fs";
|
||||
import Handlebars from "handlebars";
|
||||
import { SignJWT } from "jose";
|
||||
import type { Session } from "next-auth";
|
||||
import NextAuth from "next-auth";
|
||||
import { encode } from "next-auth/jwt";
|
||||
|
@ -18,7 +19,7 @@ import checkLicense from "@calcom/features/ee/common/server/checkLicense";
|
|||
import ImpersonationProvider from "@calcom/features/ee/impersonation/lib/ImpersonationProvider";
|
||||
import { hostedCal, isSAMLLoginEnabled } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { ErrorCode, isPasswordValid, verifyPassword } from "@calcom/lib/auth";
|
||||
import { APP_NAME, IS_TEAM_BILLING_ENABLED, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { APP_NAME, IS_TEAM_BILLING_ENABLED, WEBAPP_URL, WEBSITE_URL } from "@calcom/lib/constants";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import { defaultCookies } from "@calcom/lib/default-cookies";
|
||||
import { randomString } from "@calcom/lib/random";
|
||||
|
@ -38,6 +39,21 @@ const transporter = nodemailer.createTransport<TransportOptions>({
|
|||
|
||||
const usernameSlug = (username: string) => slugify(username) + "-" + randomString(6).toLowerCase();
|
||||
|
||||
const signJwt = async (payload: { email: string }) => {
|
||||
const secret = new TextEncoder().encode(process.env.CALENDSO_ENCRYPTION_KEY);
|
||||
return new SignJWT(payload)
|
||||
.setProtectedHeader({ alg: "HS256" })
|
||||
.setSubject(payload.email)
|
||||
.setIssuedAt()
|
||||
.setIssuer(WEBSITE_URL)
|
||||
.setAudience(`${WEBSITE_URL}/auth/login`)
|
||||
.setExpirationTime("2m")
|
||||
.sign(secret);
|
||||
};
|
||||
|
||||
const loginWithTotp = async (user: { email: string }) =>
|
||||
`/auth/login?totp=${await signJwt({ email: user.email })}`;
|
||||
|
||||
const providers: Provider[] = [
|
||||
CredentialsProvider({
|
||||
id: "credentials",
|
||||
|
@ -82,17 +98,19 @@ const providers: Provider[] = [
|
|||
throw new Error(ErrorCode.IncorrectUsernamePassword);
|
||||
}
|
||||
|
||||
if (user.identityProvider !== IdentityProvider.CAL) {
|
||||
if (user.identityProvider !== IdentityProvider.CAL && !credentials.totpCode) {
|
||||
throw new Error(ErrorCode.ThirdPartyIdentityProviderEnabled);
|
||||
}
|
||||
|
||||
if (!user.password) {
|
||||
if (!user.password && user.identityProvider !== IdentityProvider.CAL && !credentials.totpCode) {
|
||||
throw new Error(ErrorCode.IncorrectUsernamePassword);
|
||||
}
|
||||
|
||||
const isCorrectPassword = await verifyPassword(credentials.password, user.password);
|
||||
if (!isCorrectPassword) {
|
||||
throw new Error(ErrorCode.IncorrectUsernamePassword);
|
||||
if (user.password) {
|
||||
const isCorrectPassword = await verifyPassword(credentials.password, user.password);
|
||||
if (!isCorrectPassword) {
|
||||
throw new Error(ErrorCode.IncorrectUsernamePassword);
|
||||
}
|
||||
}
|
||||
|
||||
if (user.twoFactorEnabled) {
|
||||
|
@ -130,7 +148,7 @@ const providers: Provider[] = [
|
|||
await limiter.check(10, user.email); // 10 requests per minute
|
||||
// Check if the user you are logging into has any active teams
|
||||
const hasActiveTeams =
|
||||
user.teams.filter((m) => {
|
||||
user.teams.filter((m: { team: { metadata: unknown } }) => {
|
||||
if (!IS_TEAM_BILLING_ENABLED) return true;
|
||||
const metadata = teamMetadataSchema.safeParse(m.team.metadata);
|
||||
if (metadata.success && metadata.data?.subscriptionId) return true;
|
||||
|
@ -449,7 +467,11 @@ export default NextAuth({
|
|||
console.error("Error while linking account of already existing user");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
if (existingUser.twoFactorEnabled) {
|
||||
return loginWithTotp(existingUser);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// If the email address doesn't match, check if an account already exists
|
||||
|
@ -461,7 +483,11 @@ export default NextAuth({
|
|||
|
||||
if (!userWithNewEmail) {
|
||||
await prisma.user.update({ where: { id: existingUser.id }, data: { email: user.email } });
|
||||
return true;
|
||||
if (existingUser.twoFactorEnabled) {
|
||||
return loginWithTotp(existingUser);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
return "/auth/error?error=new-email-conflict";
|
||||
}
|
||||
|
@ -477,7 +503,11 @@ export default NextAuth({
|
|||
if (existingUserWithEmail) {
|
||||
// if self-hosted then we can allow auto-merge of identity providers if email is verified
|
||||
if (!hostedCal && existingUserWithEmail.emailVerified) {
|
||||
return true;
|
||||
if (existingUserWithEmail.twoFactorEnabled) {
|
||||
return loginWithTotp(existingUserWithEmail);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// check if user was invited
|
||||
|
@ -499,7 +529,11 @@ export default NextAuth({
|
|||
},
|
||||
});
|
||||
|
||||
return true;
|
||||
if (existingUserWithEmail.twoFactorEnabled) {
|
||||
return loginWithTotp(existingUserWithEmail);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// User signs up with email/password and then tries to login with Google/SAML using the same email
|
||||
|
@ -511,7 +545,11 @@ export default NextAuth({
|
|||
where: { email: existingUserWithEmail.email },
|
||||
data: { password: null },
|
||||
});
|
||||
return true;
|
||||
if (existingUserWithEmail.twoFactorEnabled) {
|
||||
return loginWithTotp(existingUserWithEmail);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else if (existingUserWithEmail.identityProvider === IdentityProvider.CAL) {
|
||||
return "/auth/error?error=use-password-login";
|
||||
}
|
||||
|
@ -534,7 +572,11 @@ export default NextAuth({
|
|||
const linkAccountNewUserData = { ...account, userId: newUser.id };
|
||||
await calcomAdapter.linkAccount(linkAccountNewUserData);
|
||||
|
||||
return true;
|
||||
if (account.twoFactorEnabled) {
|
||||
return loginWithTotp(newUser);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { z } from "zod";
|
||||
|
||||
import { fetcher } from "@calcom/app-store/dailyvideo/lib/VideoApiAdapter";
|
||||
import { getSession } from "@calcom/lib/auth";
|
||||
import { IS_SELF_HOSTED } from "@calcom/lib/constants";
|
||||
import { defaultHandler, defaultResponder } from "@calcom/lib/server";
|
||||
|
||||
const getAccessLinkSchema = z.object({
|
||||
download_link: z.string().url(),
|
||||
// expires (timestamp), s3_bucket, s3_region, s3_key
|
||||
});
|
||||
|
||||
const requestQuery = z.object({
|
||||
recordingId: z.string(),
|
||||
});
|
||||
|
||||
const isDownloadAllowed = async (req: NextApiRequest) => {
|
||||
if (IS_SELF_HOSTED) return true;
|
||||
const session = await getSession({ req });
|
||||
// Check if user belong to active team
|
||||
return !session?.user?.belongsToActiveTeam;
|
||||
};
|
||||
|
||||
async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse<z.infer<typeof getAccessLinkSchema> | void>
|
||||
) {
|
||||
const { recordingId } = requestQuery.parse(req.query);
|
||||
|
||||
if (!(await isDownloadAllowed(req))) return res.status(403);
|
||||
|
||||
const response = await fetcher(`/recordings/${recordingId}/access-link`).then(getAccessLinkSchema.parse);
|
||||
return res.status(200).json(response);
|
||||
}
|
||||
|
||||
export default defaultHandler({
|
||||
GET: Promise.resolve({ default: defaultResponder(handler) }),
|
||||
});
|
|
@ -1,4 +1,5 @@
|
|||
import classNames from "classnames";
|
||||
import { jwtVerify } from "jose";
|
||||
import type { GetServerSidePropsContext } from "next";
|
||||
import { getCsrfToken, signIn } from "next-auth/react";
|
||||
import Link from "next/link";
|
||||
|
@ -42,14 +43,14 @@ export default function Login({
|
|||
isSAMLLoginEnabled,
|
||||
samlTenantID,
|
||||
samlProductID,
|
||||
totpEmail,
|
||||
}: inferSSRProps<typeof _getServerSideProps> & WithNonceProps) {
|
||||
const { t } = useLocale();
|
||||
const router = useRouter();
|
||||
const methods = useForm<LoginValues>();
|
||||
|
||||
const { register, formState } = methods;
|
||||
|
||||
const [twoFactorRequired, setTwoFactorRequired] = useState(false);
|
||||
const [twoFactorRequired, setTwoFactorRequired] = useState(!!totpEmail || false);
|
||||
const [errorMessage, setErrorMessage] = useState<string | null>(null);
|
||||
|
||||
const errorMessages: { [key: string]: string } = {
|
||||
|
@ -94,6 +95,16 @@ export default function Login({
|
|||
</Button>
|
||||
);
|
||||
|
||||
const ExternalTotpFooter = (
|
||||
<Button
|
||||
onClick={() => {
|
||||
window.location.replace("/");
|
||||
}}
|
||||
color="minimal">
|
||||
{t("cancel")}
|
||||
</Button>
|
||||
);
|
||||
|
||||
const onSubmit = async (values: LoginValues) => {
|
||||
setErrorMessage(null);
|
||||
telemetry.event(telemetryEventTypes.login, collectPageParameters());
|
||||
|
@ -120,7 +131,9 @@ export default function Login({
|
|||
heading={twoFactorRequired ? t("2fa_code") : t("welcome_back")}
|
||||
footerText={
|
||||
twoFactorRequired
|
||||
? TwoFactorFooter
|
||||
? !totpEmail
|
||||
? TwoFactorFooter
|
||||
: ExternalTotpFooter
|
||||
: process.env.NEXT_PUBLIC_DISABLE_SIGNUP !== "true"
|
||||
? LoginFooter
|
||||
: null
|
||||
|
@ -135,7 +148,7 @@ export default function Login({
|
|||
<EmailField
|
||||
id="email"
|
||||
label={t("email_address")}
|
||||
defaultValue={router.query.email as string}
|
||||
defaultValue={totpEmail || (router.query.email as string)}
|
||||
placeholder="john.doe@example.com"
|
||||
required
|
||||
{...register("email")}
|
||||
|
@ -152,7 +165,7 @@ export default function Login({
|
|||
<PasswordField
|
||||
id="password"
|
||||
autoComplete="off"
|
||||
required
|
||||
required={!totpEmail}
|
||||
className="mb-0"
|
||||
{...register("password")}
|
||||
/>
|
||||
|
@ -211,6 +224,40 @@ const _getServerSideProps = async function getServerSideProps(context: GetServer
|
|||
const session = await getSession({ req });
|
||||
const ssr = await ssrInit(context);
|
||||
|
||||
const verifyJwt = (jwt: string) => {
|
||||
const secret = new TextEncoder().encode(process.env.CALENDSO_ENCRYPTION_KEY);
|
||||
|
||||
return jwtVerify(jwt, secret, {
|
||||
issuer: WEBSITE_URL,
|
||||
audience: `${WEBSITE_URL}/auth/login`,
|
||||
algorithms: ["HS256"],
|
||||
});
|
||||
};
|
||||
|
||||
let totpEmail = null;
|
||||
if (context.query.totp) {
|
||||
try {
|
||||
const decryptedJwt = await verifyJwt(context.query.totp as string);
|
||||
if (decryptedJwt.payload) {
|
||||
totpEmail = decryptedJwt.payload.email as string;
|
||||
} else {
|
||||
return {
|
||||
redirect: {
|
||||
destination: "/auth/error?error=JWT%20Invalid%20Payload",
|
||||
permanent: false,
|
||||
},
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
return {
|
||||
redirect: {
|
||||
destination: "/auth/error?error=Invalid%20JWT%3A%20Please%20try%20again",
|
||||
permanent: false,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (session) {
|
||||
return {
|
||||
redirect: {
|
||||
|
@ -238,6 +285,7 @@ const _getServerSideProps = async function getServerSideProps(context: GetServer
|
|||
isSAMLLoginEnabled,
|
||||
samlTenantID,
|
||||
samlProductID,
|
||||
totpEmail,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1551,7 +1551,71 @@
|
|||
"setup_description": "Configuração da instância Cal.com",
|
||||
"configure": "Configurar",
|
||||
"sso_configuration": "Configuração SAML",
|
||||
"sso_configuration_description": "Configurar o SSO SAML/OIDC e permitir que os membros da equipa se autentiquem utilizando um fornecedor de identidades",
|
||||
"sso_oidc_heading": "SSO com OIDC",
|
||||
"sso_oidc_description": "Configurar o SSO OIDC com o fornecedor de identidades à sua escolha.",
|
||||
"sso_oidc_configuration_title": "Configuração do OIDC",
|
||||
"sso_oidc_configuration_description": "Configurar a ligação OIDC com o seu fornecedor de identidades. Pode encontrar as informações necessárias no seu fornecedor de identidades.",
|
||||
"sso_oidc_callback_copied": "Endereço de retorno (callback URL) copiado",
|
||||
"sso_saml_heading": "SSO com SAML",
|
||||
"sso_saml_description": "Configurar o SSO SAML com o fornecedor de identidades à sua escolha.",
|
||||
"sso_saml_configuration_title": "Configuração do SAML",
|
||||
"sso_saml_configuration_description": "Configurar a ligação SAML com o seu fornecedor de identidades. Pode encontrar as informações necessárias no seu fornecedor de identidades.",
|
||||
"sso_saml_acsurl_copied": "Endereço do ACS copiado",
|
||||
"sso_saml_entityid_copied": "ID da entidade copiada",
|
||||
"sso_connection_created_successfully": "Configuração {{connectionType}} criada com sucesso",
|
||||
"sso_connection_deleted_successfully": "Configuração {{connectionType}} eliminada com sucesso",
|
||||
"delete_sso_configuration": "Eliminar configuração {{connectionType}}",
|
||||
"delete_sso_configuration_confirmation": "Sim, eliminar configuração {{connectionType}}",
|
||||
"delete_sso_configuration_confirmation_description": "Tem a certeza que pretende eliminar a configuração {{connectionType}}? Os membros da sua equipa que utilizem {{connectionType}} para o início de sessão deixarão de poder aceder a Cal.com.",
|
||||
"organizer_timezone": "Fuso horário do organizador",
|
||||
"email_no_user_cta": "Crie a sua conta",
|
||||
"email_user_cta": "Ver convite",
|
||||
"email_no_user_invite_heading": "Recebeu um convite para fazer parte de uma equipa em {{appName}}",
|
||||
"email_no_user_invite_subheading": "Recebeu um convite de {{invitedBy}} para fazer parte da respetiva equipa em {{appName}}. {{appName}} é um ferramenta de conciliação e agendamento de eventos que lhe permite a si e à sua equipa agendar reuniões sem o pingue-pongue de e-mails.",
|
||||
"email_no_user_invite_steps_intro": "Vamos ajudar com alguns pequenos passos para que você e a sua equipa possam desfrutar rapidamente de uma gestão de agendamentos sem complicações.",
|
||||
"email_no_user_step_one": "Escolha o seu nome de utilizador",
|
||||
"email_no_user_step_two": "Associe a sua conta de calendário",
|
||||
"email_no_user_step_three": "Defina a sua Disponibilidade",
|
||||
"email_no_user_step_four": "Junte-se a {{teamName}}",
|
||||
"email_no_user_signoff": "Votos de bons agendamentos, da equipa {{appName}}",
|
||||
"impersonation_user_tip": "Está em vias de assumir o papel de um utilizador, o que significa que poderá fazer alterações em seu nome. Por favor, tenha cuidado.",
|
||||
"available_variables": "Variáveis disponíveis",
|
||||
"scheduler": "{Scheduler}",
|
||||
"recommended_next_steps": "Próximos passos recomendados",
|
||||
"create_a_managed_event": "Criar um tipo de evento gerido",
|
||||
"meetings_are_better_with_the_right": "Os eventos são melhores com os elementos certos da equipa. Convide-os agora.",
|
||||
"collective_or_roundrobin": "Coletiva ou rotativa",
|
||||
"book_your_team_members": "Associe os elementos da sua equipa a eventos coletivos ou rode pela equipa com utilização de uma distribuição equilibrada para obter a pessoa certa.",
|
||||
"default_app_link_title": "Definir uma ligação predefinida de aplicação",
|
||||
"default_app_link_description": "Ao definir uma ligação predefinida da aplicação, permite que todos os tipos de eventos recém-criados utilizem a ligação de aplicação que definiu.",
|
||||
"change_default_conferencing_app": "Predefinir",
|
||||
"booking_confirmation_failed": "A confirmação da reserva falhou"
|
||||
"under_maintenance": "Em manutenção",
|
||||
"under_maintenance_description": "A equipa {{appName}} está a executar uma operação de manutenção programada. Se tiver alguma dúvida, por favor, entre em contacto com o suporte.",
|
||||
"event_type_seats": "{{numberOfSeats}} lugares",
|
||||
"booking_with_payment_cancelled": "Já não é possível pagar para este evento",
|
||||
"booking_with_payment_cancelled_already_paid": "Está a ser processado um reembolso do pagamento desta reserva.",
|
||||
"booking_with_payment_cancelled_refunded": "Foi feito um reembolso do pagamento desta reserva.",
|
||||
"booking_confirmation_failed": "A confirmação da reserva falhou",
|
||||
"get_started_zapier_templates": "Comece a utilizar os modelos Zapier",
|
||||
"a_routing_form": "Um formulário de encaminhamento",
|
||||
"form_description_placeholder": "Descrição do formulário",
|
||||
"keep_me_connected_with_form": "Manter-me associado ao formulário",
|
||||
"fields_in_form_duplicated": "Quaisquer alterações no Encaminhador e Campos do formulário que esteja a ser duplicado, irão refletir-se na duplicação.",
|
||||
"form_deleted": "Formulário eliminado",
|
||||
"delete_form": "Eliminar formulário",
|
||||
"delete_form_action": "Sim, eliminar formulário",
|
||||
"delete_form_confirmation": "Tem a certeza que pretende eliminar este formulário? Qualquer pessoa com quem tiver partilhado a ligação deixará de poder fazer reservas com o mesmo. Além disto, todas as respostas associadas serão também eliminadas.",
|
||||
"typeform_redirect_url_copied": "Endereço de redirecionamento para o Typeform copiado! Pode definir o endereço no formulário do Typeform.",
|
||||
"modifications_in_fields_warning": "As modificações nos campos e rotas dos seguintes formulários serão refletidas neste formulário.",
|
||||
"connected_forms": "Formulários associados",
|
||||
"form_modifications_warning": "Seguintes formulários serão afetados quando modificar campos ou rotas aqui.",
|
||||
"responses_collection_waiting_description": "Aguarde algum tempo até que as respostas sejam recolhidas. Pode também submeter o formulário por si próprio.",
|
||||
"this_is_what_your_users_would_see": "Isto é o que os seus utilizadores vão ver",
|
||||
"identifies_name_field": "Identifica o campo por este nome.",
|
||||
"add_1_option_per_line": "Adicionar 1 opção por linha",
|
||||
"select_a_router": "Selecionar um roteador",
|
||||
"add_a_new_route": "Adicionar uma nova Rota",
|
||||
"no_responses_yet": "Ainda sem respostas",
|
||||
"this_will_be_the_placeholder": "Isto será o marcador de posição"
|
||||
}
|
||||
|
|
|
@ -1290,6 +1290,7 @@
|
|||
"routing_forms_send_email_owner": "Sahibine E-posta Gönderin",
|
||||
"routing_forms_send_email_owner_description": "Form gönderildiğinde sahibine bir e-posta gönderir",
|
||||
"add_new_form": "Yeni form ekle",
|
||||
"create_your_first_route": "İlk yönlendirmenizi oluşturun",
|
||||
"route_to_the_right_person": "Formunuza verilen yanıtlara göre doğru kişiye yönlendirin",
|
||||
"form_description": "Rezervasyon yapan kişiyi yönlendirmek için formunuzu oluşturun",
|
||||
"copy_link_to_form": "Bağlantıyı forma kopyala",
|
||||
|
@ -1321,6 +1322,7 @@
|
|||
"password_reset_leading": "Kısa süre içinde bir e-posta almazsanız, lütfen girdiğiniz e-posta adresinin doğru olup olmadığını ve spam klasörünüzü kontrol edin veya sorunun devam etmesi halinde destek ekibi ile iletişime geçin.",
|
||||
"password_updated": "Şifre güncellendi!",
|
||||
"pending_payment": "Bekleyen ödeme",
|
||||
"pending_invites": "Bekleyen Davetler",
|
||||
"confirmation_page_rainbow": "Ethereum, Polygon ve diğer token'lar veya NFT ile etkinliğinize token kapısı ekleyin.",
|
||||
"not_on_cal": "{{appName}}'da değil",
|
||||
"no_calendar_installed": "Yüklü takvim yok",
|
||||
|
@ -1448,6 +1450,8 @@
|
|||
"enable_apps": "Uygulamaları Etkinleştir",
|
||||
"enable_apps_description": "Kullanıcıların Cal.com ile entegre edebileceği uygulamaları etkinleştirin",
|
||||
"purchase_license": "Lisans satın alın",
|
||||
"already_have_key": "Zaten bir anahtarım var:",
|
||||
"already_have_key_suggestion": "Lütfen mevcut CALCOM_LICENSE_KEY ortam değişkeninizi buraya kopyalayın.",
|
||||
"app_is_enabled": "{{appName}} etkinleştirildi",
|
||||
"app_is_disabled": "{{appName}} devre dışı bırakıldı",
|
||||
"keys_have_been_saved": "Anahtarlar kaydedildi",
|
||||
|
@ -1519,13 +1523,73 @@
|
|||
"sender_name": "Gönderenin adı",
|
||||
"already_invited": "Katılımcı zaten davet edildi",
|
||||
"no_recordings_found": "Kayıt bulunamadı",
|
||||
"choose_a_license": "Bir lisans seçin",
|
||||
"license": "Lisans",
|
||||
"agplv3_license": "AGPLv3 Lisansı",
|
||||
"free_license_fee": "0,00 $/ay",
|
||||
"no_enterprise_features": "Kurumsal özellik yok",
|
||||
"setup": "Kurulum",
|
||||
"setup_description": "Cal.com örneğini kurun",
|
||||
"configure": "Yapılandır",
|
||||
"sso_configuration": "Çoklu Oturum Açma",
|
||||
"sso_configuration_description": "SAML/OIDC SSO'yu yapılandırın ve ekip üyelerinin bir Kimlik Sağlayıcı kullanarak oturum açmasına izin verin",
|
||||
"sso_oidc_heading": "OIDC ile SSO",
|
||||
"sso_oidc_description": "Seçtiğiniz Kimlik Sağlayıcı ile OIDC SSO'yu yapılandırın.",
|
||||
"sso_oidc_configuration_title": "OIDC Yapılandırması",
|
||||
"sso_oidc_configuration_description": "Kimlik sağlayıcınızla OIDC bağlantısını yapılandırın. Gerekli bilgileri kimlik sağlayıcınızdan bulabilirsiniz.",
|
||||
"sso_oidc_callback_copied": "Geri arama URL'si kopyalandı",
|
||||
"sso_saml_heading": "SAML ile SSO",
|
||||
"sso_saml_description": "Seçtiğiniz Kimlik Sağlayıcı ile OIDC SSO'yu yapılandırın.",
|
||||
"sso_saml_configuration_title": "SAML Yapılandırması",
|
||||
"sso_saml_configuration_description": "Kimlik sağlayıcınızla SAML bağlantısını yapılandırın. Gerekli bilgileri kimlik sağlayıcınızdan bulabilirsiniz.",
|
||||
"sso_saml_acsurl_copied": "ACS URL'si kopyalandı",
|
||||
"sso_saml_entityid_copied": "Kayıt Kimliği kopyalandı",
|
||||
"sso_connection_created_successfully": "{{connectionType}} yapılandırması başarıyla oluşturuldu",
|
||||
"sso_connection_deleted_successfully": "{{connectionType}} yapılandırması başarıyla silindi",
|
||||
"delete_sso_configuration": "{{connectionType}} yapılandırmasını sil",
|
||||
"delete_sso_configuration_confirmation": "Evet, {{connectionType}} yapılandırmasını sil",
|
||||
"delete_sso_configuration_confirmation_description": "{{connectionType}} yapılandırmasını silmek istediğinizden emin misiniz? {{connectionType}} girişini kullanan ekip üyeleriniz artık Cal.com'a erişemeyecek.",
|
||||
"email_no_user_cta": "Hesabınızı oluşturun",
|
||||
"email_user_cta": "Daveti görüntüle",
|
||||
"email_no_user_invite_heading": "{{appName}} uygulamasındaki bir ekibe katılmaya davet edildiniz",
|
||||
"email_no_user_invite_subheading": "{{invitedBy}}, sizi {{appName}} ekibine katılmaya davet etti. {{appName}}, size ve ekibinize e-posta iletişimine ihtiyaç duymadan toplantı planlama yapma olanağı sağlayan bir etkinlik planlama aracıdır.",
|
||||
"email_no_user_step_one": "Kullanıcı adınızı seçin",
|
||||
"email_no_user_step_three": "Müsaitlik durumunuzu ayarlayın",
|
||||
"email_no_user_step_four": "{{teamName}} ekibine katılın",
|
||||
"email_no_user_signoff": "{{appName}} ekibinden Mutlu Planlamalar",
|
||||
"impersonation_user_tip": "Bir kullanıcının kimliğine bürünmek üzeresiniz. Bu, onun adına değişiklikler yapabileceğiniz anlamına gelir. Lütfen dikkatli olun.",
|
||||
"available_variables": "Mevcut değişkenler",
|
||||
"scheduler": "{Scheduler}",
|
||||
"recommended_next_steps": "Önerilen sonraki adımlar",
|
||||
"create_a_managed_event": "Yönetilen bir olay türü oluşturun",
|
||||
"meetings_are_better_with_the_right": "Doğru ekip üyelerinin bir araya geldiği toplantılar daha iyidir. Onları şimdi davet edin.",
|
||||
"default_app_link_title": "Varsayılan uygulama bağlantısını ayarlayın",
|
||||
"default_app_link_description": "Varsayılan uygulama bağlantısını ayarlamak, yeni oluşturulan tüm etkinlik türlerinin ayarladığınız uygulama bağlantısını kullanmasına olanak tanır.",
|
||||
"change_default_conferencing_app": "Varsayılan olarak ayarla",
|
||||
"under_maintenance": "Bakım altında",
|
||||
"under_maintenance_description": "{{appName}} ekibi planlı bir bakım çalışmasını gerçekleştiriyor. Herhangi bir sorunuz varsa lütfen desteğe başvurun.",
|
||||
"event_type_seats": "{{numberOfSeats}} yer",
|
||||
"booking_with_payment_cancelled": "Artık bu etkinlik için ödeme yapılamıyor",
|
||||
"booking_with_payment_cancelled_already_paid": "Bu rezervasyon ödemesi için iade işlemi devam ediyor.",
|
||||
"booking_with_payment_cancelled_refunded": "Bu rezervasyon ödemesi iade edildi.",
|
||||
"booking_confirmation_failed": "Rezervasyon onayı yapılamadı",
|
||||
"get_started_zapier_templates": "Zapier şablonlarını kullanmaya başlayın",
|
||||
"a_routing_form": "Yönlendirme Formu",
|
||||
"form_description_placeholder": "Form Açıklaması",
|
||||
"form_deleted": "Form silindi",
|
||||
"delete_form": "Formu sil",
|
||||
"delete_form_action": "Evet, Formu sil"
|
||||
"delete_form_action": "Evet, Formu sil",
|
||||
"delete_form_confirmation": "Bu formu silmek istediğinizden emin misiniz? Bağlantıyı paylaştığınız hiç kimse artık bu formu kullanarak rezervasyon yapamayacak. Ayrıca, tüm ilişkili yanıtlar silinecek.",
|
||||
"typeform_redirect_url_copied": "Typeform Yönlendirme URL'si kopyalandı! Adrese giderek Typeform formundaki URL'yi ayarlayabilirsiniz.",
|
||||
"modifications_in_fields_warning": "Aşağıdaki formların alan ve yönlendirme seçeneklerindeki değişiklikler bu forma aktarılacaktır.",
|
||||
"connected_forms": "Bağlı Formlar",
|
||||
"form_modifications_warning": "Buradaki alanları veya yönlendirmeleri değiştirdiğinizde aşağıdaki formlar etkilenecektir.",
|
||||
"responses_collection_waiting_description": "Yanıtların toplanması için bir süre bekleyin. Adrese giderek formu kendiniz de gönderebilirsiniz.",
|
||||
"this_is_what_your_users_would_see": "Kullanıcılarınızın göreceği şey bu",
|
||||
"identifies_name_field": "Alanı bu ada göre tanımlar.",
|
||||
"add_1_option_per_line": "Satır başına 1 seçenek ekle",
|
||||
"select_a_router": "Bir yönlendirici seçin",
|
||||
"add_a_new_route": "Yeni bir Yönlendirme ekle",
|
||||
"no_responses_yet": "Henüz yanıt yok",
|
||||
"this_will_be_the_placeholder": "Bu yer tutucu olacak"
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { z } from "zod";
|
||||
|
||||
import { handleErrorsJson } from "@calcom/lib/errors";
|
||||
import type { GetRecordingsResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import { getRecordingsResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { GetRecordingsResponseSchema, GetAccessLinkResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import { getRecordingsResponseSchema, getAccessLinkResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { CalendarEvent } from "@calcom/types/Calendar";
|
||||
import type { CredentialPayload } from "@calcom/types/Credential";
|
||||
import type { PartialReference } from "@calcom/types/EventManager";
|
||||
|
@ -159,6 +159,17 @@ const DailyVideoApiAdapter = (): VideoApiAdapter => {
|
|||
throw new Error("Something went wrong! Unable to get recording");
|
||||
}
|
||||
},
|
||||
getRecordingDownloadLink: async (recordingId: string): Promise<GetAccessLinkResponseSchema> => {
|
||||
try {
|
||||
const res = await fetcher(`/recordings/${recordingId}/access-link`).then(
|
||||
getAccessLinkResponseSchema.parse
|
||||
);
|
||||
return Promise.resolve(res);
|
||||
} catch (err) {
|
||||
console.log("err", err);
|
||||
throw new Error("Something went wrong! Unable to get recording access link");
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@ import { sendBrokenIntegrationEmail } from "@calcom/emails";
|
|||
import { getUid } from "@calcom/lib/CalEventParser";
|
||||
import logger from "@calcom/lib/logger";
|
||||
import { prisma } from "@calcom/prisma";
|
||||
import { GetRecordingsResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { GetRecordingsResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { CalendarEvent, EventBusyDate } from "@calcom/types/Calendar";
|
||||
import { CredentialPayload, CredentialWithAppName } from "@calcom/types/Credential";
|
||||
import type { CredentialPayload, CredentialWithAppName } from "@calcom/types/Credential";
|
||||
import type { EventResult, PartialReference } from "@calcom/types/EventManager";
|
||||
import type { VideoApiAdapter, VideoApiAdapterFactory, VideoCallData } from "@calcom/types/VideoApiAdapter";
|
||||
|
||||
|
@ -175,6 +175,7 @@ const getRecordingsOfCalVideoByRoomName = async (
|
|||
try {
|
||||
dailyAppKeys = await getDailyAppKeys();
|
||||
} catch (e) {
|
||||
console.error("Error: Cal video provider is not installed.");
|
||||
return;
|
||||
}
|
||||
const [videoAdapter] = getVideoAdapters([
|
||||
|
@ -190,4 +191,32 @@ const getRecordingsOfCalVideoByRoomName = async (
|
|||
return videoAdapter?.getRecordings?.(roomName);
|
||||
};
|
||||
|
||||
export { getBusyVideoTimes, createMeeting, updateMeeting, deleteMeeting, getRecordingsOfCalVideoByRoomName };
|
||||
const getDownloadLinkOfCalVideoByRecordingId = async (recordingId: string) => {
|
||||
let dailyAppKeys: Awaited<ReturnType<typeof getDailyAppKeys>>;
|
||||
try {
|
||||
dailyAppKeys = await getDailyAppKeys();
|
||||
} catch (e) {
|
||||
console.error("Error: Cal video provider is not installed.");
|
||||
return;
|
||||
}
|
||||
const [videoAdapter] = getVideoAdapters([
|
||||
{
|
||||
id: 0,
|
||||
appId: "daily-video",
|
||||
type: "daily_video",
|
||||
userId: null,
|
||||
key: dailyAppKeys,
|
||||
invalid: false,
|
||||
},
|
||||
]);
|
||||
return videoAdapter?.getRecordingDownloadLink?.(recordingId);
|
||||
};
|
||||
|
||||
export {
|
||||
getBusyVideoTimes,
|
||||
createMeeting,
|
||||
updateMeeting,
|
||||
deleteMeeting,
|
||||
getRecordingsOfCalVideoByRoomName,
|
||||
getDownloadLinkOfCalVideoByRecordingId,
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
const html = `<div id="wrapper" style="top:50%; left:50%" class="absolute z-highest">
|
||||
<div style="transform:translate(-50%,-50%)" class="loader border-brand dark:border-darkmodebrand">
|
||||
const html = `<div id="wrapper" style="top:50%; left:50%;transform:translate(-50%,-50%)" class="absolute z-highest">
|
||||
<div class="loader border-brand dark:border-darkmodebrand">
|
||||
<span class="loader-inner bg-brand dark:bg-darkmodebrand"></span>
|
||||
</div>
|
||||
<div id="error" style="transform:translate(-50%,-50%)" class="hidden">
|
||||
|
|
|
@ -340,8 +340,15 @@ function keepParentInformedAboutDimensionChanges() {
|
|||
throw new Error("Main element should be an HTMLElement");
|
||||
}
|
||||
|
||||
const contentHeight = mainElement.offsetHeight;
|
||||
const contentWidth = mainElement.offsetWidth;
|
||||
const mainElementStyles = getComputedStyle(mainElement);
|
||||
const contentHeight =
|
||||
mainElement.offsetHeight +
|
||||
parseInt(mainElementStyles.marginTop) +
|
||||
parseInt(mainElementStyles.marginBottom);
|
||||
const contentWidth =
|
||||
mainElement.offsetWidth +
|
||||
parseInt(mainElementStyles.marginLeft) +
|
||||
parseInt(mainElementStyles.marginRight);
|
||||
|
||||
// During first render let iframe tell parent that how much is the expected height to avoid scroll.
|
||||
// Parent would set the same value as the height of iframe which would prevent scroll.
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import DOMPurify from "dompurify";
|
||||
import { useSession } from "next-auth/react";
|
||||
import React, { AriaRole, ComponentType, Fragment } from "react";
|
||||
import type { AriaRole, ComponentType } from "react";
|
||||
import React, { Fragment } from "react";
|
||||
|
||||
import { APP_NAME, CONSOLE_URL, SUPPORT_MAIL_ADDRESS, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
import { useState } from "react";
|
||||
import { useState, Suspense } from "react";
|
||||
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import LicenseRequired from "@calcom/features/ee/common/components/v2/LicenseRequired";
|
||||
import useHasPaidPlan from "@calcom/lib/hooks/useHasPaidPlan";
|
||||
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
||||
import { RecordingItemSchema } from "@calcom/prisma/zod-utils";
|
||||
import { RouterOutputs, trpc } from "@calcom/trpc/react";
|
||||
import type { RecordingItemSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { RouterOutputs } from "@calcom/trpc/react";
|
||||
import { trpc } from "@calcom/trpc/react";
|
||||
import type { PartialReference } from "@calcom/types/EventManager";
|
||||
import {
|
||||
Dialog,
|
||||
|
@ -15,7 +16,7 @@ import {
|
|||
DialogHeader,
|
||||
UpgradeTeamsBadge,
|
||||
} from "@calcom/ui";
|
||||
import { Button, showToast } from "@calcom/ui";
|
||||
import { Button } from "@calcom/ui";
|
||||
import { FiDownload } from "@calcom/ui/components/icon";
|
||||
|
||||
import RecordingListSkeleton from "./components/RecordingListSkeleton";
|
||||
|
@ -40,31 +41,122 @@ interface GetTimeSpanProps {
|
|||
startTime: string | undefined;
|
||||
endTime: string | undefined;
|
||||
locale: string;
|
||||
isTimeFormatAMPM: boolean;
|
||||
hour12: boolean;
|
||||
}
|
||||
|
||||
const getTimeSpan = ({ startTime, endTime, locale, isTimeFormatAMPM }: GetTimeSpanProps) => {
|
||||
const getTimeSpan = ({ startTime, endTime, locale, hour12 }: GetTimeSpanProps) => {
|
||||
if (!startTime || !endTime) return "";
|
||||
|
||||
const formattedStartTime = new Intl.DateTimeFormat(locale, {
|
||||
hour: "numeric",
|
||||
minute: "numeric",
|
||||
hour12: isTimeFormatAMPM,
|
||||
hour12,
|
||||
}).format(new Date(startTime));
|
||||
|
||||
const formattedEndTime = new Intl.DateTimeFormat(locale, {
|
||||
hour: "numeric",
|
||||
minute: "numeric",
|
||||
hour12: isTimeFormatAMPM,
|
||||
hour12,
|
||||
}).format(new Date(endTime));
|
||||
|
||||
return `${formattedStartTime} - ${formattedEndTime}`;
|
||||
};
|
||||
|
||||
const useRecordingDownload = () => {
|
||||
const [recordingId, setRecordingId] = useState("");
|
||||
const { isFetching, data } = trpc.viewer.getDownloadLinkOfCalVideoRecordings.useQuery(
|
||||
{
|
||||
recordingId,
|
||||
},
|
||||
{
|
||||
enabled: !!recordingId,
|
||||
cacheTime: 0,
|
||||
refetchOnWindowFocus: false,
|
||||
refetchOnReconnect: false,
|
||||
retry: false,
|
||||
onSuccess: (data) => {
|
||||
if (data && data.download_link) {
|
||||
window.location.href = data.download_link;
|
||||
}
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
return {
|
||||
setRecordingId: (newRecordingId: string) => {
|
||||
// may be a way to do this by default, but this is easy enough.
|
||||
if (recordingId === newRecordingId && data) {
|
||||
window.location.href = data.download_link;
|
||||
}
|
||||
if (!isFetching) {
|
||||
setRecordingId(newRecordingId);
|
||||
}
|
||||
// assume it is still fetching, do nothing.
|
||||
},
|
||||
isFetching,
|
||||
};
|
||||
};
|
||||
|
||||
const ViewRecordingsList = ({ roomName, hasPaidPlan }: { roomName: string; hasPaidPlan: boolean }) => {
|
||||
const { t } = useLocale();
|
||||
const { setRecordingId, isFetching } = useRecordingDownload();
|
||||
|
||||
const { data: recordings } = trpc.viewer.getCalVideoRecordings.useQuery(
|
||||
{ roomName },
|
||||
{
|
||||
suspense: true,
|
||||
}
|
||||
);
|
||||
|
||||
const handleDownloadClick = async (recordingId: string) => {
|
||||
// this would enable the getDownloadLinkOfCalVideoRecordings
|
||||
setRecordingId(recordingId);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{recordings && "data" in recordings && recordings?.data?.length > 0 ? (
|
||||
<div className="flex flex-col gap-3">
|
||||
{recordings.data.map((recording: RecordingItemSchema, index: number) => {
|
||||
return (
|
||||
<div
|
||||
className="flex w-full items-center justify-between rounded-md border px-4 py-2"
|
||||
key={recording.id}>
|
||||
<div className="flex flex-col">
|
||||
<h1 className="text-sm font-semibold">
|
||||
{t("recording")} {index + 1}
|
||||
</h1>
|
||||
<p className="text-sm font-normal text-gray-500">
|
||||
{convertSecondsToMs(recording.duration)}
|
||||
</p>
|
||||
</div>
|
||||
{hasPaidPlan ? (
|
||||
<Button
|
||||
StartIcon={FiDownload}
|
||||
className="ml-4 lg:ml-0"
|
||||
loading={isFetching}
|
||||
onClick={() => handleDownloadClick(recording.id)}>
|
||||
{t("download")}
|
||||
</Button>
|
||||
) : (
|
||||
<UpgradeTeamsBadge />
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
) : (
|
||||
(!recordings || (recordings && "total_count" in recordings && recordings?.total_count === 0)) && (
|
||||
<p className="font-semibold">{t("no_recordings_found")}</p>
|
||||
)
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export const ViewRecordingsDialog = (props: IViewRecordingsDialog) => {
|
||||
const { t, i18n } = useLocale();
|
||||
const { isOpenDialog, setIsOpenDialog, booking, timeFormat } = props;
|
||||
const [downloadingRecordingId, setRecordingId] = useState<string | null>(null);
|
||||
|
||||
const { hasPaidPlan, isLoading: isTeamPlanStatusLoading } = useHasPaidPlan();
|
||||
|
||||
|
@ -72,84 +164,32 @@ export const ViewRecordingsDialog = (props: IViewRecordingsDialog) => {
|
|||
booking?.references?.find((reference: PartialReference) => reference.type === "daily_video")?.meetingId ??
|
||||
undefined;
|
||||
|
||||
const { data: recordings, isLoading } = trpc.viewer.getCalVideoRecordings.useQuery(
|
||||
{ roomName: roomName ?? "" },
|
||||
{ enabled: !!roomName && isOpenDialog }
|
||||
);
|
||||
const handleDownloadClick = async (recordingId: string) => {
|
||||
try {
|
||||
setRecordingId(recordingId);
|
||||
const res = await fetch(`/api/download-cal-video-recording?recordingId=${recordingId}`, {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
const respBody = await res.json();
|
||||
|
||||
if (respBody?.download_link) {
|
||||
window.location.href = respBody.download_link;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
showToast(t("something_went_wrong"), "error");
|
||||
}
|
||||
setRecordingId(null);
|
||||
};
|
||||
|
||||
const subtitle = `${booking?.title} - ${dayjs(booking?.startTime).format("ddd")} ${dayjs(
|
||||
booking?.startTime
|
||||
).format("D")}, ${dayjs(booking?.startTime).format("MMM")} ${getTimeSpan({
|
||||
startTime: booking?.startTime,
|
||||
endTime: booking?.endTime,
|
||||
locale: i18n.language,
|
||||
isTimeFormatAMPM: timeFormat === 12,
|
||||
hour12: timeFormat === 12,
|
||||
})} `;
|
||||
|
||||
return (
|
||||
<Dialog open={isOpenDialog} onOpenChange={setIsOpenDialog}>
|
||||
<DialogContent>
|
||||
<DialogHeader title={t("recordings_title")} subtitle={subtitle} />
|
||||
<LicenseRequired>
|
||||
<>
|
||||
{(isLoading || isTeamPlanStatusLoading) && <RecordingListSkeleton />}
|
||||
{recordings && "data" in recordings && recordings?.data?.length > 0 && (
|
||||
<div className="flex flex-col gap-3">
|
||||
{recordings.data.map((recording: RecordingItemSchema, index: number) => {
|
||||
return (
|
||||
<div
|
||||
className="flex w-full items-center justify-between rounded-md border px-4 py-2"
|
||||
key={recording.id}>
|
||||
<div className="flex flex-col">
|
||||
<h1 className="text-sm font-semibold">
|
||||
{t("recording")} {index + 1}
|
||||
</h1>
|
||||
<p className="text-sm font-normal text-gray-500">
|
||||
{convertSecondsToMs(recording.duration)}
|
||||
</p>
|
||||
</div>
|
||||
{hasPaidPlan ? (
|
||||
<Button
|
||||
StartIcon={FiDownload}
|
||||
className="ml-4 lg:ml-0"
|
||||
loading={downloadingRecordingId === recording.id}
|
||||
onClick={() => handleDownloadClick(recording.id)}>
|
||||
{t("download")}
|
||||
</Button>
|
||||
) : (
|
||||
<UpgradeTeamsBadge />
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
{roomName ? (
|
||||
<LicenseRequired>
|
||||
{isTeamPlanStatusLoading ? (
|
||||
<RecordingListSkeleton />
|
||||
) : (
|
||||
<Suspense fallback={<RecordingListSkeleton />}>
|
||||
<ViewRecordingsList hasPaidPlan={!!hasPaidPlan} roomName={roomName} />
|
||||
</Suspense>
|
||||
)}
|
||||
{!isLoading &&
|
||||
(!recordings ||
|
||||
(recordings && "total_count" in recordings && recordings?.total_count === 0)) && (
|
||||
<h1 className="font-semibold">{t("no_recordings_found")}</h1>
|
||||
)}
|
||||
</>
|
||||
</LicenseRequired>
|
||||
</LicenseRequired>
|
||||
) : (
|
||||
<p className="font-semibold">{t("no_recordings_found")}</p>
|
||||
)}
|
||||
<DialogFooter>
|
||||
<DialogClose className="border" />
|
||||
</DialogFooter>
|
||||
|
|
|
@ -433,3 +433,9 @@ export const fromEntries = <
|
|||
): FromEntries<DeepWriteable<E>> => {
|
||||
return Object.fromEntries(entries) as FromEntries<DeepWriteable<E>>;
|
||||
};
|
||||
|
||||
export const getAccessLinkResponseSchema = z.object({
|
||||
download_link: z.string().url(),
|
||||
});
|
||||
|
||||
export type GetAccessLinkResponseSchema = z.infer<typeof getAccessLinkResponseSchema>;
|
||||
|
|
|
@ -14,13 +14,17 @@ import getApps, { getLocationGroupedOptions } from "@calcom/app-store/utils";
|
|||
import { cancelScheduledJobs } from "@calcom/app-store/zapier/lib/nodeScheduler";
|
||||
import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager";
|
||||
import { DailyLocationType } from "@calcom/core/location";
|
||||
import { getRecordingsOfCalVideoByRoomName } from "@calcom/core/videoClient";
|
||||
import {
|
||||
getRecordingsOfCalVideoByRoomName,
|
||||
getDownloadLinkOfCalVideoByRecordingId,
|
||||
} from "@calcom/core/videoClient";
|
||||
import dayjs from "@calcom/dayjs";
|
||||
import { sendCancelledEmails, sendFeedbackEmail } from "@calcom/emails";
|
||||
import { samlTenantProduct } from "@calcom/features/ee/sso/lib/saml";
|
||||
import { isPrismaObjOrUndefined, parseRecurringEvent } from "@calcom/lib";
|
||||
import getEnabledApps from "@calcom/lib/apps/getEnabledApps";
|
||||
import { ErrorCode, verifyPassword } from "@calcom/lib/auth";
|
||||
import { IS_SELF_HOSTED } from "@calcom/lib/constants";
|
||||
import { symmetricDecrypt } from "@calcom/lib/crypto";
|
||||
import getPaymentAppData from "@calcom/lib/getPaymentAppData";
|
||||
import hasKeyInMetadata from "@calcom/lib/hasKeyInMetadata";
|
||||
|
@ -1158,6 +1162,7 @@ const loggedInViewerRouter = router({
|
|||
)
|
||||
.query(async ({ input }) => {
|
||||
const { roomName } = input;
|
||||
|
||||
try {
|
||||
const res = await getRecordingsOfCalVideoByRoomName(roomName);
|
||||
return res;
|
||||
|
@ -1167,6 +1172,33 @@ const loggedInViewerRouter = router({
|
|||
});
|
||||
}
|
||||
}),
|
||||
getDownloadLinkOfCalVideoRecordings: authedProcedure
|
||||
.input(
|
||||
z.object({
|
||||
recordingId: z.string(),
|
||||
})
|
||||
)
|
||||
.query(async ({ input, ctx }) => {
|
||||
const { recordingId } = input;
|
||||
const { session } = ctx;
|
||||
|
||||
const isDownloadAllowed = IS_SELF_HOSTED || session.user.belongsToActiveTeam;
|
||||
|
||||
if (!isDownloadAllowed) {
|
||||
throw new TRPCError({
|
||||
code: "FORBIDDEN",
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await getDownloadLinkOfCalVideoByRecordingId(recordingId);
|
||||
return res;
|
||||
} catch (err) {
|
||||
throw new TRPCError({
|
||||
code: "BAD_REQUEST",
|
||||
});
|
||||
}
|
||||
}),
|
||||
getUsersDefaultConferencingApp: authedProcedure.query(async ({ ctx }) => {
|
||||
return userMetadata.parse(ctx.user.metadata)?.defaultConferencingApp;
|
||||
}),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { GetRecordingsResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
import type { GetRecordingsResponseSchema, GetAccessLinkResponseSchema } from "@calcom/prisma/zod-utils";
|
||||
|
||||
import type { EventBusyDate } from "./Calendar";
|
||||
import { CredentialPayload } from "./Credential";
|
||||
import type { CredentialPayload } from "./Credential";
|
||||
|
||||
export interface VideoCallData {
|
||||
type: string;
|
||||
|
@ -22,6 +22,8 @@ export type VideoApiAdapter =
|
|||
getAvailability(dateFrom?: string, dateTo?: string): Promise<EventBusyDate[]>;
|
||||
|
||||
getRecordings?(roomName: string): Promise<GetRecordingsResponseSchema>;
|
||||
|
||||
getRecordingDownloadLink?(recordingId: string): Promise<GetAccessLinkResponseSchema>;
|
||||
}
|
||||
| undefined;
|
||||
|
||||
|
|
365
yarn.lock
365
yarn.lock
|
@ -41,6 +41,28 @@
|
|||
call-me-maybe "^1.0.1"
|
||||
js-yaml "^4.1.0"
|
||||
|
||||
"@apidevtools/openapi-schemas@^2.0.4":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17"
|
||||
integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==
|
||||
|
||||
"@apidevtools/swagger-methods@^3.0.2":
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267"
|
||||
integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==
|
||||
|
||||
"@apidevtools/swagger-parser@10.0.2":
|
||||
version "10.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz#f4145afb7c3a3bafe0376f003b5c3bdeae17a952"
|
||||
integrity sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==
|
||||
dependencies:
|
||||
"@apidevtools/json-schema-ref-parser" "^9.0.6"
|
||||
"@apidevtools/openapi-schemas" "^2.0.4"
|
||||
"@apidevtools/swagger-methods" "^3.0.2"
|
||||
"@jsdevtools/ono" "^7.1.3"
|
||||
call-me-maybe "^1.0.1"
|
||||
z-schema "^4.2.3"
|
||||
|
||||
"@aws-crypto/ie11-detection@^2.0.0":
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz#9c39f4a5558196636031a933ec1b4792de959d6a"
|
||||
|
@ -2619,6 +2641,13 @@
|
|||
dependencies:
|
||||
regenerator-runtime "^0.13.4"
|
||||
|
||||
"@babel/runtime@^7.20.13":
|
||||
version "7.21.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
|
||||
integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
|
||||
dependencies:
|
||||
regenerator-runtime "^0.13.11"
|
||||
|
||||
"@babel/runtime@~7.5.4":
|
||||
version "7.5.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
||||
|
@ -3327,6 +3356,26 @@
|
|||
minimatch "^3.1.2"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@eslint/eslintrc@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff"
|
||||
integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==
|
||||
dependencies:
|
||||
ajv "^6.12.4"
|
||||
debug "^4.3.2"
|
||||
espree "^9.4.0"
|
||||
globals "^13.19.0"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.2.1"
|
||||
js-yaml "^4.1.0"
|
||||
minimatch "^3.1.2"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@eslint/js@8.35.0":
|
||||
version "8.35.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7"
|
||||
integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==
|
||||
|
||||
"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.3":
|
||||
version "2.6.3"
|
||||
resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05"
|
||||
|
@ -5014,10 +5063,10 @@
|
|||
dependencies:
|
||||
webpack-bundle-analyzer "4.7.0"
|
||||
|
||||
"@next/env@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.1.tgz#082d42cfc0c794e9185d7b4133d71440ba2e795d"
|
||||
integrity sha512-Hq+6QZ6kgmloCg8Kgrix+4F0HtvLqVK3FZAnlAoS0eonaDemHe1Km4kwjSWRE3JNpJNcKxFHF+jsZrYo0SxWoQ==
|
||||
"@next/env@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.3.tgz#77ca49edb3c1d7c5263bb8f2ebe686080e98279e"
|
||||
integrity sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow==
|
||||
|
||||
"@next/eslint-plugin-next@13.2.1":
|
||||
version "13.2.1"
|
||||
|
@ -5026,75 +5075,70 @@
|
|||
dependencies:
|
||||
glob "7.1.7"
|
||||
|
||||
"@next/font@^13.1.6":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/font/-/font-13.2.1.tgz#3723342727193116b904c798a1c054db02e07c22"
|
||||
integrity sha512-4sergLt7xp9+mZuKME/xM4tLlHGTcmL7naCq0qCTcAlof6NnttshYgiLOdhSiy0NcI+/yM3BjvdEk++O96UzTg==
|
||||
"@next/swc-android-arm-eabi@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.3.tgz#85eed560c87c7996558c868a117be9780778f192"
|
||||
integrity sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw==
|
||||
|
||||
"@next/swc-android-arm-eabi@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.1.tgz#67f2580fbbe05ee006220688972c5e3a555fc741"
|
||||
integrity sha512-Yua7mUpEd1wzIT6Jjl3dpRizIfGp9NR4F2xeRuQv+ae+SDI1Em2WyM9m46UL+oeW5GpMiEHoaBagr47RScZFmQ==
|
||||
"@next/swc-android-arm64@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.3.tgz#8ac54ca9795a48afc4631b4823a4864bd5db0129"
|
||||
integrity sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w==
|
||||
|
||||
"@next/swc-android-arm64@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.1.tgz#460a02b69eb23bb5f402266bcea9cadae59415c1"
|
||||
integrity sha512-Bifcr2f6VwInOdq1uH/9lp8fH7Nf7XGkIx4XceVd32LPJqG2c6FZU8ZRBvTdhxzXVpt5TPtuXhOP4Ij9UPqsVw==
|
||||
"@next/swc-darwin-arm64@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.3.tgz#f674e3c65aec505b6d218a662ade3fe248ccdbda"
|
||||
integrity sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w==
|
||||
|
||||
"@next/swc-darwin-arm64@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.1.tgz#8b8530ff417802027471aee2419f78a58a863ccb"
|
||||
integrity sha512-gvqm+fGMYxAkwBapH0Vvng5yrb6HTkIvZfY4oEdwwYrwuLdkjqnJygCMgpNqIFmAHSXgtlWxfYv1VC8sjN81Kw==
|
||||
"@next/swc-darwin-x64@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.3.tgz#a15ea7fb4c46034a8f5e387906d0cad08387075a"
|
||||
integrity sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw==
|
||||
|
||||
"@next/swc-darwin-x64@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.1.tgz#80aebb3329a1e4568a28de1ee177780b3d50330c"
|
||||
integrity sha512-HGqVqmaZWj6zomqOZUVbO5NhlABL0iIaxTmd0O5B0MoMa5zpDGoaHSG+fxgcWMXcGcxmUNchv1NfNOYiTKoHOg==
|
||||
"@next/swc-freebsd-x64@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.3.tgz#f7ac6ae4f7d706ff2431f33e40230a554c8c2cbc"
|
||||
integrity sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g==
|
||||
|
||||
"@next/swc-freebsd-x64@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.1.tgz#250ea2ab7e1734f22d11c677c463fab9ac33a516"
|
||||
integrity sha512-N/a4JarAq+E+g+9K2ywJUmDIgU2xs2nA+BBldH0oq4zYJMRiUhL0iaN9G4e72VmGOJ61L/3W6VN8RIUOwTLoqQ==
|
||||
"@next/swc-linux-arm-gnueabihf@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.3.tgz#84ad9e9679d55542a23b590ad9f2e1e9b2df62f7"
|
||||
integrity sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA==
|
||||
|
||||
"@next/swc-linux-arm-gnueabihf@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.1.tgz#fe6bb29ed348a5f8ecae3740df22a8d8130c474a"
|
||||
integrity sha512-WaFoerF/eRbhbE57TaIGJXbQAERADZ/RZ45u6qox9beb5xnWsyYgzX+WuN7Tkhyvga0/aMuVYFzS9CEay7D+bw==
|
||||
"@next/swc-linux-arm64-gnu@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.3.tgz#56f9175bc632d647c60b9e8bedc0875edf92d8b7"
|
||||
integrity sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA==
|
||||
|
||||
"@next/swc-linux-arm64-gnu@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.1.tgz#4781b927fc5e421f3cea2b29e5d38e5e4837b198"
|
||||
integrity sha512-R+Jhc1/RJTnncE9fkePboHDNOCm1WJ8daanWbjKhfPySMyeniKYRwGn5SLYW3S8YlRS0QVdZaaszDSZWgUcsmA==
|
||||
"@next/swc-linux-arm64-musl@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.3.tgz#7d4cf00e8f1729a3de464da0624773f5d0d14888"
|
||||
integrity sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g==
|
||||
|
||||
"@next/swc-linux-arm64-musl@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.1.tgz#c2ba0a121b0255ba62450916bc70e6d0e26cbc98"
|
||||
integrity sha512-oI1UfZPidGAVddlL2eOTmfsuKV9EaT1aktIzVIxIAgxzQSdwsV371gU3G55ggkurzfdlgF3GThFePDWF0d8dmw==
|
||||
"@next/swc-linux-x64-gnu@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.3.tgz#17de404910c4ebf7a1d366b19334d7e27e126ab0"
|
||||
integrity sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ==
|
||||
|
||||
"@next/swc-linux-x64-gnu@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.1.tgz#573c220f8b087e5d131d1fba58d3e1a670b220ad"
|
||||
integrity sha512-PCygPwrQmS+7WUuAWWioWMZCzZm4PG91lfRxToLDg7yIm/3YfAw5N2EK2TaM9pzlWdvHQAqRMX/oLvv027xUiA==
|
||||
"@next/swc-linux-x64-musl@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.3.tgz#07cb7b7f3a3a98034e2533f82638a9b099ba4ab1"
|
||||
integrity sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA==
|
||||
|
||||
"@next/swc-linux-x64-musl@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.1.tgz#950b5bb920b322ca7b447efbd12a9c7a10c3a642"
|
||||
integrity sha512-sUAKxo7CFZYGHNxheGh9nIBElLYBM6md/liEGfOTwh/xna4/GTTcmkGWkF7PdnvaYNgcPIQgHIMYiAa6yBKAVw==
|
||||
"@next/swc-win32-arm64-msvc@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.3.tgz#b9ac98c954c71ec9de45d3497a8585096b873152"
|
||||
integrity sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ==
|
||||
|
||||
"@next/swc-win32-arm64-msvc@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.1.tgz#dbff3c4f5a3812a7059dac05804148a0f98682db"
|
||||
integrity sha512-qDmyEjDBpl/vBXxuOOKKWmPQOcARcZIMach1s7kjzaien0SySut/PHRlj56sosa81Wt4hTGhfhZ1R7g1n7+B8w==
|
||||
"@next/swc-win32-ia32-msvc@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.3.tgz#5ec48653a48fd664e940c69c96bba698fdae92eb"
|
||||
integrity sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA==
|
||||
|
||||
"@next/swc-win32-ia32-msvc@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.1.tgz#7d2c17be7b8d9963984f5c15cc2588127101f620"
|
||||
integrity sha512-2joqFQ81ZYPg6DcikIzQn3DgjKglNhPAozx6dL5sCNkr1CPMD0YIkJgT3CnYyMHQ04Qi3Npv0XX3MD6LJO8OCA==
|
||||
|
||||
"@next/swc-win32-x64-msvc@13.2.1":
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.1.tgz#09713c6a925461f414e89422851326d1625bd4d2"
|
||||
integrity sha512-r3+0fSaIZT6N237iMzwUhfNwjhAFvXjqB+4iuW+wcpxW+LHm1g/IoxN8eSRcb8jPItC86JxjAxpke0QL97qd6g==
|
||||
"@next/swc-win32-x64-msvc@13.2.3":
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.3.tgz#cd432f280beb8d8de5b7cd2501e9f502e9f3dd72"
|
||||
integrity sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q==
|
||||
|
||||
"@node-ipc/js-queue@2.0.3":
|
||||
version "2.0.3"
|
||||
|
@ -5193,10 +5237,10 @@
|
|||
"@otplib/plugin-crypto" "^12.0.1"
|
||||
"@otplib/plugin-thirty-two" "^12.0.1"
|
||||
|
||||
"@panva/hkdf@^1.0.1":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.2.tgz#bab0f09d09de9fd83628220d496627681bc440d6"
|
||||
integrity sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==
|
||||
"@panva/hkdf@^1.0.2":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.4.tgz#4e02bb248402ff6c5c024e23a68438e2b0e69d67"
|
||||
integrity sha512-003xWiCuvePbLaPHT+CRuaV4GlyCAVm6XYSbBZDHoWZGn1mNkVKFaDbGJjjxmEFvizUwlCoM6O18FCBMMky2zQ==
|
||||
|
||||
"@pedrouid/environment@^1.0.1":
|
||||
version "1.0.1"
|
||||
|
@ -5243,7 +5287,7 @@
|
|||
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
|
||||
integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
|
||||
|
||||
"@prisma/client@^4.11.0":
|
||||
"@prisma/client@^4.11.0", "@prisma/client@^4.8.1":
|
||||
version "4.11.0"
|
||||
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.11.0.tgz#41d5664dea4172c954190a432f70b86d3e2e629b"
|
||||
integrity sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==
|
||||
|
@ -8365,7 +8409,7 @@
|
|||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@18.0.26":
|
||||
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@18.0.26", "@types/react@^18.0.17":
|
||||
version "18.0.26"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917"
|
||||
integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==
|
||||
|
@ -11087,11 +11131,16 @@ caniuse-lite@^1.0.30001370:
|
|||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz#3d2159bf5a8f9ca093275b0d3ecc717b00f27b67"
|
||||
integrity sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==
|
||||
|
||||
caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001407:
|
||||
caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001407:
|
||||
version "1.0.30001425"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz#52917791a453eb3265143d2cd08d80629e82c735"
|
||||
integrity sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==
|
||||
|
||||
caniuse-lite@^1.0.30001406:
|
||||
version "1.0.30001460"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz#31d2e26f0a2309860ed3eff154e03890d9d851a7"
|
||||
integrity sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==
|
||||
|
||||
capture-exit@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
|
||||
|
@ -13730,6 +13779,52 @@ eslint@8.4.1:
|
|||
text-table "^0.2.0"
|
||||
v8-compile-cache "^2.0.3"
|
||||
|
||||
eslint@^8.22.0:
|
||||
version "8.35.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323"
|
||||
integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==
|
||||
dependencies:
|
||||
"@eslint/eslintrc" "^2.0.0"
|
||||
"@eslint/js" "8.35.0"
|
||||
"@humanwhocodes/config-array" "^0.11.8"
|
||||
"@humanwhocodes/module-importer" "^1.0.1"
|
||||
"@nodelib/fs.walk" "^1.2.8"
|
||||
ajv "^6.10.0"
|
||||
chalk "^4.0.0"
|
||||
cross-spawn "^7.0.2"
|
||||
debug "^4.3.2"
|
||||
doctrine "^3.0.0"
|
||||
escape-string-regexp "^4.0.0"
|
||||
eslint-scope "^7.1.1"
|
||||
eslint-utils "^3.0.0"
|
||||
eslint-visitor-keys "^3.3.0"
|
||||
espree "^9.4.0"
|
||||
esquery "^1.4.2"
|
||||
esutils "^2.0.2"
|
||||
fast-deep-equal "^3.1.3"
|
||||
file-entry-cache "^6.0.1"
|
||||
find-up "^5.0.0"
|
||||
glob-parent "^6.0.2"
|
||||
globals "^13.19.0"
|
||||
grapheme-splitter "^1.0.4"
|
||||
ignore "^5.2.0"
|
||||
import-fresh "^3.0.0"
|
||||
imurmurhash "^0.1.4"
|
||||
is-glob "^4.0.0"
|
||||
is-path-inside "^3.0.3"
|
||||
js-sdsl "^4.1.4"
|
||||
js-yaml "^4.1.0"
|
||||
json-stable-stringify-without-jsonify "^1.0.1"
|
||||
levn "^0.4.1"
|
||||
lodash.merge "^4.6.2"
|
||||
minimatch "^3.1.2"
|
||||
natural-compare "^1.4.0"
|
||||
optionator "^0.9.1"
|
||||
regexpp "^3.2.0"
|
||||
strip-ansi "^6.0.1"
|
||||
strip-json-comments "^3.1.0"
|
||||
text-table "^0.2.0"
|
||||
|
||||
eslint@^8.34.0:
|
||||
version "8.34.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6"
|
||||
|
@ -13823,6 +13918,13 @@ esquery@^1.4.0:
|
|||
dependencies:
|
||||
estraverse "^5.1.0"
|
||||
|
||||
esquery@^1.4.2:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
|
||||
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
|
||||
dependencies:
|
||||
estraverse "^5.1.0"
|
||||
|
||||
esrecurse@^4.1.0, esrecurse@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
|
||||
|
@ -17714,6 +17816,17 @@ jimp@^0.16.1:
|
|||
"@jimp/types" "^0.16.1"
|
||||
regenerator-runtime "^0.13.3"
|
||||
|
||||
joi@^17.7.0:
|
||||
version "17.8.3"
|
||||
resolved "https://registry.yarnpkg.com/joi/-/joi-17.8.3.tgz#d772fe27a87a5cda21aace5cf11eee8671ca7e6f"
|
||||
integrity sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==
|
||||
dependencies:
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
"@hapi/topo" "^5.0.0"
|
||||
"@sideway/address" "^4.1.3"
|
||||
"@sideway/formula" "^3.0.1"
|
||||
"@sideway/pinpoint" "^2.0.0"
|
||||
|
||||
jose@4.11.2:
|
||||
version "4.11.2"
|
||||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23"
|
||||
|
@ -17724,10 +17837,10 @@ jose@^4.10.0:
|
|||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.0.tgz#1c7f5c7806383d3e836434e8f49da531cb046a9d"
|
||||
integrity sha512-wLe+lJHeG8Xt6uEubS4x0LVjS/3kXXu9dGoj9BNnlhYq7Kts0Pbb2pvv5KiI0yaKH/eaiR0LUOBhOVo9ktd05A==
|
||||
|
||||
jose@^4.9.3:
|
||||
version "4.11.1"
|
||||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.1.tgz#8f7443549befe5bddcf4bae664a9cbc1a62da4fa"
|
||||
integrity sha512-YRv4Tk/Wlug8qicwqFNFVEZSdbROCHRAC6qu/i0dyNKr5JQdoa2pIGoS04lLO/jXQX7Z9omoNewYIVIxqZBd9Q==
|
||||
jose@^4.11.4:
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.13.1.tgz#449111bb5ab171db85c03f1bd2cb1647ca06db1c"
|
||||
integrity sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==
|
||||
|
||||
jpeg-js@0.4.2:
|
||||
version "0.4.2"
|
||||
|
@ -20061,17 +20174,24 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0:
|
|||
resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5"
|
||||
integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==
|
||||
|
||||
next-auth@^4.18.8:
|
||||
version "4.19.2"
|
||||
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.19.2.tgz#8dbdc4886d4f006e7c67c77ab56e0aec5693064d"
|
||||
integrity sha512-6V2YG3IJQVhgCAH7mvT3yopTW92gMdUrcwGX7NQ0dCreT/+axGua/JmVdarjec0C/oJukKpIYRgjMlV+L5ZQOQ==
|
||||
next-api-middleware@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/next-api-middleware/-/next-api-middleware-1.0.1.tgz#8dd76abeace9e10c6be29c9c9486a84cb649cc12"
|
||||
integrity sha512-t8UbZ9UUPFB7nklrHdAusn7MfoVSHtnWlRV1R0hirvLRHPDnzidTnw1Mu99Kqvc1bVC0rQSUX5kf0j/4nmEtfA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.16.3"
|
||||
"@panva/hkdf" "^1.0.1"
|
||||
debug "^4.3.2"
|
||||
|
||||
next-auth@^4.10.3, next-auth@^4.18.8:
|
||||
version "4.20.1"
|
||||
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.20.1.tgz#6e65c4fde14171f6ce64f05f672f80f39fc418c7"
|
||||
integrity sha512-ZcTUN4qzzZ/zJYgOW0hMXccpheWtAol8QOMdMts+LYRcsPGsqf2hEityyaKyECQVw1cWInb9dF3wYwI5GZdEmQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.20.13"
|
||||
"@panva/hkdf" "^1.0.2"
|
||||
cookie "^0.5.0"
|
||||
jose "^4.9.3"
|
||||
jose "^4.11.4"
|
||||
oauth "^0.9.15"
|
||||
openid-client "^5.1.0"
|
||||
openid-client "^5.4.0"
|
||||
preact "^10.6.3"
|
||||
preact-render-to-string "^5.1.19"
|
||||
uuid "^8.3.2"
|
||||
|
@ -20138,30 +20258,35 @@ next-transpile-modules@^8.0.0:
|
|||
enhanced-resolve "^5.7.0"
|
||||
escalade "^3.1.1"
|
||||
|
||||
next@^13.2.1:
|
||||
version "13.2.1"
|
||||
resolved "https://registry.yarnpkg.com/next/-/next-13.2.1.tgz#34d823f518632b36379863228ed9f861c335b9c0"
|
||||
integrity sha512-qhgJlDtG0xidNViJUPeQHLGJJoT4zDj/El7fP3D3OzpxJDUfxsm16cK4WTMyvSX1ciIfAq05u+0HqFAa+VJ+Hg==
|
||||
next-validations@^0.2.0:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/next-validations/-/next-validations-0.2.1.tgz#68010c9b017ba48eec4f404fd42eb9b0c7324737"
|
||||
integrity sha512-92pR14MPTTx0ynlvYH2TwMf7WiGiznNL/l0dtZyKPw3x48rcMhwEZrP1ZmsMJwzp5D+U+sY2deexeLWC8rlNtQ==
|
||||
|
||||
next@^13.1.1, next@^13.2.1:
|
||||
version "13.2.3"
|
||||
resolved "https://registry.yarnpkg.com/next/-/next-13.2.3.tgz#92d170e7aca421321f230ff80c35c4751035f42e"
|
||||
integrity sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==
|
||||
dependencies:
|
||||
"@next/env" "13.2.1"
|
||||
"@next/env" "13.2.3"
|
||||
"@swc/helpers" "0.4.14"
|
||||
caniuse-lite "^1.0.30001406"
|
||||
postcss "8.4.14"
|
||||
styled-jsx "5.1.1"
|
||||
optionalDependencies:
|
||||
"@next/swc-android-arm-eabi" "13.2.1"
|
||||
"@next/swc-android-arm64" "13.2.1"
|
||||
"@next/swc-darwin-arm64" "13.2.1"
|
||||
"@next/swc-darwin-x64" "13.2.1"
|
||||
"@next/swc-freebsd-x64" "13.2.1"
|
||||
"@next/swc-linux-arm-gnueabihf" "13.2.1"
|
||||
"@next/swc-linux-arm64-gnu" "13.2.1"
|
||||
"@next/swc-linux-arm64-musl" "13.2.1"
|
||||
"@next/swc-linux-x64-gnu" "13.2.1"
|
||||
"@next/swc-linux-x64-musl" "13.2.1"
|
||||
"@next/swc-win32-arm64-msvc" "13.2.1"
|
||||
"@next/swc-win32-ia32-msvc" "13.2.1"
|
||||
"@next/swc-win32-x64-msvc" "13.2.1"
|
||||
"@next/swc-android-arm-eabi" "13.2.3"
|
||||
"@next/swc-android-arm64" "13.2.3"
|
||||
"@next/swc-darwin-arm64" "13.2.3"
|
||||
"@next/swc-darwin-x64" "13.2.3"
|
||||
"@next/swc-freebsd-x64" "13.2.3"
|
||||
"@next/swc-linux-arm-gnueabihf" "13.2.3"
|
||||
"@next/swc-linux-arm64-gnu" "13.2.3"
|
||||
"@next/swc-linux-arm64-musl" "13.2.3"
|
||||
"@next/swc-linux-x64-gnu" "13.2.3"
|
||||
"@next/swc-linux-x64-musl" "13.2.3"
|
||||
"@next/swc-win32-arm64-msvc" "13.2.3"
|
||||
"@next/swc-win32-ia32-msvc" "13.2.3"
|
||||
"@next/swc-win32-x64-msvc" "13.2.3"
|
||||
|
||||
nextra-theme-docs@^1.2.2:
|
||||
version "1.2.6"
|
||||
|
@ -20708,10 +20833,10 @@ openid-client@5.3.1:
|
|||
object-hash "^2.0.1"
|
||||
oidc-token-hash "^5.0.1"
|
||||
|
||||
openid-client@^5.1.0:
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.3.0.tgz#e0fa433bb7a156b09d8cbb100abe95b322aa42be"
|
||||
integrity sha512-SykPCeZBZ/SxiBH5AWynvFUIDX3//2pgwc/3265alUmGHeCN03+X8uP+pHOVnCXCKfX/XOhO90qttAQ76XcGxA==
|
||||
openid-client@^5.4.0:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.4.0.tgz#77f1cda14e2911446f16ea3f455fc7c405103eac"
|
||||
integrity sha512-hgJa2aQKcM2hn3eyVtN12tEA45ECjTJPXCgUh5YzTzy9qwapCvmDTVPWOcWVL0d34zeQoQ/hbG9lJhl3AYxJlQ==
|
||||
dependencies:
|
||||
jose "^4.10.0"
|
||||
lru-cache "^6.0.0"
|
||||
|
@ -21775,7 +21900,24 @@ prism-react-renderer@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz#88fc9d0df6bed06ca2b9097421349f8c2f24e30d"
|
||||
integrity sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==
|
||||
|
||||
prisma@^4.11.0:
|
||||
prism-react-renderer@^1.3.5:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085"
|
||||
integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==
|
||||
|
||||
prisma-field-encryption@^1.4.0:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/prisma-field-encryption/-/prisma-field-encryption-1.4.1.tgz#caec1712d0d1ac1525f64eaae3d76501f0e33a7f"
|
||||
integrity sha512-J9uOdp/biLw4Gb3Z2dmXpDYXWG6jmqn0Wnp9/ga0Adg53jP0jVeIfO6+iIIY+H07xDUZa635seYs0pTMqYzyhA==
|
||||
dependencies:
|
||||
"@47ng/cloak" "^1.1.0"
|
||||
"@prisma/generator-helper" "^4.0.0"
|
||||
debug "^4.3.4"
|
||||
immer "^9.0.15"
|
||||
object-path "^0.11.8"
|
||||
zod "^3.17.3"
|
||||
|
||||
prisma@^4.11.0, prisma@^4.8.1:
|
||||
version "4.11.0"
|
||||
resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.11.0.tgz#9695ba4129a43eab3e76b5f7a033c6c020377725"
|
||||
integrity sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==
|
||||
|
@ -22805,6 +22947,11 @@ regenerate@^1.4.2:
|
|||
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
|
||||
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
|
||||
|
||||
regenerator-runtime@^0.13.11:
|
||||
version "0.13.11"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
|
||||
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
|
||||
|
||||
regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
|
||||
version "0.13.9"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
|
||||
|
@ -25543,7 +25690,7 @@ tslib@^1.0.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
|
|||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
|
||||
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
|
||||
|
||||
tslib@^2.0.1, tslib@^2.0.3, tslib@^2.4.0:
|
||||
tslib@^2.0.1, tslib@^2.0.3:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
||||
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
||||
|
@ -25553,6 +25700,11 @@ tslib@^2.2.0:
|
|||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
|
||||
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
|
||||
|
||||
tslib@^2.4.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
|
||||
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
|
||||
|
||||
tslog@^3.2.1:
|
||||
version "3.3.3"
|
||||
resolved "https://registry.yarnpkg.com/tslog/-/tslog-3.3.3.tgz#751a469e0d36841bd7e03676c27e53e7ffe9bc3d"
|
||||
|
@ -25815,6 +25967,11 @@ typeorm@0.3.11:
|
|||
xml2js "^0.4.23"
|
||||
yargs "^17.3.1"
|
||||
|
||||
typescript@^4.7.4:
|
||||
version "4.9.5"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
|
||||
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
|
||||
|
||||
typescript@^4.9.4:
|
||||
version "4.9.4"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
|
||||
|
|
Loading…
Reference in New Issue
Block a user