diff --git a/README.md b/README.md index eb89909e..cfe1f022 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,17 @@ # ZITADEL TypeScript with Turborepo and Changesets -This repository contains all TypeScript and JavaScript packages and applications you need to create your own ZITADEL Login UI. -The repo makes use of the [build system Turbo](https://turbo.build/repo) and the [Changesets CLI for versioning the packages](https://github.com/changesets/changesets). +This repository contains all TypeScript and JavaScript packages and applications you need to create your own ZITADEL +Login UI. +The repo makes use of the [build system Turbo](https://turbo.build/repo) and +the [Changesets CLI for versioning the packages](https://github.com/changesets/changesets). **⚠️ This repo and packages are in alpha state and subject to change ⚠️** The scope of functionality of this repo and packages is limited and under active development. Once the package structure is set and all APIs are fully implemented we'll move this repo to beta state. You can read the [contribution guide](/CONTRIBUTING.md) on how to contribute. -Questions can be raised in our [Discord channel](https://discord.gg/erh5Brh7jE) or as a [GitHub issue](https://github.com/zitadel/typescript/issues). +Questions can be raised in our [Discord channel](https://discord.gg/erh5Brh7jE) or as +a [GitHub issue](https://github.com/zitadel/typescript/issues). ## Developing Your Own ZITADEL Login UI @@ -25,8 +28,8 @@ We think the easiest path of getting up and running, is the following: ## Included Apps And Packages - `login`: The login UI used by ZITADEL Cloud, powered by Next.js -- `@zitadel/server`: core components for establishing node client connection, grpc stub -- `@zitadel/client`: core components for establishing web client connection, grpc stub +- `@zitadel/node`: core components for establishing node client connection, grpc stub +- `@zitadel/client`: shared client utilities - `@zitadel/proto`: shared protobuf types - `@zitadel/react`: shared React utilities and components built with tailwindcss - `@zitadel/next`: shared Next.js utilities @@ -38,9 +41,11 @@ Each package and app is 100% [TypeScript](https://www.typescriptlang.org/). ### Login The login is currently in a work in progress state. -The goal is to implement a login UI, using the session API of ZITADEL, which also implements the OIDC Standard and is ready to use for everyone. +The goal is to implement a login UI, using the session API of ZITADEL, which also implements the OIDC Standard and is +ready to use for everyone. -In the first phase we want to have a MVP login ready with the OIDC Standard and a basic feature set. In a second step the features will be extended. +In the first phase we want to have a MVP login ready with the OIDC Standard and a basic feature set. In a second step +the features will be extended. This list should show the current implementation state, and also what is missing. You can already use the current state, and extend it with your needs. @@ -105,11 +110,14 @@ You can already use the current state, and extend it with your needs. ## Versioning And Publishing Packages Package publishing has been configured using [Changesets](https://github.com/changesets/changesets). -Here is their [documentation](https://github.com/changesets/changesets#documentation) for more information about the workflow. +Here is their [documentation](https://github.com/changesets/changesets#documentation) for more information about the +workflow. -The [GitHub Action](https://github.com/changesets/action) needs an `NPM_TOKEN` and `GITHUB_TOKEN` in the repository settings. The [Changesets bot](https://github.com/apps/changeset-bot) should also be installed on the GitHub repository. +The [GitHub Action](https://github.com/changesets/action) needs an `NPM_TOKEN` and `GITHUB_TOKEN` in the repository +settings. The [Changesets bot](https://github.com/apps/changeset-bot) should also be installed on the GitHub repository. -Read the [changesets documentation](https://github.com/changesets/changesets/blob/main/docs/automating-changesets.md) for more information about this automation +Read the [changesets documentation](https://github.com/changesets/changesets/blob/main/docs/automating-changesets.md) +for more information about this automation ### NPM @@ -136,8 +144,10 @@ pnpm install ``` then setup the environment for the login application which needs a `.env.local` in `/apps/login`. -Go to your instance and create a service user for the application having the IAM_OWNER manager role. -This user is required to have access to create users on your primary organization and reading policy data so it can be restricted to your personal use case but we'll stick with IAM_OWNER for convenience. Create a PAT and copy the value to paste it under the `ZITADEL_SERVICE_USER_TOKEN` key. +Go to your instance and create a service user for the application having the `IAM_OWNER` manager role. +This user is required to have access to create users on your primary organization and reading policy data so it can be +restricted to your personal use case but we'll stick with `IAM_OWNER` for convenience. Create a PAT and copy the value to +paste it under the `ZITADEL_SERVICE_USER_TOKEN` key. The file should look as follows: ``` @@ -164,7 +174,8 @@ Open the login application with your favorite browser at `localhost:3000`. To deploy your own version on Vercel, navigate to your instance and create a service user. Copy its id from the overview and set it as ZITADEL_SERVICE_USER_ID. -Then create a personal access token (PAT), copy and set it as ZITADEL_SERVICE_USER_TOKEN, then navigate to your instance settings and make sure it gets IAM_OWNER permissions. +Then create a personal access token (PAT), copy and set it as ZITADEL_SERVICE_USER_TOKEN, then navigate to your instance +settings and make sure it gets IAM_OWNER permissions. Finally set your instance url as ZITADEL_API_URL. Make sure to set it without trailing slash. [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fzitadel%2Ftypescript&env=ZITADEL_API_URL,ZITADEL_SERVICE_USER_ID,ZITADEL_SERVICE_USER_TOKEN&root-directory=apps/login&envDescription=Setup%20a%20service%20account%20with%20IAM_OWNER%20membership%20on%20your%20instance%20and%20provide%20its%20id%20and%20personal%20access%20token.&project-name=zitadel-login&repository-name=zitadel-login) diff --git a/apps/login/package.json b/apps/login/package.json index 44dc1bb4..44fd3388 100644 --- a/apps/login/package.json +++ b/apps/login/package.json @@ -32,13 +32,14 @@ "*": "prettier --write --ignore-unknown" }, "dependencies": { - "@headlessui/react": "^1.7.14", - "@heroicons/react": "2.0.13", - "@tailwindcss/forms": "0.5.3", - "@vercel/analytics": "^1.0.0", - "@zitadel/client": "workspace:*", + "@headlessui/react": "^1.7.18", + "@heroicons/react": "2.1.3", + "@tailwindcss/forms": "0.5.7", + "@vercel/analytics": "^1.2.2", + "@zitadel/proto": "workspace:*", + "@zitadel/client2": "workspace:*", "@zitadel/react": "workspace:*", - "@zitadel/server": "workspace:*", + "@zitadel/node": "workspace:*", "clsx": "1.2.1", "copy-to-clipboard": "^3.3.3", "moment": "^2.29.4", diff --git a/apps/login/src/app/(login)/accounts/page.tsx b/apps/login/src/app/(login)/accounts/page.tsx index 638b7de0..b7b17d95 100644 --- a/apps/login/src/app/(login)/accounts/page.tsx +++ b/apps/login/src/app/(login)/accounts/page.tsx @@ -1,17 +1,15 @@ -import { Session } from "@zitadel/server"; -import { getBrandingSettings, listSessions, server } from "@/lib/zitadel"; +import { getBrandingSettings, listSessions } from "@/lib/zitadel"; import { getAllSessionCookieIds } from "@/utils/cookies"; import { UserPlusIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; import SessionsList from "@/ui/SessionsList"; import DynamicTheme from "@/ui/DynamicTheme"; -async function loadSessions(): Promise { +async function loadSessions() { const ids = await getAllSessionCookieIds(); if (ids && ids.length) { const response = await listSessions( - server, ids.filter((id: string | undefined) => !!id), ); return response?.sessions ?? []; @@ -31,7 +29,7 @@ export default async function Page({ let sessions = await loadSessions(); - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx b/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx index 2c55493e..188aed21 100644 --- a/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx +++ b/apps/login/src/app/(login)/idp/[provider]/failure/page.tsx @@ -1,16 +1,6 @@ import { ProviderSlug } from "@/lib/demos"; -import { getBrandingSettings, server } from "@/lib/zitadel"; -import Alert, { AlertType } from "@/ui/Alert"; +import { getBrandingSettings } from "@/lib/zitadel"; import DynamicTheme from "@/ui/DynamicTheme"; -import IdpSignin from "@/ui/IdpSignin"; -import { - AddHumanUserRequest, - IDPInformation, - RetrieveIdentityProviderIntentResponse, - user, - IDPLink, -} from "@zitadel/server"; -import { ClientError } from "nice-grpc"; const PROVIDER_NAME_MAPPING: { [provider: string]: string; @@ -29,7 +19,7 @@ export default async function Page({ const { id, token, authRequestId, organization } = searchParams; const { provider } = params; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); if (provider) { return ( diff --git a/apps/login/src/app/(login)/idp/[provider]/success/page.tsx b/apps/login/src/app/(login)/idp/[provider]/success/page.tsx index 4c40a9a0..ddcd987e 100644 --- a/apps/login/src/app/(login)/idp/[provider]/success/page.tsx +++ b/apps/login/src/app/(login)/idp/[provider]/success/page.tsx @@ -1,59 +1,73 @@ import { ProviderSlug } from "@/lib/demos"; -import { getBrandingSettings, server } from "@/lib/zitadel"; +import { getBrandingSettings, userService } from "@/lib/zitadel"; import Alert, { AlertType } from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; import IdpSignin from "@/ui/IdpSignin"; +import { AddHumanUserRequest } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; import { - AddHumanUserRequest, IDPInformation, - RetrieveIdentityProviderIntentResponse, - user, IDPLink, -} from "@zitadel/server"; -import { ClientError } from "nice-grpc"; +} from "@zitadel/proto/zitadel/user/v2beta/idp_pb"; +import { PartialMessage } from "@zitadel/client2"; const PROVIDER_MAPPING: { - [provider: string]: (rI: IDPInformation) => Partial; + [provider: string]: ( + rI: IDPInformation, + ) => PartialMessage; } = { [ProviderSlug.GOOGLE]: (idp: IDPInformation) => { - const idpLink: IDPLink = { + const rawInfo = idp.rawInformation?.toJson() as { + User: { + email: string; + name?: string; + given_name?: string; + family_name?: string; + }; + }; + + const idpLink: PartialMessage = { idpId: idp.idpId, userId: idp.userId, userName: idp.userName, }; - const req: Partial = { + + const req: PartialMessage = { username: idp.userName, email: { - email: idp.rawInformation?.User?.email, - isVerified: true, + email: rawInfo.User?.email, + verification: { case: "isVerified", value: true }, }, // organisation: Organisation | undefined; profile: { - displayName: idp.rawInformation?.User?.name ?? "", - givenName: idp.rawInformation?.User?.given_name ?? "", - familyName: idp.rawInformation?.User?.family_name ?? "", + displayName: rawInfo.User?.name ?? "", + givenName: rawInfo.User?.given_name ?? "", + familyName: rawInfo.User?.family_name ?? "", }, idpLinks: [idpLink], }; return req; }, [ProviderSlug.GITHUB]: (idp: IDPInformation) => { - const idpLink: IDPLink = { + const rawInfo = idp.rawInformation?.toJson() as { + email: string; + name: string; + }; + const idpLink: PartialMessage = { idpId: idp.idpId, userId: idp.userId, userName: idp.userName, }; - const req: Partial = { + const req: PartialMessage = { username: idp.userName, email: { - email: idp.rawInformation?.email, - isVerified: true, + email: rawInfo?.email, + verification: { case: "isVerified", value: true }, }, // organisation: Organisation | undefined; profile: { - displayName: idp.rawInformation?.name ?? "", - givenName: idp.rawInformation?.name ?? "", - familyName: idp.rawInformation?.name ?? "", + displayName: rawInfo?.name ?? "", + givenName: rawInfo?.name ?? "", + familyName: rawInfo?.name ?? "", }, idpLinks: [idpLink], }; @@ -61,11 +75,7 @@ const PROVIDER_MAPPING: { }, }; -function retrieveIDPIntent( - id: string, - token: string, -): Promise { - const userService = user.getUser(server); +function retrieveIDPIntent(id: string, token: string) { return userService.retrieveIdentityProviderIntent( { idpIntentId: id, idpIntentToken: token }, {}, @@ -77,7 +87,6 @@ function createUser( info: IDPInformation, ): Promise { const userData = PROVIDER_MAPPING[provider](info); - const userService = user.getUser(server); return userService.addHumanUser(userData, {}).then((resp) => resp.userId); } @@ -91,7 +100,7 @@ export default async function Page({ const { id, token, authRequestId, organization } = searchParams; const { provider } = params; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); if (provider && id && token) { return retrieveIDPIntent(id, token) @@ -128,7 +137,7 @@ export default async function Page({ ); }) - .catch((error: ClientError) => { + .catch((error) => { return (
@@ -136,7 +145,7 @@ export default async function Page({
{ - {JSON.stringify(error.details)} + {JSON.stringify(error.message)} }
diff --git a/apps/login/src/app/(login)/idp/page.tsx b/apps/login/src/app/(login)/idp/page.tsx index f9ea08d8..2a5186ec 100644 --- a/apps/login/src/app/(login)/idp/page.tsx +++ b/apps/login/src/app/(login)/idp/page.tsx @@ -1,28 +1,16 @@ import { getBrandingSettings, getLegalAndSupportSettings, - server, + settingsService, } from "@/lib/zitadel"; import DynamicTheme from "@/ui/DynamicTheme"; import { SignInWithIDP } from "@/ui/SignInWithIDP"; -import { - GetActiveIdentityProvidersResponse, - IdentityProvider, - ZitadelServer, - settings, -} from "@zitadel/server"; +import { makeReqCtx } from "@zitadel/client2/v2beta"; -function getIdentityProviders( - server: ZitadelServer, - orgId?: string, -): Promise { - const settingsService = settings.getSettings(server); +function getIdentityProviders(orgId?: string) { return settingsService - .getActiveIdentityProviders( - orgId ? { ctx: { orgId } } : { ctx: { instance: true } }, - {}, - ) - .then((resp: GetActiveIdentityProvidersResponse) => { + .getActiveIdentityProviders({ ctx: makeReqCtx(orgId) }, {}) + .then((resp) => { return resp.identityProviders; }); } @@ -35,15 +23,15 @@ export default async function Page({ const authRequestId = searchParams?.authRequestId; const organization = searchParams?.organization; - const legal = await getLegalAndSupportSettings(server, organization); + const legal = await getLegalAndSupportSettings(organization); - const identityProviders = await getIdentityProviders(server, organization); + const identityProviders = await getIdentityProviders(organization); const host = process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : "http://localhost:3000"; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/loginname/page.tsx b/apps/login/src/app/(login)/loginname/page.tsx index ca875b6b..20cdeb41 100644 --- a/apps/login/src/app/(login)/loginname/page.tsx +++ b/apps/login/src/app/(login)/loginname/page.tsx @@ -2,29 +2,17 @@ import { getBrandingSettings, getLegalAndSupportSettings, getLoginSettings, - server, + settingsService, } from "@/lib/zitadel"; import DynamicTheme from "@/ui/DynamicTheme"; import { SignInWithIDP } from "@/ui/SignInWithIDP"; import UsernameForm from "@/ui/UsernameForm"; -import { - GetActiveIdentityProvidersResponse, - IdentityProvider, - ZitadelServer, - settings, -} from "@zitadel/server"; +import { makeReqCtx } from "@zitadel/client2/v2beta"; -function getIdentityProviders( - server: ZitadelServer, - orgId?: string, -): Promise { - const settingsService = settings.getSettings(server); +function getIdentityProviders(orgId?: string) { return settingsService - .getActiveIdentityProviders( - orgId ? { ctx: { orgId } } : { ctx: { instance: true } }, - {}, - ) - .then((resp: GetActiveIdentityProvidersResponse) => { + .getActiveIdentityProviders({ ctx: makeReqCtx(orgId) }, {}) + .then((resp) => { return resp.identityProviders; }); } @@ -39,16 +27,16 @@ export default async function Page({ const organization = searchParams?.organization; const submit: boolean = searchParams?.submit === "true"; - const loginSettings = await getLoginSettings(server, organization); - const legal = await getLegalAndSupportSettings(server); + const loginSettings = await getLoginSettings(organization); + const legal = await getLegalAndSupportSettings(); - const identityProviders = await getIdentityProviders(server, organization); + const identityProviders = await getIdentityProviders(organization); const host = process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : "http://localhost:3000"; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/mfa/create/page.tsx b/apps/login/src/app/(login)/mfa/create/page.tsx new file mode 100644 index 00000000..4fd798f7 --- /dev/null +++ b/apps/login/src/app/(login)/mfa/create/page.tsx @@ -0,0 +1,35 @@ +"use client"; +import { Button, ButtonVariants } from "@/ui/Button"; +import { TextInput } from "@/ui/Input"; +import UserAvatar from "@/ui/UserAvatar"; +import { useRouter } from "next/navigation"; + +export default function Page() { + const router = useRouter(); + + return ( +
+

Password

+

Enter your password.

+ + + +
+ +
+
+ + +
+
+ ); +} diff --git a/apps/login/src/app/(login)/mfa/page.tsx b/apps/login/src/app/(login)/mfa/page.tsx index 1d13c02f..4efaca0f 100644 --- a/apps/login/src/app/(login)/mfa/page.tsx +++ b/apps/login/src/app/(login)/mfa/page.tsx @@ -2,7 +2,6 @@ import { getBrandingSettings, getSession, listAuthenticationMethodTypes, - server, } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import ChooseSecondFactor from "@/ui/ChooseSecondFactor"; @@ -33,7 +32,7 @@ export default async function Page({ loginName, organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session && response.session.factors?.user?.id) { return listAuthenticationMethodTypes( response.session.factors.user.id, @@ -49,7 +48,7 @@ export default async function Page({ async function loadSessionById(sessionId: string, organization?: string) { const recent = await getSessionCookieById(sessionId, organization); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session && response.session.factors?.user?.id) { return listAuthenticationMethodTypes( response.session.factors.user.id, @@ -63,7 +62,7 @@ export default async function Page({ }); } - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/mfa/set/page.tsx b/apps/login/src/app/(login)/mfa/set/page.tsx index 9d855b10..eca46999 100644 --- a/apps/login/src/app/(login)/mfa/set/page.tsx +++ b/apps/login/src/app/(login)/mfa/set/page.tsx @@ -4,7 +4,6 @@ import { getSession, getUserByID, listAuthenticationMethodTypes, - server, } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import ChooseSecondFactorToSetup from "@/ui/ChooseSecondFactorToSetup"; @@ -14,7 +13,6 @@ import { getMostRecentCookieWithLoginname, getSessionCookieById, } from "@/utils/cookies"; -import { user } from "@zitadel/server"; export default async function Page({ searchParams, @@ -36,16 +34,21 @@ export default async function Page({ loginName, organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session && response.session.factors?.user?.id) { const userId = response.session.factors.user.id; return listAuthenticationMethodTypes(userId).then((methods) => { return getUserByID(userId).then((user) => { + const humanUser = + user.user?.type.case === "human" + ? user.user?.type.value + : undefined; + return { factors: response.session?.factors, authMethods: methods.authMethodTypes ?? [], - phoneVerified: user.user?.human?.phone?.isVerified ?? false, - emailVerified: user.user?.human?.email?.isVerified ?? false, + phoneVerified: humanUser?.phone?.isVerified ?? false, + emailVerified: humanUser?.email?.isVerified ?? false, }; }); }); @@ -55,16 +58,20 @@ export default async function Page({ async function loadSessionById(sessionId: string, organization?: string) { const recent = await getSessionCookieById(sessionId, organization); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session && response.session.factors?.user?.id) { const userId = response.session.factors.user.id; return listAuthenticationMethodTypes(userId).then((methods) => { return getUserByID(userId).then((user) => { + const humanUser = + user.user?.type.case === "human" + ? user.user?.type.value + : undefined; return { factors: response.session?.factors, authMethods: methods.authMethodTypes ?? [], - phoneVerified: user.user?.human?.phone?.isVerified ?? false, - emailVerified: user.user?.human?.email?.isVerified ?? false, + phoneVerified: humanUser?.phone?.isVerified ?? false, + emailVerified: humanUser?.email?.isVerified ?? false, }; }); }); @@ -72,8 +79,8 @@ export default async function Page({ }); } - const branding = await getBrandingSettings(server, organization); - const loginSettings = await getLoginSettings(server, organization); + const branding = await getBrandingSettings(organization); + const loginSettings = await getLoginSettings(organization); return ( diff --git a/apps/login/src/app/(login)/otp/[method]/page.tsx b/apps/login/src/app/(login)/otp/[method]/page.tsx index 814c75e5..fc1641da 100644 --- a/apps/login/src/app/(login)/otp/[method]/page.tsx +++ b/apps/login/src/app/(login)/otp/[method]/page.tsx @@ -2,7 +2,6 @@ import { getBrandingSettings, getLoginSettings, getSession, - server, } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; @@ -24,7 +23,7 @@ export default async function Page({ const { session, token } = await loadSession(loginName, organization); - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); async function loadSession(loginName?: string, organization?: string) { const recent = await getMostRecentCookieWithLoginname( @@ -32,7 +31,7 @@ export default async function Page({ organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { return { session: response?.session, token: recent.token }; }); } diff --git a/apps/login/src/app/(login)/otp/[method]/set/page.tsx b/apps/login/src/app/(login)/otp/[method]/set/page.tsx index f1785fd6..d4161e09 100644 --- a/apps/login/src/app/(login)/otp/[method]/set/page.tsx +++ b/apps/login/src/app/(login)/otp/[method]/set/page.tsx @@ -4,7 +4,6 @@ import { getBrandingSettings, getSession, registerTOTP, - server, } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import { Button, ButtonVariants } from "@/ui/Button"; @@ -13,9 +12,8 @@ import { Spinner } from "@/ui/Spinner"; import TOTPRegister from "@/ui/TOTPRegister"; import UserAvatar from "@/ui/UserAvatar"; import { getMostRecentCookieWithLoginname } from "@/utils/cookies"; -import { RegisterTOTPResponse } from "@zitadel/server"; import Link from "next/link"; -import { ClientError } from "nice-grpc"; +import { RegisterTOTPResponse } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; export default async function Page({ searchParams, @@ -28,11 +26,11 @@ export default async function Page({ searchParams; const { method } = params; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); const { session, token } = await loadSession(loginName, organization); let totpResponse: RegisterTOTPResponse | undefined, - totpError: ClientError | undefined; + totpError: Error | undefined; if (session && session.factors?.user?.id) { if (method === "time-based") { await registerTOTP(session.factors.user.id) @@ -63,7 +61,7 @@ export default async function Page({ organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { return { session: response?.session, token: recent.token }; }); } @@ -111,7 +109,7 @@ export default async function Page({ {totpError && (
- {totpError?.details} + {totpError?.message}
)} diff --git a/apps/login/src/app/(login)/passkey/add/page.tsx b/apps/login/src/app/(login)/passkey/add/page.tsx index 33980960..ac865634 100644 --- a/apps/login/src/app/(login)/passkey/add/page.tsx +++ b/apps/login/src/app/(login)/passkey/add/page.tsx @@ -1,4 +1,4 @@ -import { getBrandingSettings, getSession, server } from "@/lib/zitadel"; +import { getBrandingSettings, getSession } from "@/lib/zitadel"; import Alert, { AlertType } from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; import RegisterPasskey from "@/ui/RegisterPasskey"; @@ -20,7 +20,7 @@ export default async function Page({ loginName, organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } @@ -33,7 +33,7 @@ export default async function Page({ ? "When set up, you will be able to authenticate without a password." : "Your device will ask for your fingerprint, face, or screen lock"; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/passkey/login/page.tsx b/apps/login/src/app/(login)/passkey/login/page.tsx index 00a1b2a1..fe315348 100644 --- a/apps/login/src/app/(login)/passkey/login/page.tsx +++ b/apps/login/src/app/(login)/passkey/login/page.tsx @@ -1,4 +1,4 @@ -import { getBrandingSettings, getSession, server } from "@/lib/zitadel"; +import { getBrandingSettings, getSession } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; import LoginPasskey from "@/ui/LoginPasskey"; @@ -32,7 +32,7 @@ export default async function Page({ loginName, organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } @@ -41,14 +41,14 @@ export default async function Page({ async function loadSessionById(sessionId: string, organization?: string) { const recent = await getSessionCookieById(sessionId, organization); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } }); } - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/password/page.tsx b/apps/login/src/app/(login)/password/page.tsx index 75938ccd..c0fa08bd 100644 --- a/apps/login/src/app/(login)/password/page.tsx +++ b/apps/login/src/app/(login)/password/page.tsx @@ -2,7 +2,6 @@ import { getBrandingSettings, getLoginSettings, getSession, - server, } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; @@ -25,15 +24,15 @@ export default async function Page({ organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } }); } - const branding = await getBrandingSettings(server, organization); - const loginSettings = await getLoginSettings(server, organization); + const branding = await getBrandingSettings(organization); + const loginSettings = await getLoginSettings(organization); return ( diff --git a/apps/login/src/app/(login)/register/page.tsx b/apps/login/src/app/(login)/register/page.tsx index b41634c4..d9f7ef0f 100644 --- a/apps/login/src/app/(login)/register/page.tsx +++ b/apps/login/src/app/(login)/register/page.tsx @@ -2,7 +2,6 @@ import { getBrandingSettings, getLegalAndSupportSettings, getPasswordComplexitySettings, - server, } from "@/lib/zitadel"; import DynamicTheme from "@/ui/DynamicTheme"; import RegisterFormWithoutPassword from "@/ui/RegisterFormWithoutPassword"; @@ -18,13 +17,11 @@ export default async function Page({ const setPassword = !!(firstname && lastname && email); - const legal = await getLegalAndSupportSettings(server, organization); - const passwordComplexitySettings = await getPasswordComplexitySettings( - server, - organization, - ); + const legal = await getLegalAndSupportSettings(organization); + const passwordComplexitySettings = + await getPasswordComplexitySettings(organization); - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return setPassword ? ( diff --git a/apps/login/src/app/(login)/signedin/page.tsx b/apps/login/src/app/(login)/signedin/page.tsx index edf4b491..bdc6d0d6 100644 --- a/apps/login/src/app/(login)/signedin/page.tsx +++ b/apps/login/src/app/(login)/signedin/page.tsx @@ -1,9 +1,4 @@ -import { - createCallback, - getBrandingSettings, - getSession, - server, -} from "@/lib/zitadel"; +import { createCallback, getBrandingSettings, getSession } from "@/lib/zitadel"; import DynamicTheme from "@/ui/DynamicTheme"; import UserAvatar from "@/ui/UserAvatar"; import { getMostRecentCookieWithLoginname } from "@/utils/cookies"; @@ -13,14 +8,17 @@ async function loadSession(loginName: string, authRequestId?: string) { const recent = await getMostRecentCookieWithLoginname(`${loginName}`); if (authRequestId) { - return createCallback(server, { + return createCallback({ authRequestId, - session: { sessionId: recent.id, sessionToken: recent.token }, + callbackKind: { + case: "session", + value: { sessionId: recent.id, sessionToken: recent.token }, + }, }).then(({ callbackUrl }) => { return redirect(callbackUrl); }); } - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } @@ -31,7 +29,7 @@ export default async function Page({ searchParams }: { searchParams: any }) { const { loginName, authRequestId, organization } = searchParams; const sessionFactors = await loadSession(loginName, authRequestId); - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/u2f/page.tsx b/apps/login/src/app/(login)/u2f/page.tsx index 87573bca..2c8c8b19 100644 --- a/apps/login/src/app/(login)/u2f/page.tsx +++ b/apps/login/src/app/(login)/u2f/page.tsx @@ -2,7 +2,6 @@ import { getBrandingSettings, getLoginSettings, getSession, - server, } from "@/lib/zitadel"; import Alert from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; @@ -22,7 +21,7 @@ export default async function Page({ }) { const { loginName, authRequestId, sessionId, organization } = searchParams; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); const sessionFactors = sessionId ? await loadSessionById(sessionId, organization) @@ -36,7 +35,7 @@ export default async function Page({ loginName, organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } @@ -45,7 +44,7 @@ export default async function Page({ async function loadSessionById(sessionId: string, organization?: string) { const recent = await getSessionCookieById(sessionId, organization); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } diff --git a/apps/login/src/app/(login)/u2f/set/page.tsx b/apps/login/src/app/(login)/u2f/set/page.tsx index c51c88cf..2b3caf3d 100644 --- a/apps/login/src/app/(login)/u2f/set/page.tsx +++ b/apps/login/src/app/(login)/u2f/set/page.tsx @@ -1,4 +1,4 @@ -import { getBrandingSettings, getSession, server } from "@/lib/zitadel"; +import { getBrandingSettings, getSession } from "@/lib/zitadel"; import Alert, { AlertType } from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; import RegisterPasskey from "@/ui/RegisterPasskey"; @@ -20,7 +20,7 @@ export default async function Page({ loginName, organization, ); - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { if (response?.session) { return response.session; } @@ -30,7 +30,7 @@ export default async function Page({ const description = "Your device will ask for your fingerprint, face, or screen lock"; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/(login)/verify/page.tsx b/apps/login/src/app/(login)/verify/page.tsx index 0049fcec..5bc0cb0e 100644 --- a/apps/login/src/app/(login)/verify/page.tsx +++ b/apps/login/src/app/(login)/verify/page.tsx @@ -1,4 +1,4 @@ -import { getBrandingSettings, server } from "@/lib/zitadel"; +import { getBrandingSettings } from "@/lib/zitadel"; import DynamicTheme from "@/ui/DynamicTheme"; import VerifyEmailForm from "@/ui/VerifyEmailForm"; import { ExclamationTriangleIcon } from "@heroicons/react/24/outline"; @@ -15,7 +15,7 @@ export default async function Page({ searchParams }: { searchParams: any }) { passwordset, } = searchParams; - const branding = await getBrandingSettings(server, organization); + const branding = await getBrandingSettings(organization); return ( diff --git a/apps/login/src/app/api/idp/start/route.ts b/apps/login/src/app/api/idp/start/route.ts index 795e563f..7d7d9679 100644 --- a/apps/login/src/app/api/idp/start/route.ts +++ b/apps/login/src/app/api/idp/start/route.ts @@ -1,4 +1,4 @@ -import { server, startIdentityProviderFlow } from "@/lib/zitadel"; +import { startIdentityProviderFlow } from "@/lib/zitadel"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { @@ -6,7 +6,7 @@ export async function POST(request: NextRequest) { if (body) { let { idpId, successUrl, failureUrl } = body; - return startIdentityProviderFlow(server, { + return startIdentityProviderFlow({ idpId, urls: { successUrl, diff --git a/apps/login/src/app/api/loginname/route.ts b/apps/login/src/app/api/loginname/route.ts index 75c9635c..7707a01c 100644 --- a/apps/login/src/app/api/loginname/route.ts +++ b/apps/login/src/app/api/loginname/route.ts @@ -7,11 +7,7 @@ export async function POST(request: NextRequest) { if (body) { const { loginName, authRequestId, organization } = body; return listUsers(loginName, organization).then((users) => { - if ( - users.details && - users.details.totalResult == 1 && - users.result[0].userId - ) { + if (users.details?.totalResult == BigInt(1) && users.result[0].userId) { const userId = users.result[0].userId; return createSessionForUserIdAndUpdateCookie( userId, diff --git a/apps/login/src/app/api/otp/set/route.ts b/apps/login/src/app/api/otp/set/route.ts index 244702cd..b9d27b63 100644 --- a/apps/login/src/app/api/otp/set/route.ts +++ b/apps/login/src/app/api/otp/set/route.ts @@ -5,8 +5,9 @@ import { getSessionCookieByLoginName, } from "@/utils/cookies"; import { setSessionAndUpdateCookie } from "@/utils/session"; -import { Checks } from "@zitadel/server"; import { NextRequest, NextResponse, userAgent } from "next/server"; +import { Checks } from "@zitadel/proto/zitadel/session/v2beta/session_service_pb"; +import { PlainMessage } from "@zitadel/client2"; export async function POST(request: NextRequest) { const body = await request.json(); @@ -31,7 +32,7 @@ export async function POST(request: NextRequest) { return recentPromise .then((recent) => { - const checks: Checks = {}; + const checks: PlainMessage = {}; if (method === "time-based") { checks.totp = { diff --git a/apps/login/src/app/api/passkeys/route.ts b/apps/login/src/app/api/passkeys/route.ts index 36293280..4489bee3 100644 --- a/apps/login/src/app/api/passkeys/route.ts +++ b/apps/login/src/app/api/passkeys/route.ts @@ -2,7 +2,6 @@ import { createPasskeyRegistrationLink, getSession, registerPasskey, - server, } from "@/lib/zitadel"; import { getSessionCookieById } from "@/utils/cookies"; import { NextRequest, NextResponse } from "next/server"; @@ -14,11 +13,7 @@ export async function POST(request: NextRequest) { const sessionCookie = await getSessionCookieById(sessionId); - const session = await getSession( - server, - sessionCookie.id, - sessionCookie.token, - ); + const session = await getSession(sessionCookie.id, sessionCookie.token); const domain: string = request.nextUrl.hostname; @@ -29,6 +24,9 @@ export async function POST(request: NextRequest) { return createPasskeyRegistrationLink(userId) .then((resp) => { const code = resp.code; + if (!code) { + throw new Error("Missing code in response"); + } return registerPasskey(userId, code, domain).then((resp) => { return NextResponse.json(resp); }); diff --git a/apps/login/src/app/api/passkeys/verify/route.ts b/apps/login/src/app/api/passkeys/verify/route.ts index 4cfd8342..a09b848c 100644 --- a/apps/login/src/app/api/passkeys/verify/route.ts +++ b/apps/login/src/app/api/passkeys/verify/route.ts @@ -1,4 +1,4 @@ -import { getSession, server, verifyPasskeyRegistration } from "@/lib/zitadel"; +import { getSession, verifyPasskeyRegistration } from "@/lib/zitadel"; import { getSessionCookieById } from "@/utils/cookies"; import { NextRequest, NextResponse, userAgent } from "next/server"; @@ -15,17 +15,12 @@ export async function POST(request: NextRequest) { } const sessionCookie = await getSessionCookieById(sessionId); - const session = await getSession( - server, - sessionCookie.id, - sessionCookie.token, - ); + const session = await getSession(sessionCookie.id, sessionCookie.token); const userId = session?.session?.factors?.user?.id; if (userId) { return verifyPasskeyRegistration( - server, passkeyId, passkeyName, publicKeyCredential, diff --git a/apps/login/src/app/api/registeruser/route.ts b/apps/login/src/app/api/registeruser/route.ts index 7ed49f48..dcb3626a 100644 --- a/apps/login/src/app/api/registeruser/route.ts +++ b/apps/login/src/app/api/registeruser/route.ts @@ -1,4 +1,4 @@ -import { addHumanUser, server } from "@/lib/zitadel"; +import { addHumanUser } from "@/lib/zitadel"; import { createSessionAndUpdateCookie, createSessionForUserIdAndUpdateCookie, @@ -17,7 +17,7 @@ export async function POST(request: NextRequest) { authRequestId, } = body; - return addHumanUser(server, { + return addHumanUser({ email: email, firstName, lastName, diff --git a/apps/login/src/app/api/resendverifyemail/route.ts b/apps/login/src/app/api/resendverifyemail/route.ts index 3ccd724d..bf75776d 100644 --- a/apps/login/src/app/api/resendverifyemail/route.ts +++ b/apps/login/src/app/api/resendverifyemail/route.ts @@ -1,4 +1,4 @@ -import { setEmail, server } from "@/lib/zitadel"; +import { setEmail } from "@/lib/zitadel"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { @@ -7,7 +7,7 @@ export async function POST(request: NextRequest) { const { userId, code } = body; // replace with resend Mail method once its implemented - return setEmail(server, userId) + return setEmail(userId) .then((resp) => { return NextResponse.json(resp); }) diff --git a/apps/login/src/app/api/session/route.ts b/apps/login/src/app/api/session/route.ts index 40493340..c0bc0d06 100644 --- a/apps/login/src/app/api/session/route.ts +++ b/apps/login/src/app/api/session/route.ts @@ -1,5 +1,4 @@ import { - server, deleteSession, getSession, getUserByID, @@ -17,7 +16,6 @@ import { createSessionForIdpAndUpdateCookie, setSessionAndUpdateCookie, } from "@/utils/session"; -import { Challenges, Checks, RequestChallenges } from "@zitadel/server"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { @@ -104,27 +102,23 @@ export async function PUT(request: NextRequest) { challenges && (challenges.otpEmail === "" || challenges.otpSms === "") ) { - const sessionResponse = await getSession( - server, - recent.id, - recent.token, - ); + const sessionResponse = await getSession(recent.id, recent.token); + if (sessionResponse && sessionResponse.session?.factors?.user?.id) { const userResponse = await getUserByID( sessionResponse.session.factors.user.id, ); - if ( - challenges.otpEmail === "" && - userResponse.user?.human?.email?.email - ) { - challenges.otpEmail = userResponse.user?.human?.email?.email; + const humanUser = + userResponse.user?.type.case === "human" + ? userResponse.user?.type.value + : undefined; + + if (challenges.otpEmail === "" && humanUser?.email?.email) { + challenges.otpEmail = humanUser?.email?.email; } - if ( - challenges.otpSms === "" && - userResponse.user?.human?.phone?.phone - ) { - challenges.otpSms = userResponse.user?.human?.phone?.phone; + if (challenges.otpSms === "" && humanUser?.phone?.phone) { + challenges.otpSms = humanUser?.phone?.phone; } } } @@ -176,7 +170,7 @@ export async function DELETE(request: NextRequest) { if (id) { const session = await getSessionCookieById(id); - return deleteSession(server, session.id, session.token) + return deleteSession(session.id, session.token) .then(() => { return removeSessionFromCookie(session) .then(() => { diff --git a/apps/login/src/app/api/u2f/route.ts b/apps/login/src/app/api/u2f/route.ts index 368c5a80..6a1c1a82 100644 --- a/apps/login/src/app/api/u2f/route.ts +++ b/apps/login/src/app/api/u2f/route.ts @@ -3,7 +3,6 @@ import { getSession, registerPasskey, registerU2F, - server, } from "@/lib/zitadel"; import { getSessionCookieById } from "@/utils/cookies"; import { NextRequest, NextResponse } from "next/server"; @@ -15,11 +14,7 @@ export async function POST(request: NextRequest) { const sessionCookie = await getSessionCookieById(sessionId); - const session = await getSession( - server, - sessionCookie.id, - sessionCookie.token, - ); + const session = await getSession(sessionCookie.id, sessionCookie.token); const domain: string = request.nextUrl.hostname; diff --git a/apps/login/src/app/api/u2f/verify/route.ts b/apps/login/src/app/api/u2f/verify/route.ts index 1ea83f72..ef597e5f 100644 --- a/apps/login/src/app/api/u2f/verify/route.ts +++ b/apps/login/src/app/api/u2f/verify/route.ts @@ -1,7 +1,8 @@ -import { getSession, server, verifyU2FRegistration } from "@/lib/zitadel"; +import { getSession, verifyU2FRegistration } from "@/lib/zitadel"; import { getSessionCookieById } from "@/utils/cookies"; -import { VerifyU2FRegistrationRequest } from "@zitadel/server"; import { NextRequest, NextResponse, userAgent } from "next/server"; +import { VerifyU2FRegistrationRequest } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; +import { PlainMessage } from "@zitadel/client2"; export async function POST(request: NextRequest) { const body = await request.json(); @@ -16,16 +17,12 @@ export async function POST(request: NextRequest) { } const sessionCookie = await getSessionCookieById(sessionId); - const session = await getSession( - server, - sessionCookie.id, - sessionCookie.token, - ); + const session = await getSession(sessionCookie.id, sessionCookie.token); const userId = session?.session?.factors?.user?.id; if (userId) { - const req: VerifyU2FRegistrationRequest = { + const req: PlainMessage = { publicKeyCredential, u2fId, userId, diff --git a/apps/login/src/app/api/verifyemail/route.ts b/apps/login/src/app/api/verifyemail/route.ts index e2aae983..f8a21c46 100644 --- a/apps/login/src/app/api/verifyemail/route.ts +++ b/apps/login/src/app/api/verifyemail/route.ts @@ -1,4 +1,4 @@ -import { server, verifyEmail } from "@/lib/zitadel"; +import { verifyEmail } from "@/lib/zitadel"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { @@ -6,7 +6,7 @@ export async function POST(request: NextRequest) { if (body) { const { userId, code } = body; - return verifyEmail(server, userId, code) + return verifyEmail(userId, code) .then((resp) => { return NextResponse.json(resp); }) diff --git a/apps/login/src/app/layout.tsx b/apps/login/src/app/layout.tsx index 0eb4b191..5e299faf 100644 --- a/apps/login/src/app/layout.tsx +++ b/apps/login/src/app/layout.tsx @@ -6,8 +6,6 @@ import { LayoutProviders } from "@/ui/LayoutProviders"; import { Analytics } from "@vercel/analytics/react"; import ThemeWrapper from "@/ui/ThemeWrapper"; import { getBrandingSettings } from "@/lib/zitadel"; -import { server } from "../lib/zitadel"; -import { BrandingSettings } from "@zitadel/server"; import ThemeProvider from "@/ui/ThemeProvider"; import Theme from "@/ui/Theme"; diff --git a/apps/login/src/app/login/route.ts b/apps/login/src/app/login/route.ts index e6a8c335..e81f5663 100644 --- a/apps/login/src/app/login/route.ts +++ b/apps/login/src/app/login/route.ts @@ -3,15 +3,17 @@ import { getAuthRequest, getOrgByDomain, listSessions, - server, } from "@/lib/zitadel"; import { SessionCookie, getAllSessions } from "@/utils/cookies"; -import { Session, AuthRequest, Prompt } from "@zitadel/server"; import { NextRequest, NextResponse } from "next/server"; +import { Session } from "@zitadel/proto/zitadel/session/v2beta/session_pb"; +import { + AuthRequest, + Prompt, +} from "@zitadel/proto/zitadel/oidc/v2beta/authorization_pb"; async function loadSessions(ids: string[]): Promise { const response = await listSessions( - server, ids.filter((id: string | undefined) => !!id), ); @@ -81,9 +83,12 @@ export async function GET(request: NextRequest) { sessionToken: cookie?.token, }; - const { callbackUrl } = await createCallback(server, { + const { callbackUrl } = await createCallback({ authRequestId, - session, + callbackKind: { + case: "session", + value: session, + }, }); return NextResponse.redirect(callbackUrl); } @@ -92,7 +97,7 @@ export async function GET(request: NextRequest) { if (authRequestId) { console.log(`Login with authRequest: ${authRequestId}`); - const { authRequest } = await getAuthRequest(server, { authRequestId }); + const { authRequest } = await getAuthRequest({ authRequestId }); let organization = ""; @@ -132,7 +137,7 @@ export async function GET(request: NextRequest) { return NextResponse.redirect(accountsUrl); }; - if (authRequest && authRequest.prompt.includes(Prompt.PROMPT_CREATE)) { + if (authRequest && authRequest.prompt.includes(Prompt.CREATE)) { const registerUrl = new URL("/register", request.url); if (authRequest?.id) { registerUrl.searchParams.set("authRequestId", authRequest?.id); @@ -147,9 +152,9 @@ export async function GET(request: NextRequest) { // use existing session and hydrate it for oidc if (authRequest && sessions.length) { // if some accounts are available for selection and select_account is set - if (authRequest.prompt.includes(Prompt.PROMPT_SELECT_ACCOUNT)) { + if (authRequest.prompt.includes(Prompt.SELECT_ACCOUNT)) { return gotoAccounts(); - } else if (authRequest.prompt.includes(Prompt.PROMPT_LOGIN)) { + } else if (authRequest.prompt.includes(Prompt.LOGIN)) { // if prompt is login const loginNameUrl = new URL("/loginname", request.url); if (authRequest?.id) { @@ -162,7 +167,7 @@ export async function GET(request: NextRequest) { loginNameUrl.searchParams.set("organization", organization); } return NextResponse.redirect(loginNameUrl); - } else if (authRequest.prompt.includes(Prompt.PROMPT_NONE)) { + } else if (authRequest.prompt.includes(Prompt.NONE)) { // NONE prompt - silent authentication let selectedSession = findSession(sessions, authRequest); @@ -177,9 +182,12 @@ export async function GET(request: NextRequest) { sessionId: cookie?.id, sessionToken: cookie?.token, }; - const { callbackUrl } = await createCallback(server, { + const { callbackUrl } = await createCallback({ authRequestId, - session, + callbackKind: { + case: "session", + value: session, + }, }); return NextResponse.redirect(callbackUrl); } else { @@ -209,9 +217,12 @@ export async function GET(request: NextRequest) { sessionToken: cookie?.token, }; try { - const { callbackUrl } = await createCallback(server, { + const { callbackUrl } = await createCallback({ authRequestId, - session, + callbackKind: { + case: "session", + value: session, + }, }); if (callbackUrl) { return NextResponse.redirect(callbackUrl); diff --git a/apps/login/src/lib/demos.ts b/apps/login/src/lib/demos.ts index fa0742a4..464bb578 100644 --- a/apps/login/src/lib/demos.ts +++ b/apps/login/src/lib/demos.ts @@ -35,7 +35,7 @@ export const demos: { name: string; items: Item[] }[] = [ }, { name: "IDP Register", - slug: "register/idp", + slug: "idp", description: "Add a user from an external identity provider", }, ], diff --git a/apps/login/src/lib/server-actions.ts b/apps/login/src/lib/server-actions.ts index 5ced55c6..612f5f05 100644 --- a/apps/login/src/lib/server-actions.ts +++ b/apps/login/src/lib/server-actions.ts @@ -1,7 +1,7 @@ "use server"; import { getMostRecentCookieWithLoginname } from "@/utils/cookies"; -import { getSession, server, verifyTOTPRegistration } from "./zitadel"; +import { getSession, verifyTOTPRegistration } from "./zitadel"; export async function verifyTOTP( code: string, @@ -10,7 +10,7 @@ export async function verifyTOTP( ) { return getMostRecentCookieWithLoginname(loginName, organization) .then((recent) => { - return getSession(server, recent.id, recent.token).then((response) => { + return getSession(recent.id, recent.token).then((response) => { return { session: response?.session, token: recent.token }; }); }) diff --git a/apps/login/src/lib/zitadel.ts b/apps/login/src/lib/zitadel.ts index b4f0ec90..4c241016 100644 --- a/apps/login/src/lib/zitadel.ts +++ b/apps/login/src/lib/zitadel.ts @@ -1,109 +1,52 @@ -import { VerifyU2FRegistrationRequest } from "@zitadel/server"; import { - GetUserByIDResponse, - RegisterTOTPResponse, - VerifyTOTPRegistrationResponse, -} from "@zitadel/server"; + createOIDCServiceClient, + createSessionServiceClient, + createSettingsServiceClient, + createUserServiceClient, + makeReqCtx, +} from "@zitadel/client2/v2beta"; +import { createManagementServiceClient } from "@zitadel/client2/v1"; +import { createServerTransport } from "@zitadel/node"; +import { Checks } from "@zitadel/proto/zitadel/session/v2beta/session_service_pb"; +import { RequestChallenges } from "@zitadel/proto/zitadel/session/v2beta/challenge_pb"; import { - LegalAndSupportSettings, - PasswordComplexitySettings, - ZitadelServer, - VerifyMyAuthFactorOTPResponse, - ZitadelServerOptions, - user, - oidc, - settings, - getServers, - auth, - initializeServer, - session, - GetGeneralSettingsResponse, - CreateSessionResponse, - GetBrandingSettingsResponse, - GetPasswordComplexitySettingsResponse, - RegisterU2FResponse, - GetLegalAndSupportSettingsResponse, - AddHumanUserResponse, - BrandingSettings, - ListSessionsResponse, - GetSessionResponse, - VerifyEmailResponse, - Checks, - SetSessionResponse, - SetSessionRequest, - ListUsersResponse, - management, - DeleteSessionResponse, - VerifyPasskeyRegistrationResponse, - LoginSettings, - GetOrgByDomainGlobalResponse, - GetLoginSettingsResponse, - ListAuthenticationMethodTypesResponse, - StartIdentityProviderIntentRequest, - StartIdentityProviderIntentResponse, RetrieveIdentityProviderIntentRequest, - RetrieveIdentityProviderIntentResponse, - GetAuthRequestResponse, - GetAuthRequestRequest, - CreateCallbackRequest, - CreateCallbackResponse, - RequestChallenges, - TextQueryMethod, - ListHumanAuthFactorsResponse, - AddHumanUserRequest, - AddOTPEmailResponse, - AddOTPSMSResponse, -} from "@zitadel/server"; + VerifyU2FRegistrationRequest, +} from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; +import { CreateCallbackRequest } from "@zitadel/proto/zitadel/oidc/v2beta/oidc_service_pb"; +import { TextQueryMethod } from "@zitadel/proto/zitadel/object/v2beta/object_pb"; +import type { RedirectURLs } from "@zitadel/proto/zitadel/user/v2beta/idp_pb"; +import { PlainMessage } from "@zitadel/client2"; const SESSION_LIFETIME_S = 3000; -export const zitadelConfig: ZitadelServerOptions = { - name: "zitadel login", - apiUrl: process.env.ZITADEL_API_URL ?? "", - token: process.env.ZITADEL_SERVICE_USER_TOKEN ?? "", -}; - -let server: ZitadelServer; +const transport = createServerTransport( + process.env.ZITADEL_SERVICE_USER_TOKEN!, + { + baseUrl: process.env.ZITADEL_API_URL!, + httpVersion: "2", + }, +); -if (!getServers().length) { - console.log("initialize server"); - server = initializeServer(zitadelConfig); -} +export const sessionService = createSessionServiceClient(transport); +export const managementService = createManagementServiceClient(transport); +export const userService = createUserServiceClient(transport); +export const oidcService = createOIDCServiceClient(transport); +export const settingsService = createSettingsServiceClient(transport); -export async function getBrandingSettings( - server: ZitadelServer, - organization?: string, -): Promise { - const settingsService = settings.getSettings(server); +export async function getBrandingSettings(organization?: string) { return settingsService - .getBrandingSettings( - { ctx: organization ? { orgId: organization } : { instance: true } }, - {}, - ) - .then((resp: GetBrandingSettingsResponse) => resp.settings); + .getBrandingSettings({ ctx: makeReqCtx(organization) }, {}) + .then((resp) => resp.settings); } -export async function getLoginSettings( - server: ZitadelServer, - orgId?: string, -): Promise { - const settingsService = settings.getSettings(server); +export async function getLoginSettings(orgId?: string) { return settingsService - .getLoginSettings({ ctx: orgId ? { orgId } : { instance: true } }, {}) - .then((resp: GetLoginSettingsResponse) => resp.settings); + .getLoginSettings({ ctx: makeReqCtx(orgId) }, {}) + .then((resp) => resp.settings); } -export async function verifyMyAuthFactorOTP( - code: string, -): Promise { - const authService = auth.getAuth(server); - return authService.verifyMyAuthFactorOTP({ code }, {}); -} - -export async function addOTPEmail( - userId: string, -): Promise { - const userService = user.getUser(server); +export async function addOTPEmail(userId: string) { return userService.addOTPEmail( { userId, @@ -112,98 +55,72 @@ export async function addOTPEmail( ); } -export async function addOTPSMS( - userId: string, - token?: string, -): Promise { - let userService; - if (token) { - const authConfig: ZitadelServerOptions = { - name: "zitadel login", - apiUrl: process.env.ZITADEL_API_URL ?? "", - token: token, - }; - - const sessionUser = initializeServer(authConfig); - userService = user.getUser(sessionUser); - } else { - userService = user.getUser(server); - } +export async function addOTPSMS(userId: string, token?: string) { + // TODO: Follow up here, I do not understand the branching + // let userService; + // if (token) { + // const authConfig: ZitadelServerOptions = { + // name: "zitadel login", + // apiUrl: process.env.ZITADEL_API_URL ?? "", + // token: token, + // }; + // const sessionUser = initializeServer(authConfig); + // userService = user.getUser(sessionUser); + // } else { + // userService = user.getUser(server); + // } + return userService.addOTPSMS({ userId }, {}); } -export async function registerTOTP( - userId: string, - token?: string, -): Promise { - let userService; - if (token) { - const authConfig: ZitadelServerOptions = { - name: "zitadel login", - apiUrl: process.env.ZITADEL_API_URL ?? "", - token: token, - }; - - const sessionUser = initializeServer(authConfig); - userService = user.getUser(sessionUser); - } else { - userService = user.getUser(server); - } +export async function registerTOTP(userId: string, token?: string) { + // TODO: Follow up here, I do not understand the branching + // let userService; + // if (token) { + // const authConfig: ZitadelServerOptions = { + // name: "zitadel login", + // apiUrl: process.env.ZITADEL_API_URL ?? "", + // token: token, + // }; + // + // const sessionUser = initializeServer(authConfig); + // userService = user.getUser(sessionUser); + // } else { + // userService = user.getUser(server); + // } return userService.registerTOTP({ userId }, {}); } -export async function getGeneralSettings( - server: ZitadelServer, -): Promise { - const settingsService = settings.getSettings(server); +export async function getGeneralSettings() { return settingsService .getGeneralSettings({}, {}) - .then((resp: GetGeneralSettingsResponse) => resp.supportedLanguages); + .then((resp) => resp.supportedLanguages); } -export async function getLegalAndSupportSettings( - server: ZitadelServer, - organization?: string, -): Promise { - const settingsService = settings.getSettings(server); +export async function getLegalAndSupportSettings(organization?: string) { return settingsService - .getLegalAndSupportSettings( - { ctx: organization ? { orgId: organization } : { instance: true } }, - {}, - ) - .then((resp: GetLegalAndSupportSettingsResponse) => { + .getLegalAndSupportSettings({ ctx: makeReqCtx(organization) }, {}) + .then((resp) => { return resp.settings; }); } -export async function getPasswordComplexitySettings( - server: ZitadelServer, - organization?: string, -): Promise { - const settingsService = settings.getSettings(server); - +export async function getPasswordComplexitySettings(organization?: string) { return settingsService - .getPasswordComplexitySettings( - organization - ? { ctx: { orgId: organization } } - : { ctx: { instance: true } }, - {}, - ) - .then((resp: GetPasswordComplexitySettingsResponse) => resp.settings); + .getPasswordComplexitySettings({ ctx: makeReqCtx(organization) }) + .then((resp) => resp.settings); } export async function createSessionFromChecks( - server: ZitadelServer, - checks: Checks, - challenges: RequestChallenges | undefined, -): Promise { - const sessionService = session.getSession(server); + checks: PlainMessage, + challenges: PlainMessage | undefined, +) { return sessionService.createSession( { checks: checks, challenges, lifetime: { - seconds: SESSION_LIFETIME_S, + seconds: BigInt(SESSION_LIFETIME_S), nanos: 0, }, }, @@ -212,77 +129,69 @@ export async function createSessionFromChecks( } export async function createSessionForUserIdAndIdpIntent( - server: ZitadelServer, userId: string, idpIntent: { idpIntentId?: string | undefined; idpIntentToken?: string | undefined; }, -): Promise { - const sessionService = session.getSession(server); - - return sessionService.createSession( - { - checks: { user: { userId }, idpIntent }, - // lifetime: { - // seconds: 300, - // nanos: 0, - // }, +) { + return sessionService.createSession({ + checks: { + user: { + search: { + case: "userId", + value: userId, + }, + }, + idpIntent, }, - {}, - ); + // lifetime: { + // seconds: 300, + // nanos: 0, + // }, + }); } export async function setSession( - server: ZitadelServer, sessionId: string, sessionToken: string, challenges: RequestChallenges | undefined, - checks: Checks, -): Promise { - const sessionService = session.getSession(server); - - const payload: SetSessionRequest = { - sessionId, - sessionToken, - challenges, - checks: {}, - metadata: {}, - }; - - if (checks && payload.checks) { - payload.checks = checks; - } - - return sessionService.setSession(payload, {}); + checks?: PlainMessage, +) { + return sessionService.setSession( + { + sessionId, + sessionToken, + challenges, + checks: checks ? checks : {}, + metadata: {}, + }, + {}, + ); } -export async function getSession( - server: ZitadelServer, - sessionId: string, - sessionToken: string, -): Promise { - const sessionService = session.getSession(server); +export async function getSession(sessionId: string, sessionToken: string) { return sessionService.getSession({ sessionId, sessionToken }, {}); } -export async function deleteSession( - server: ZitadelServer, - sessionId: string, - sessionToken: string, -): Promise { - const sessionService = session.getSession(server); +export async function deleteSession(sessionId: string, sessionToken: string) { return sessionService.deleteSession({ sessionId, sessionToken }, {}); } -export async function listSessions( - server: ZitadelServer, - ids: string[], -): Promise { - const sessionService = session.getSession(server); - const query = { offset: 0, limit: 100, asc: true }; - const queries = [{ idsQuery: { ids } }]; - return sessionService.listSessions({ queries: queries }, {}); +export async function listSessions(ids: string[]) { + return sessionService.listSessions( + { + queries: [ + { + query: { + case: "idsQuery", + value: { ids: ids }, + }, + }, + ], + }, + {}, + ); } export type AddHumanUserData = { @@ -293,89 +202,82 @@ export type AddHumanUserData = { organization: string | undefined; }; -export async function addHumanUser( - server: ZitadelServer, - { email, firstName, lastName, password, organization }: AddHumanUserData, -): Promise { - const userService = user.getUser(server); - - const payload: Partial = { +export async function addHumanUser({ + email, + firstName, + lastName, + password, + organization, +}: AddHumanUserData) { + return userService.addHumanUser({ email: { email }, username: email, profile: { givenName: firstName, familyName: lastName }, - }; - - if (organization) { - payload.organization = { orgId: organization }; - } - - return userService.addHumanUser( - password - ? { - ...payload, - password: { password }, - } - : payload, - {}, - ); + organization: organization + ? { org: { case: "orgId", value: organization } } + : undefined, + passwordType: password + ? { case: "password", value: { password: password } } + : undefined, + }); } export async function verifyTOTPRegistration( code: string, userId: string, token?: string, -): Promise { - let userService; - if (token) { - const authConfig: ZitadelServerOptions = { - name: "zitadel login", - apiUrl: process.env.ZITADEL_API_URL ?? "", - token: token, - }; - - const sessionUser = initializeServer(authConfig); - userService = user.getUser(sessionUser); - } else { - userService = user.getUser(server); - } +) { + // let userService; + // if (token) { + // const authConfig: ZitadelServerOptions = { + // name: "zitadel login", + // apiUrl: process.env.ZITADEL_API_URL ?? "", + // token: token, + // }; + // + // const sessionUser = initializeServer(authConfig); + // userService = user.getUser(sessionUser); + // } else { + // userService = user.getUser(server); + // } return userService.verifyTOTPRegistration({ code, userId }, {}); } -export async function getUserByID( - userId: string, -): Promise { - const userService = user.getUser(server); - +export async function getUserByID(userId: string) { return userService.getUserByID({ userId }, {}); } -export async function listUsers( - userName: string, - organizationId: string, -): Promise { - const userService = user.getUser(server); - +export async function listUsers(userName: string, organizationId: string) { return userService.listUsers( { queries: organizationId ? [ { - userNameQuery: { - userName, - method: TextQueryMethod.TEXT_QUERY_METHOD_EQUALS, + query: { + case: "userNameQuery", + value: { + userName, + method: TextQueryMethod.EQUALS, + }, }, }, { - organizationIdQuery: { - organizationId, + query: { + case: "organizationIdQuery", + value: { + organizationId, + }, }, }, ] : [ { - userNameQuery: { - userName, - method: TextQueryMethod.TEXT_QUERY_METHOD_EQUALS, + query: { + case: "userNameQuery", + value: { + userName, + method: TextQueryMethod.EQUALS, + }, }, }, ], @@ -384,64 +286,52 @@ export async function listUsers( ); } -export async function getOrgByDomain( - domain: string, -): Promise { - const mgmtService = management.getManagement(server); - return mgmtService.getOrgByDomainGlobal({ domain }, {}); +export async function getOrgByDomain(domain: string) { + return managementService.getOrgByDomainGlobal({ domain }, {}); } -export async function startIdentityProviderFlow( - server: ZitadelServer, - { idpId, urls }: StartIdentityProviderIntentRequest, -): Promise { - const userService = user.getUser(server); - +export async function startIdentityProviderFlow({ + idpId, + urls, +}: { + idpId: string; + urls: PlainMessage; +}) { return userService.startIdentityProviderIntent({ idpId, - urls, + content: { + case: "urls", + value: urls, + }, }); } -export async function retrieveIdentityProviderInformation( - server: ZitadelServer, - { idpIntentId, idpIntentToken }: RetrieveIdentityProviderIntentRequest, -): Promise { - const userService = user.getUser(server); - +export async function retrieveIdentityProviderInformation({ + idpIntentId, + idpIntentToken, +}: RetrieveIdentityProviderIntentRequest) { return userService.retrieveIdentityProviderIntent({ idpIntentId, idpIntentToken, }); } -export async function getAuthRequest( - server: ZitadelServer, - { authRequestId }: GetAuthRequestRequest, -): Promise { - const oidcService = oidc.getOidc(server); - +export async function getAuthRequest({ + authRequestId, +}: { + authRequestId: string; +}) { return oidcService.getAuthRequest({ authRequestId, }); } -export async function createCallback( - server: ZitadelServer, - req: CreateCallbackRequest, -): Promise { - const oidcService = oidc.getOidc(server); - +export async function createCallback(req: PlainMessage) { return oidcService.createCallback(req); } -export async function verifyEmail( - server: ZitadelServer, - userId: string, - verificationCode: string, -): Promise { - const userservice = user.getUser(server); - return userservice.verifyEmail( +export async function verifyEmail(userId: string, verificationCode: string) { + return userService.verifyEmail( { userId, verificationCode, @@ -452,16 +342,11 @@ export async function verifyEmail( /** * - * @param server * @param userId the id of the user where the email should be set * @returns the newly set email */ -export async function setEmail( - server: ZitadelServer, - userId: string, -): Promise { - const userservice = user.getUser(server); - return userservice.setEmail( +export async function setEmail(userId: string) { + return userService.setEmail( { userId, }, @@ -471,48 +356,44 @@ export async function setEmail( /** * - * @param server * @param userId the id of the user where the email should be set * @returns the newly set email */ export async function createPasskeyRegistrationLink( userId: string, token?: string, -): Promise { - let userService; - if (token) { - const authConfig: ZitadelServerOptions = { - name: "zitadel login", - apiUrl: process.env.ZITADEL_API_URL ?? "", - token: token, - }; - - const sessionUser = initializeServer(authConfig); - userService = user.getUser(sessionUser); - } else { - userService = user.getUser(server); - } +) { + // let userService; + // if (token) { + // const authConfig: ZitadelServerOptions = { + // name: "zitadel login", + // apiUrl: process.env.ZITADEL_API_URL ?? "", + // token: token, + // }; + // + // const sessionUser = initializeServer(authConfig); + // userService = user.getUser(sessionUser); + // } else { + // userService = user.getUser(server); + // } return userService.createPasskeyRegistrationLink({ userId, - returnCode: {}, + medium: { + case: "returnCode", + value: {}, + }, }); } /** * - * @param server * @param userId the id of the user where the email should be set * @param domain the domain on which the factor is registered * @returns the newly set email */ -export async function registerU2F( - userId: string, - domain: string, -): Promise { - const userservice = user.getUser(server); - - return userservice.registerU2F({ +export async function registerU2F(userId: string, domain: string) { + return userService.registerU2F({ userId, domain, }); @@ -520,27 +401,22 @@ export async function registerU2F( /** * - * @param server * @param userId the id of the user where the email should be set * @param domain the domain on which the factor is registered * @returns the newly set email */ export async function verifyU2FRegistration( - request: VerifyU2FRegistrationRequest, -): Promise { - const userservice = user.getUser(server); - - return userservice.verifyU2FRegistration(request, {}); + request: PlainMessage, +) { + return userService.verifyU2FRegistration(request, {}); } /** * - * @param server * @param userId the id of the user where the email should be set * @returns the newly set email */ export async function verifyPasskeyRegistration( - server: ZitadelServer, passkeyId: string, passkeyName: string, publicKeyCredential: @@ -549,9 +425,8 @@ export async function verifyPasskeyRegistration( } | undefined, userId: string, -): Promise { - const userservice = user.getUser(server); - return userservice.verifyPasskeyRegistration( +) { + return userService.verifyPasskeyRegistration( { passkeyId, passkeyName, @@ -564,7 +439,6 @@ export async function verifyPasskeyRegistration( /** * - * @param server * @param userId the id of the user where the email should be set * @returns the newly set email */ @@ -572,9 +446,8 @@ export async function registerPasskey( userId: string, code: { id: string; code: string }, domain: string, -): Promise { - const userservice = user.getUser(server); - return userservice.registerPasskey({ +) { + return userService.registerPasskey({ userId, code, domain, @@ -584,17 +457,11 @@ export async function registerPasskey( /** * - * @param server * @param userId the id of the user where the email should be set * @returns the newly set email */ -export async function listAuthenticationMethodTypes( - userId: string, -): Promise { - const userservice = user.getUser(server); - return userservice.listAuthenticationMethodTypes({ +export async function listAuthenticationMethodTypes(userId: string) { + return userService.listAuthenticationMethodTypes({ userId, }); } - -export { server }; diff --git a/apps/login/src/ui/ChooseSecondFactor.tsx b/apps/login/src/ui/ChooseSecondFactor.tsx index 46cef177..48154cf0 100644 --- a/apps/login/src/ui/ChooseSecondFactor.tsx +++ b/apps/login/src/ui/ChooseSecondFactor.tsx @@ -1,15 +1,11 @@ "use client"; -import { - AuthenticationMethodType, - LoginSettings, - login, -} from "@zitadel/server"; import Link from "next/link"; import { BadgeState, StateBadge } from "./StateBadge"; import clsx from "clsx"; import { CheckIcon } from "@heroicons/react/24/outline"; import { EMAIL, SMS, TOTP, U2F } from "./AuthMethods"; +import { AuthenticationMethodType } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; type Props = { loginName?: string; @@ -46,10 +42,14 @@ export default function ChooseSecondFactor({ {userMethods.map((method, i) => { return (
- {method === 4 && TOTP(false, "/otp/time-based?" + params)} - {method === 5 && U2F(false, "/u2f?" + params)} - {method === 7 && EMAIL(false, "/otp/email?" + params)} - {method === 6 && SMS(false, "/otp/sms?" + params)} + {method === AuthenticationMethodType.TOTP && + TOTP(false, "/otp/time-based?" + params)} + {method === AuthenticationMethodType.U2F && + U2F(false, "/u2f?" + params)} + {method === AuthenticationMethodType.OTP_EMAIL && + EMAIL(false, "/otp/email?" + params)} + {method === AuthenticationMethodType.OTP_SMS && + SMS(false, "/otp/sms?" + params)}
); })} diff --git a/apps/login/src/ui/ChooseSecondFactorToSetup.tsx b/apps/login/src/ui/ChooseSecondFactorToSetup.tsx index f868a235..de502cb8 100644 --- a/apps/login/src/ui/ChooseSecondFactorToSetup.tsx +++ b/apps/login/src/ui/ChooseSecondFactorToSetup.tsx @@ -1,7 +1,8 @@ "use client"; -import { AuthenticationMethodType, LoginSettings } from "@zitadel/server"; import { EMAIL, SMS, TOTP, U2F } from "./AuthMethods"; +import { LoginSettings } from "@zitadel/proto/zitadel/settings/v2beta/login_settings_pb"; +import { AuthenticationMethodType } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; type Props = { loginName?: string; @@ -48,13 +49,25 @@ export default function ChooseSecondFactorToSetup({
{loginSettings.secondFactors.map((factor, i) => { return factor === 1 - ? TOTP(userMethods.includes(4), "/otp/time-based/set?" + params) + ? TOTP( + userMethods.includes(AuthenticationMethodType.TOTP), + "/otp/time-based/set?" + params, + ) : factor === 2 - ? U2F(userMethods.includes(5), "/u2f/set?" + params) + ? U2F( + userMethods.includes(AuthenticationMethodType.U2F), + "/u2f/set?" + params, + ) : factor === 3 && emailVerified - ? EMAIL(userMethods.includes(7), "/otp/email/set?" + params) + ? EMAIL( + userMethods.includes(AuthenticationMethodType.OTP_EMAIL), + "/otp/email/set?" + params, + ) : factor === 4 && phoneVerified - ? SMS(userMethods.includes(6), "/otp/sms/set?" + params) + ? SMS( + userMethods.includes(AuthenticationMethodType.OTP_SMS), + "/otp/sms/set?" + params, + ) : null; })}
diff --git a/apps/login/src/ui/DynamicTheme.tsx b/apps/login/src/ui/DynamicTheme.tsx index 0a91d8a5..6c8a1ffe 100644 --- a/apps/login/src/ui/DynamicTheme.tsx +++ b/apps/login/src/ui/DynamicTheme.tsx @@ -1,10 +1,10 @@ "use client"; -import { BrandingSettings } from "@zitadel/server"; import React from "react"; import { Logo } from "@/ui/Logo"; import ThemeWrapper from "./ThemeWrapper"; import { LayoutProviders } from "./LayoutProviders"; +import { BrandingSettings } from "@zitadel/proto/zitadel/settings/v2beta/branding_settings_pb"; export default function DynamicTheme({ branding, diff --git a/apps/login/src/ui/LoginOTP.tsx b/apps/login/src/ui/LoginOTP.tsx index 1235d6ec..f95077bd 100644 --- a/apps/login/src/ui/LoginOTP.tsx +++ b/apps/login/src/ui/LoginOTP.tsx @@ -6,10 +6,11 @@ import { coerceToArrayBuffer, coerceToBase64Url } from "@/utils/base64"; import { Button, ButtonVariants } from "./Button"; import Alert, { AlertType } from "./Alert"; import { Spinner } from "./Spinner"; -import { Checks } from "@zitadel/server"; import { useForm } from "react-hook-form"; import { TextInput } from "./Input"; -import { Challenges } from "@zitadel/server"; +import { Checks } from "@zitadel/proto/zitadel/session/v2beta/session_service_pb"; +import { PlainMessage } from "@zitadel/client2"; +import { Challenges } from "@zitadel/proto/zitadel/session/v2beta/challenge_pb"; // either loginName or sessionId must be provided type Props = { @@ -63,7 +64,7 @@ export default function LoginOTP({ }, []); async function updateSessionForOTPChallenge() { - const challenges: Challenges = {}; + const challenges: PlainMessage = {}; if (method === "email") { challenges.otpEmail = ""; @@ -111,7 +112,7 @@ export default function LoginOTP({ body.authRequestId = authRequestId; } - const checks: Checks = {}; + const checks: PlainMessage = {}; if (method === "sms") { checks.otpSms = { code: values.code }; } diff --git a/apps/login/src/ui/LoginPasskey.tsx b/apps/login/src/ui/LoginPasskey.tsx index 6048d5b7..da27581a 100644 --- a/apps/login/src/ui/LoginPasskey.tsx +++ b/apps/login/src/ui/LoginPasskey.tsx @@ -6,7 +6,7 @@ import { coerceToArrayBuffer, coerceToBase64Url } from "@/utils/base64"; import { Button, ButtonVariants } from "./Button"; import Alert from "./Alert"; import { Spinner } from "./Spinner"; -import { Checks } from "@zitadel/server"; +import { Checks } from "@zitadel/proto/zitadel/session/v2beta/session_service_pb"; // either loginName or sessionId must be provided type Props = { diff --git a/apps/login/src/ui/PasswordComplexity.tsx b/apps/login/src/ui/PasswordComplexity.tsx index 7b18dffb..35ee959c 100644 --- a/apps/login/src/ui/PasswordComplexity.tsx +++ b/apps/login/src/ui/PasswordComplexity.tsx @@ -4,7 +4,7 @@ import { symbolValidator, upperCaseValidator, } from "@/utils/validators"; -import { PasswordComplexitySettings } from "@zitadel/server"; +import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2beta/password_settings_pb"; type Props = { passwordComplexitySettings: PasswordComplexitySettings; @@ -68,7 +68,7 @@ export default function PasswordComplexity({
{hasMinLength ? check : cross} - Password length {passwordComplexitySettings.minLength} + Password length {passwordComplexitySettings.minLength.toString()}
) : ( diff --git a/apps/login/src/ui/PasswordForm.tsx b/apps/login/src/ui/PasswordForm.tsx index d9e766b6..26f21927 100644 --- a/apps/login/src/ui/PasswordForm.tsx +++ b/apps/login/src/ui/PasswordForm.tsx @@ -7,12 +7,9 @@ import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; import Alert from "./Alert"; -import { - LoginSettings, - AuthFactor, - Checks, - AuthenticationMethodType, -} from "@zitadel/server"; +import { LoginSettings } from "@zitadel/proto/zitadel/settings/v2beta/login_settings_pb"; +import { Checks } from "@zitadel/proto/zitadel/session/v2beta/session_service_pb"; +import { AuthenticationMethodType } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; type Inputs = { password: string; @@ -83,7 +80,8 @@ export default function PasswordForm({ // exclude password const availableSecondFactors = resp.authMethods?.filter( - (m: AuthenticationMethodType) => m !== 1, + (m: AuthenticationMethodType) => + m !== AuthenticationMethodType.PASSWORD, ); if (availableSecondFactors.length == 1) { const params = new URLSearchParams({ diff --git a/apps/login/src/ui/PrivacyPolicyCheckboxes.tsx b/apps/login/src/ui/PrivacyPolicyCheckboxes.tsx index da94e428..4879bad3 100644 --- a/apps/login/src/ui/PrivacyPolicyCheckboxes.tsx +++ b/apps/login/src/ui/PrivacyPolicyCheckboxes.tsx @@ -2,7 +2,7 @@ import React, { useState } from "react"; import Link from "next/link"; import { Checkbox } from "./Checkbox"; -import { LegalAndSupportSettings } from "@zitadel/server"; +import { LegalAndSupportSettings } from "@zitadel/proto/zitadel/settings/v2beta/legal_settings_pb"; type Props = { legal: LegalAndSupportSettings; diff --git a/apps/login/src/ui/RegisterFormWithoutPassword.tsx b/apps/login/src/ui/RegisterFormWithoutPassword.tsx index fc95aac0..c8dfb1f7 100644 --- a/apps/login/src/ui/RegisterFormWithoutPassword.tsx +++ b/apps/login/src/ui/RegisterFormWithoutPassword.tsx @@ -1,6 +1,5 @@ "use client"; -import { LegalAndSupportSettings } from "@zitadel/server"; import { useState } from "react"; import { Button, ButtonVariants } from "./Button"; import { TextInput } from "./Input"; @@ -12,6 +11,7 @@ import AuthenticationMethodRadio, { methods, } from "./AuthenticationMethodRadio"; import Alert from "./Alert"; +import { LegalAndSupportSettings } from "@zitadel/proto/zitadel/settings/v2beta/legal_settings_pb"; type Inputs = | { diff --git a/apps/login/src/ui/RegisterPasskey.tsx b/apps/login/src/ui/RegisterPasskey.tsx index 67c864c0..ffb30788 100644 --- a/apps/login/src/ui/RegisterPasskey.tsx +++ b/apps/login/src/ui/RegisterPasskey.tsx @@ -6,8 +6,8 @@ import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; import Alert from "./Alert"; -import { AuthRequest, RegisterPasskeyResponse } from "@zitadel/server"; import { coerceToArrayBuffer, coerceToBase64Url } from "@/utils/base64"; +import { RegisterPasskeyResponse } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; type Inputs = {}; type Props = { @@ -89,37 +89,31 @@ export default function RegisterPasskey({ function submitRegisterAndContinue(value: Inputs): Promise { return submitRegister().then((resp: RegisterPasskeyResponse) => { const passkeyId = resp.passkeyId; - - if ( - resp.publicKeyCredentialCreationOptions && - resp.publicKeyCredentialCreationOptions.publicKey - ) { - resp.publicKeyCredentialCreationOptions.publicKey.challenge = - coerceToArrayBuffer( - resp.publicKeyCredentialCreationOptions.publicKey.challenge, - "challenge", - ); - resp.publicKeyCredentialCreationOptions.publicKey.user.id = - coerceToArrayBuffer( - resp.publicKeyCredentialCreationOptions.publicKey.user.id, - "userid", - ); - if ( - resp.publicKeyCredentialCreationOptions.publicKey.excludeCredentials - ) { - resp.publicKeyCredentialCreationOptions.publicKey.excludeCredentials.map( - (cred: any) => { - cred.id = coerceToArrayBuffer( - cred.id as string, - "excludeCredentials.id", - ); - return cred; - }, - ); + const options: CredentialCreationOptions = + (resp.publicKeyCredentialCreationOptions?.toJson() as CredentialCreationOptions) ?? + {}; + + if (options?.publicKey) { + options.publicKey.challenge = coerceToArrayBuffer( + options.publicKey.challenge, + "challenge", + ); + options.publicKey.user.id = coerceToArrayBuffer( + options.publicKey.user.id, + "userid", + ); + if (options.publicKey.excludeCredentials) { + options.publicKey.excludeCredentials.map((cred: any) => { + cred.id = coerceToArrayBuffer( + cred.id as string, + "excludeCredentials.id", + ); + return cred; + }); } navigator.credentials - .create(resp.publicKeyCredentialCreationOptions) + .create(options) .then((resp) => { if ( resp && diff --git a/apps/login/src/ui/RegisterU2F.tsx b/apps/login/src/ui/RegisterU2F.tsx index 71ccad81..9c5bf4d9 100644 --- a/apps/login/src/ui/RegisterU2F.tsx +++ b/apps/login/src/ui/RegisterU2F.tsx @@ -6,8 +6,8 @@ import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; import Alert from "./Alert"; -import { RegisterU2FResponse } from "@zitadel/server"; import { coerceToArrayBuffer, coerceToBase64Url } from "@/utils/base64"; +import { RegisterU2FResponse } from "@zitadel/proto/zitadel/user/v2beta/user_service_pb"; type Inputs = {}; type Props = { @@ -87,37 +87,31 @@ export default function RegisterU2F({ function submitRegisterAndContinue(value: Inputs): Promise { return submitRegister().then((resp: RegisterU2FResponse) => { const u2fId = resp.u2fId; - - if ( - resp.publicKeyCredentialCreationOptions && - resp.publicKeyCredentialCreationOptions.publicKey - ) { - resp.publicKeyCredentialCreationOptions.publicKey.challenge = - coerceToArrayBuffer( - resp.publicKeyCredentialCreationOptions.publicKey.challenge, - "challenge", - ); - resp.publicKeyCredentialCreationOptions.publicKey.user.id = - coerceToArrayBuffer( - resp.publicKeyCredentialCreationOptions.publicKey.user.id, - "userid", - ); - if ( - resp.publicKeyCredentialCreationOptions.publicKey.excludeCredentials - ) { - resp.publicKeyCredentialCreationOptions.publicKey.excludeCredentials.map( - (cred: any) => { - cred.id = coerceToArrayBuffer( - cred.id as string, - "excludeCredentials.id", - ); - return cred; - }, - ); + const options: CredentialCreationOptions = + (resp.publicKeyCredentialCreationOptions?.toJson() as CredentialCreationOptions) ?? + {}; + + if (options.publicKey) { + options.publicKey.challenge = coerceToArrayBuffer( + options.publicKey.challenge, + "challenge", + ); + options.publicKey.user.id = coerceToArrayBuffer( + options.publicKey.user.id, + "userid", + ); + if (options.publicKey.excludeCredentials) { + options.publicKey.excludeCredentials.map((cred: any) => { + cred.id = coerceToArrayBuffer( + cred.id as string, + "excludeCredentials.id", + ); + return cred; + }); } navigator.credentials - .create(resp.publicKeyCredentialCreationOptions) + .create(options) .then((resp) => { if ( resp && diff --git a/apps/login/src/ui/SessionItem.tsx b/apps/login/src/ui/SessionItem.tsx index 5a620f21..fa13e865 100644 --- a/apps/login/src/ui/SessionItem.tsx +++ b/apps/login/src/ui/SessionItem.tsx @@ -1,10 +1,11 @@ "use client"; -import { Session } from "@zitadel/server"; + import Link from "next/link"; import { useState } from "react"; import { Avatar } from "./Avatar"; import moment from "moment"; import { XCircleIcon } from "@heroicons/react/24/outline"; +import { Session } from "@zitadel/proto/zitadel/session/v2beta/session_pb"; export default function SessionItem({ session, @@ -15,6 +16,8 @@ export default function SessionItem({ reload: () => void; authRequestId?: string; }) { + // TODO: remove casting when bufbuild/protobuf-es@v2 is released + session = Session.fromJson(session as any); const [loading, setLoading] = useState(false); async function clearSession(id: string) { @@ -43,7 +46,7 @@ export default function SessionItem({ const validPassword = session?.factors?.password?.verifiedAt; const validPasskey = session?.factors?.webAuthN?.verifiedAt; const stillValid = session.expirationDate - ? session.expirationDate > new Date() + ? session.expirationDate.toDate() > new Date() : true; const validDate = validPassword || validPasskey; @@ -96,7 +99,7 @@ export default function SessionItem({ {validUser && ( - {validDate && moment(new Date(validDate)).fromNow()} + {validDate && moment(validDate.toDate()).fromNow()} )}
diff --git a/apps/login/src/ui/SessionsList.tsx b/apps/login/src/ui/SessionsList.tsx index a7e0c4cf..d55679f8 100644 --- a/apps/login/src/ui/SessionsList.tsx +++ b/apps/login/src/ui/SessionsList.tsx @@ -1,9 +1,9 @@ "use client"; -import { Session } from "@zitadel/server"; import SessionItem from "./SessionItem"; import Alert from "./Alert"; import { useEffect, useState } from "react"; +import { Session } from "@zitadel/proto/zitadel/session/v2beta/session_pb"; type Props = { sessions: Session[]; diff --git a/apps/login/src/ui/SetPasswordForm.tsx b/apps/login/src/ui/SetPasswordForm.tsx index ed74d7b6..177d302a 100644 --- a/apps/login/src/ui/SetPasswordForm.tsx +++ b/apps/login/src/ui/SetPasswordForm.tsx @@ -1,6 +1,5 @@ "use client"; -import { PasswordComplexitySettings } from "@zitadel/server"; import PasswordComplexity from "./PasswordComplexity"; import { useState } from "react"; import { Button, ButtonVariants } from "./Button"; @@ -15,6 +14,7 @@ import { import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; import Alert from "./Alert"; +import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2beta/password_settings_pb"; type Inputs = | { diff --git a/apps/login/src/ui/SignInWithIDP.tsx b/apps/login/src/ui/SignInWithIDP.tsx index 4e749999..b6f1fe3a 100644 --- a/apps/login/src/ui/SignInWithIDP.tsx +++ b/apps/login/src/ui/SignInWithIDP.tsx @@ -10,11 +10,12 @@ import { import { useRouter } from "next/navigation"; import { ProviderSlug } from "@/lib/demos"; import Alert from "./Alert"; +import { IdentityProvider } from "@zitadel/proto/zitadel/settings/v2beta/login_settings_pb"; export interface SignInWithIDPProps { children?: ReactNode; host: string; - identityProviders: any[]; + identityProviders: IdentityProvider[]; authRequestId?: string; organization?: string; startIDPFlowPath?: (idpId: string) => string; @@ -30,6 +31,11 @@ export function SignInWithIDP({ organization, startIDPFlowPath = START_IDP_FLOW_PATH, }: SignInWithIDPProps) { + // TODO: remove casting when bufbuild/protobuf-es@v2 is released + identityProviders = identityProviders.map((idp) => + IdentityProvider.fromJson(idp as any), + ); + const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const router = useRouter(); diff --git a/apps/login/src/ui/TOTPRegister.tsx b/apps/login/src/ui/TOTPRegister.tsx index c24c18fd..bdec18af 100644 --- a/apps/login/src/ui/TOTPRegister.tsx +++ b/apps/login/src/ui/TOTPRegister.tsx @@ -10,7 +10,6 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { verifyTOTP } from "@/lib/server-actions"; -import { login } from "@zitadel/server"; type Inputs = { code: string; diff --git a/apps/login/src/ui/ThemeWrapper.tsx b/apps/login/src/ui/ThemeWrapper.tsx index 9c9d0bc0..2cfdcbc0 100644 --- a/apps/login/src/ui/ThemeWrapper.tsx +++ b/apps/login/src/ui/ThemeWrapper.tsx @@ -1,11 +1,12 @@ "use client"; -import { BrandingSettings } from "@zitadel/server"; import { setTheme } from "@/utils/colors"; import { useEffect } from "react"; +import { BrandingSettings } from "@zitadel/proto/zitadel/settings/v2beta/branding_settings_pb"; +import { PartialMessage } from "@zitadel/client2"; type Props = { - branding: Partial | undefined; + branding: PartialMessage | undefined; children: React.ReactNode; }; diff --git a/apps/login/src/ui/UsernameForm.tsx b/apps/login/src/ui/UsernameForm.tsx index e1f42a8c..39c54049 100644 --- a/apps/login/src/ui/UsernameForm.tsx +++ b/apps/login/src/ui/UsernameForm.tsx @@ -6,8 +6,8 @@ import { TextInput } from "./Input"; import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; -import { LoginSettings } from "@zitadel/server"; import Alert from "./Alert"; +import { LoginSettings } from "@zitadel/proto/zitadel/settings/v2beta/login_settings_pb"; type Inputs = { loginName: string; diff --git a/apps/login/src/utils/colors.ts b/apps/login/src/utils/colors.ts index a5fba8e0..d542dea6 100644 --- a/apps/login/src/utils/colors.ts +++ b/apps/login/src/utils/colors.ts @@ -1,6 +1,6 @@ import tinycolor from "tinycolor2"; - -import { BrandingSettings } from "@zitadel/server"; +import { BrandingSettings } from "@zitadel/proto/zitadel/settings/v2beta/branding_settings_pb"; +import { PartialMessage } from "@zitadel/client2"; export interface Color { name: string; @@ -69,7 +69,10 @@ type BrandingColors = { }; }; -export function setTheme(document: any, policy?: Partial) { +export function setTheme( + document: any, + policy?: PartialMessage, +) { const lP: BrandingColors = { lightTheme: { backgroundColor: policy?.lightTheme?.backgroundColor || BACKGROUND, diff --git a/apps/login/src/utils/session.ts b/apps/login/src/utils/session.ts index 22f57f26..36e16e0e 100644 --- a/apps/login/src/utils/session.ts +++ b/apps/login/src/utils/session.ts @@ -4,7 +4,6 @@ import { createSessionFromChecks, createSessionForUserIdAndIdpIntent, getSession, - server, setSession, } from "@/lib/zitadel"; import { @@ -13,11 +12,12 @@ import { updateSessionCookie, } from "./cookies"; import { - Session, Challenges, RequestChallenges, - Checks, -} from "@zitadel/server"; +} from "@zitadel/proto/zitadel/session/v2beta/challenge_pb"; +import { Session } from "@zitadel/proto/zitadel/session/v2beta/session_pb"; +import { Checks } from "@zitadel/proto/zitadel/session/v2beta/session_service_pb"; +import { PlainMessage } from "@zitadel/client2"; export async function createSessionAndUpdateCookie( loginName: string, @@ -25,22 +25,20 @@ export async function createSessionAndUpdateCookie( challenges: RequestChallenges | undefined, organization?: string, authRequestId?: string, -): Promise { +) { const createdSession = await createSessionFromChecks( - server, password ? { - user: { loginName }, + user: { search: { case: "loginName", value: loginName } }, password: { password }, // totp: { code: totpCode }, } - : { user: { loginName } }, + : { user: { search: { case: "loginName", value: loginName } } }, challenges, ); if (createdSession) { return getSession( - server, createdSession.sessionId, createdSession.sessionToken, ).then((response) => { @@ -48,9 +46,9 @@ export async function createSessionAndUpdateCookie( const sessionCookie: SessionCookie = { id: createdSession.sessionId, token: createdSession.sessionToken, - creationDate: `${response.session.creationDate?.getTime() ?? ""}`, - expirationDate: `${response.session.expirationDate?.getTime() ?? ""}`, - changeDate: `${response.session.changeDate?.getTime() ?? ""}`, + creationDate: `${response.session.creationDate?.toDate().getTime() ?? ""}`, + expirationDate: `${response.session.expirationDate?.toDate().getTime() ?? ""}`, + changeDate: `${response.session.changeDate?.toDate().getTime() ?? ""}`, loginName: response.session.factors.user.loginName ?? "", organization: response.session.factors.user.organizationId ?? "", }; @@ -82,20 +80,18 @@ export async function createSessionForUserIdAndUpdateCookie( authRequestId: string | undefined, ): Promise { const createdSession = await createSessionFromChecks( - server, password ? { - user: { userId }, + user: { search: { case: "userId", value: userId } }, password: { password }, // totp: { code: totpCode }, } - : { user: { userId } }, + : { user: { search: { case: "userId", value: userId } } }, challenges, ); if (createdSession) { return getSession( - server, createdSession.sessionId, createdSession.sessionToken, ).then((response) => { @@ -103,9 +99,9 @@ export async function createSessionForUserIdAndUpdateCookie( const sessionCookie: SessionCookie = { id: createdSession.sessionId, token: createdSession.sessionToken, - creationDate: `${response.session.creationDate?.getTime() ?? ""}`, - expirationDate: `${response.session.expirationDate?.getTime() ?? ""}`, - changeDate: `${response.session.changeDate?.getTime() ?? ""}`, + creationDate: `${response.session.creationDate?.toDate().getTime() ?? ""}`, + expirationDate: `${response.session.expirationDate?.toDate().getTime() ?? ""}`, + changeDate: `${response.session.changeDate?.toDate().getTime() ?? ""}`, loginName: response.session.factors.user.loginName ?? "", }; @@ -140,14 +136,12 @@ export async function createSessionForIdpAndUpdateCookie( authRequestId: string | undefined, ): Promise { const createdSession = await createSessionForUserIdAndIdpIntent( - server, userId, idpIntent, ); if (createdSession) { return getSession( - server, createdSession.sessionId, createdSession.sessionToken, ).then((response) => { @@ -155,9 +149,9 @@ export async function createSessionForIdpAndUpdateCookie( const sessionCookie: SessionCookie = { id: createdSession.sessionId, token: createdSession.sessionToken, - creationDate: `${response.session.creationDate?.getTime() ?? ""}`, - expirationDate: `${response.session.expirationDate?.getTime() ?? ""}`, - changeDate: `${response.session.changeDate?.getTime() ?? ""}`, + creationDate: `${response.session.creationDate?.toDate().getTime() ?? ""}`, + expirationDate: `${response.session.expirationDate?.toDate().getTime() ?? ""}`, + changeDate: `${response.session.changeDate?.toDate().getTime() ?? ""}`, loginName: response.session.factors.user.loginName ?? "", organization: response.session.factors.user.organizationId ?? "", }; @@ -188,12 +182,11 @@ export type SessionWithChallenges = Session & { export async function setSessionAndUpdateCookie( recentCookie: SessionCookie, - checks: Checks, + checks: PlainMessage, challenges: RequestChallenges | undefined, authRequestId: string | undefined, -): Promise { +) { return setSession( - server, recentCookie.id, recentCookie.token, challenges, @@ -205,7 +198,7 @@ export async function setSessionAndUpdateCookie( token: updatedSession.sessionToken, creationDate: recentCookie.creationDate, expirationDate: recentCookie.expirationDate, - changeDate: `${updatedSession.details?.changeDate?.getTime() ?? ""}`, + changeDate: `${updatedSession.details?.changeDate?.toDate().getTime() ?? ""}`, loginName: recentCookie.loginName, organization: recentCookie.organization, }; @@ -214,7 +207,7 @@ export async function setSessionAndUpdateCookie( sessionCookie.authRequestId = authRequestId; } - return getSession(server, sessionCookie.id, sessionCookie.token).then( + return getSession(sessionCookie.id, sessionCookie.token).then( (response) => { if (response?.session && response.session.factors?.user?.loginName) { const { session } = response; @@ -223,7 +216,7 @@ export async function setSessionAndUpdateCookie( token: updatedSession.sessionToken, creationDate: sessionCookie.creationDate, expirationDate: sessionCookie.expirationDate, - changeDate: `${session.changeDate?.getTime() ?? ""}`, + changeDate: `${session.changeDate?.toDate().getTime() ?? ""}`, loginName: session.factors?.user?.loginName ?? "", organization: session.factors?.user?.organizationId ?? "", }; diff --git a/apps/login/tsconfig.json b/apps/login/tsconfig.json index 161099e1..bf3a62f5 100755 --- a/apps/login/tsconfig.json +++ b/apps/login/tsconfig.json @@ -2,7 +2,6 @@ "extends": "@zitadel/tsconfig/nextjs.json", "compilerOptions": { "jsx": "preserve", - "rootDir": ".", "baseUrl": ".", "paths": { "@/*": ["./src/*"] diff --git a/apps/login/turbo.json b/apps/login/turbo.json index ff7aaf0a..92110f0f 100644 --- a/apps/login/turbo.json +++ b/apps/login/turbo.json @@ -6,16 +6,32 @@ "dependsOn": ["^build"] }, "test": { - "dependsOn": ["@zitadel/server#build", "@zitadel/react#build"] + "dependsOn": [ + "@zitadel/node#build", + "@zitadel/client2#build", + "@zitadel/react#build" + ] }, "test:integration": { - "dependsOn": ["@zitadel/server#build", "@zitadel/react#build"] + "dependsOn": [ + "@zitadel/node#build", + "@zitadel/client2#build", + "@zitadel/react#build" + ] }, "test:unit": { - "dependsOn": ["@zitadel/server#build"] + "dependsOn": [ + "@zitadel/node#build", + "@zitadel/client2#build", + "@zitadel/react#build" + ] }, "test:watch": { - "dependsOn": ["@zitadel/server#build", "@zitadel/react#build"] + "dependsOn": [ + "@zitadel/node#build", + "@zitadel/client2#build", + "@zitadel/react#build" + ] } } } diff --git a/packages/eslint-config-zitadel/package.json b/packages/eslint-config-zitadel/package.json index d45f0f43..0bf9d54e 100644 --- a/packages/eslint-config-zitadel/package.json +++ b/packages/eslint-config-zitadel/package.json @@ -3,14 +3,14 @@ "version": "0.0.0", "main": "index.js", "license": "MIT", + "publishConfig": { + "access": "public" + }, "dependencies": { "eslint-config-next": "^14.2.3", "@typescript-eslint/parser": "^7.9.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-react": "^7.34.1", "eslint-config-turbo": "^1.13.3" - }, - "publishConfig": { - "access": "public" } } diff --git a/packages/zitadel-next/package.json b/packages/zitadel-next/package.json index 3c84820b..d39052f8 100644 --- a/packages/zitadel-next/package.json +++ b/packages/zitadel-next/package.json @@ -9,6 +9,9 @@ "files": [ "dist/**" ], + "publishConfig": { + "access": "public" + }, "scripts": { "build": "tsup", "test": "pnpm test:unit", @@ -19,25 +22,21 @@ "lint": "eslint \"src/**/*.ts*\"", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist" }, - "devDependencies": { - "@types/react": "^17.0.13", - "@zitadel/tsconfig": "workspace:*", - "eslint-config-zitadel": "workspace:*", - "tailwindcss": "3.2.4", - "postcss": "8.4.21", - "zitadel-tailwind-config": "workspace:*", - "@zitadel/server": "workspace:*" - }, "peerDependencies": { "@zitadel/react": "workspace:*", - "@zitadel/server": "workspace:*", + "@zitadel/node": "workspace:*", "next": "^14.2.3", "react": "18.2.0" }, - "publishConfig": { - "access": "public" - }, "dependencies": { "next": "^14.2.3" + }, + "devDependencies": { + "@types/react": "^17.0.13", + "@zitadel/tsconfig": "workspace:*", + "eslint-config-zitadel": "workspace:*", + "tailwindcss": "3.2.4", + "postcss": "8.4.21", + "zitadel-tailwind-config": "workspace:*" } } diff --git a/packages/zitadel-next/turbo.json b/packages/zitadel-next/turbo.json index 9f540926..44e5e99f 100644 --- a/packages/zitadel-next/turbo.json +++ b/packages/zitadel-next/turbo.json @@ -6,7 +6,7 @@ }, "build": { "outputs": ["dist/**"], - "dependsOn": ["@zitadel/react#build", "@zitadel/server#build"] + "dependsOn": ["@zitadel/react#build"] } } } diff --git a/packages/zitadel-node/package.json b/packages/zitadel-node/package.json index 6ed0d04e..7d88eeba 100644 --- a/packages/zitadel-node/package.json +++ b/packages/zitadel-node/package.json @@ -32,9 +32,11 @@ }, "dependencies": { "@connectrpc/connect-node": "^1.4.0", + "@connectrpc/connect-web": "^1.4.0", "jose": "^5.3.0" }, "devDependencies": { + "@types/node": "^20.14.2", "@zitadel/client2": "workspace:*", "@zitadel/tsconfig": "workspace:*", "eslint-config-zitadel": "workspace:*" diff --git a/packages/zitadel-node/src/index.ts b/packages/zitadel-node/src/index.ts index 99bd262f..6cc1d499 100644 --- a/packages/zitadel-node/src/index.ts +++ b/packages/zitadel-node/src/index.ts @@ -1,6 +1,6 @@ import { NewAuthorizationBearerInterceptor } from "@zitadel/client2"; import { - createGrpcWebTransport, + createGrpcTransport, GrpcTransportOptions, } from "@connectrpc/connect-node"; import { importPKCS8, SignJWT } from "jose"; @@ -14,7 +14,7 @@ export function createServerTransport( token: string, opts: GrpcTransportOptions, ) { - return createGrpcWebTransport({ + return createGrpcTransport({ ...opts, interceptors: [ ...(opts.interceptors || []), diff --git a/packages/zitadel-react/package.json b/packages/zitadel-react/package.json index c90f151f..eb8592a5 100644 --- a/packages/zitadel-react/package.json +++ b/packages/zitadel-react/package.json @@ -14,6 +14,9 @@ "./styles.css": "./dist/index.css", "./assets/*": "./dist/assets/*" }, + "publishConfig": { + "access": "public" + }, "scripts": { "build": "tsup", "test": "pnpm test:unit", @@ -25,6 +28,9 @@ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist", "copy-files": "cp -R ./src/public/ ./dist/" }, + "peerDependencies": { + "react": "^18.2.0" + }, "devDependencies": { "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^14.0.0", @@ -38,11 +44,5 @@ "sass": "^1.77.1", "tailwindcss": "3.2.4", "zitadel-tailwind-config": "workspace:*" - }, - "publishConfig": { - "access": "public" - }, - "peerDependencies": { - "react": "18.2.0" } } diff --git a/packages/zitadel-react/tsconfig.json b/packages/zitadel-react/tsconfig.json index 460eef71..2200a65a 100644 --- a/packages/zitadel-react/tsconfig.json +++ b/packages/zitadel-react/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "@zitadel/tsconfig/react-library.json", "include": ["."], - "exclude": ["dist", "build", "node_modules"] + "exclude": ["dist", "build", "node_modules"], + "compilerOptions": { + "types": ["@testing-library/jest-dom"] + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7fda764..d0988f41 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,10 +13,10 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.22.0 - version: 2.25.2 + version: 2.27.5 '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.2.11(@types/node@18.11.9)(sass@1.77.1)) + version: 4.2.1(vite@5.2.11(@types/node@20.14.2)(sass@1.77.1)) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -37,34 +37,37 @@ importers: version: 5.4.5 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@18.11.9)(sass@1.77.1)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.14.2)(sass@1.77.1)) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@18.11.9)(jsdom@24.0.0)(sass@1.77.1) + version: 1.6.0(@types/node@20.14.2)(jsdom@24.0.0)(sass@1.77.1) apps/login: dependencies: '@headlessui/react': - specifier: ^1.7.14 - version: 1.7.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.7.18 + version: 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@heroicons/react': - specifier: 2.0.13 - version: 2.0.13(react@18.3.1) + specifier: 2.1.3 + version: 2.1.3(react@18.3.1) '@tailwindcss/forms': - specifier: 0.5.3 - version: 0.5.3(tailwindcss@3.2.4(postcss@8.4.21)) + specifier: 0.5.7 + version: 0.5.7(tailwindcss@3.2.4(postcss@8.4.21)) '@vercel/analytics': - specifier: ^1.0.0 - version: 1.0.0(react@18.3.1) - '@zitadel/client': + specifier: ^1.2.2 + version: 1.3.1(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.1))(react@18.3.1) + '@zitadel/client2': + specifier: workspace:* + version: link:../../packages/zitadel-client2 + '@zitadel/node': specifier: workspace:* - version: link:../../packages/zitadel-client + version: link:../../packages/zitadel-node + '@zitadel/proto': + specifier: workspace:* + version: link:../../packages/zitadel-proto '@zitadel/react': specifier: workspace:* version: link:../../packages/zitadel-react - '@zitadel/server': - specifier: workspace:* - version: link:../../packages/zitadel-server clsx: specifier: 1.2.1 version: 1.2.1 @@ -257,6 +260,9 @@ importers: packages/zitadel-next: dependencies: + '@zitadel/node': + specifier: workspace:* + version: link:../zitadel-node '@zitadel/react': specifier: workspace:* version: link:../zitadel-react @@ -270,9 +276,6 @@ importers: '@types/react': specifier: ^17.0.13 version: 17.0.52 - '@zitadel/server': - specifier: workspace:* - version: link:../zitadel-server '@zitadel/tsconfig': specifier: workspace:* version: link:../zitadel-tsconfig @@ -294,10 +297,16 @@ importers: '@connectrpc/connect-node': specifier: ^1.4.0 version: 1.4.0(@bufbuild/protobuf@1.9.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0)) + '@connectrpc/connect-web': + specifier: ^1.4.0 + version: 1.4.0(@bufbuild/protobuf@1.9.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0)) jose: specifier: ^5.3.0 version: 5.3.0 devDependencies: + '@types/node': + specifier: ^20.14.2 + version: 20.14.2 '@zitadel/client2': specifier: workspace:* version: link:../zitadel-client2 @@ -323,15 +332,15 @@ importers: packages/zitadel-react: dependencies: react: - specifier: 18.2.0 - version: 18.2.0 + specifier: ^18.2.0 + version: 18.3.1 devDependencies: '@testing-library/jest-dom': specifier: ^6.4.5 - version: 6.4.5(vitest@1.6.0(@types/node@18.11.9)(jsdom@24.0.0)(sass@1.77.1)) + version: 6.4.5(vitest@1.6.0(@types/node@20.14.2)(jsdom@24.0.0)(sass@1.77.1)) '@testing-library/react': specifier: ^14.0.0 - version: 14.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) + version: 14.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': specifier: ^18.2.17 version: 18.2.17 @@ -383,7 +392,7 @@ importers: devDependencies: '@bufbuild/buf': specifier: ^1.14.0 - version: 1.15.0 + version: 1.32.1 '@zitadel/tsconfig': specifier: workspace:* version: link:../zitadel-tsconfig @@ -635,57 +644,60 @@ packages: '@bufbuild/protobuf@1.9.0': resolution: {integrity: sha512-W7gp8Q/v1NlCZLsv8pQ3Y0uCu/SHgXOVFK+eUluUKWXmsb6VHkpNx0apdOWWcDbB9sJoKeP8uPrjmehJz6xETQ==, tarball: https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.9.0.tgz} - '@changesets/apply-release-plan@6.1.2': - resolution: {integrity: sha512-H8TV9E/WtJsDfoDVbrDGPXmkZFSv7W2KLqp4xX4MKZXshb0hsQZUNowUa8pnus9qb/5OZrFFRVsUsDCVHNW/AQ==} + '@changesets/apply-release-plan@7.0.3': + resolution: {integrity: sha512-klL6LCdmfbEe9oyfLxnidIf/stFXmrbFO/3gT5LU5pcyoZytzJe4gWpTBx3BPmyNPl16dZ1xrkcW7b98e3tYkA==, tarball: https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.3.tgz} - '@changesets/assemble-release-plan@5.2.2': - resolution: {integrity: sha512-B1qxErQd85AeZgZFZw2bDKyOfdXHhG+X5S+W3Da2yCem8l/pRy4G/S7iOpEcMwg6lH8q2ZhgbZZwZ817D+aLuQ==} + '@changesets/assemble-release-plan@6.0.2': + resolution: {integrity: sha512-n9/Tdq+ze+iUtjmq0mZO3pEhJTKkku9hUxtUadW30jlN7kONqJG3O6ALeXrmc6gsi/nvoCuKjqEJ68Hk8RbMTQ==, tarball: https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.2.tgz} - '@changesets/changelog-git@0.1.13': - resolution: {integrity: sha512-zvJ50Q+EUALzeawAxax6nF2WIcSsC5PwbuLeWkckS8ulWnuPYx8Fn/Sjd3rF46OzeKA8t30loYYV6TIzp4DIdg==} + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==, tarball: https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz} - '@changesets/cli@2.25.2': - resolution: {integrity: sha512-ACScBJXI3kRyMd2R8n8SzfttDHi4tmKSwVwXBazJOylQItSRSF4cGmej2E4FVf/eNfGy6THkL9GzAahU9ErZrA==} + '@changesets/cli@2.27.5': + resolution: {integrity: sha512-UVppOvzCjjylBenFcwcZNG5IaZ8jsIaEVraV/pbXgukYNb0Oqa0d8UWb0LkYzA1Bf1HmUrOfccFcRLheRuA7pA==, tarball: https://registry.npmjs.org/@changesets/cli/-/cli-2.27.5.tgz} hasBin: true - '@changesets/config@2.2.0': - resolution: {integrity: sha512-GGaokp3nm5FEDk/Fv2PCRcQCOxGKKPRZ7prcMqxEr7VSsG75MnChQE8plaW1k6V8L2bJE+jZWiRm19LbnproOw==} + '@changesets/config@3.0.1': + resolution: {integrity: sha512-nCr8pOemUjvGJ8aUu8TYVjqnUL+++bFOQHBVmtNbLvKzIDkN/uiP/Z4RKmr7NNaiujIURHySDEGFPftR4GbTUA==, tarball: https://registry.npmjs.org/@changesets/config/-/config-3.0.1.tgz} - '@changesets/errors@0.1.4': - resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==, tarball: https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz} - '@changesets/get-dependents-graph@1.3.4': - resolution: {integrity: sha512-+C4AOrrFY146ydrgKOo5vTZfj7vetNu1tWshOID+UjPUU9afYGDXI8yLnAeib1ffeBXV3TuGVcyphKpJ3cKe+A==} + '@changesets/get-dependents-graph@2.1.0': + resolution: {integrity: sha512-QOt6pQq9RVXKGHPVvyKimJDYJumx7p4DO5MO9AhRJYgAPgv0emhNqAqqysSVKHBm4sxKlGN4S1zXOIb5yCFuhQ==, tarball: https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.0.tgz} - '@changesets/get-release-plan@3.0.15': - resolution: {integrity: sha512-W1tFwxE178/en+zSj/Nqbc3mvz88mcdqUMJhRzN1jDYqN3QI4ifVaRF9mcWUU+KI0gyYEtYR65tour690PqTcA==} + '@changesets/get-release-plan@4.0.2': + resolution: {integrity: sha512-rOalz7nMuMV2vyeP7KBeAhqEB7FM2GFPO5RQSoOoUKKH9L6wW3QyPA2K+/rG9kBrWl2HckPVES73/AuwPvbH3w==, tarball: https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.2.tgz} - '@changesets/get-version-range-type@0.3.2': - resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==, tarball: https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz} - '@changesets/git@1.5.0': - resolution: {integrity: sha512-Xo8AT2G7rQJSwV87c8PwMm6BAc98BnufRMsML7m7Iw8Or18WFvFmxqG5aOL5PBvhgq9KrKvaeIBNIymracSuHg==} + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==, tarball: https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz} - '@changesets/logger@0.0.5': - resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==, tarball: https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz} - '@changesets/parse@0.3.15': - resolution: {integrity: sha512-3eDVqVuBtp63i+BxEWHPFj2P1s3syk0PTrk2d94W9JD30iG+OER0Y6n65TeLlY8T2yB9Fvj6Ev5Gg0+cKe/ZUA==} + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==, tarball: https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz} - '@changesets/pre@1.0.13': - resolution: {integrity: sha512-jrZc766+kGZHDukjKhpBXhBJjVQMied4Fu076y9guY1D3H622NOw8AQaLV3oQsDtKBTrT2AUFjt9Z2Y9Qx+GfA==} + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==, tarball: https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz} - '@changesets/read@0.5.8': - resolution: {integrity: sha512-eYaNfxemgX7f7ELC58e7yqQICW5FB7V+bd1lKt7g57mxUrTveYME+JPaBPpYx02nP53XI6CQp6YxnR9NfmFPKw==} + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==, tarball: https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz} + + '@changesets/should-skip-package@0.1.0': + resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==, tarball: https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.0.tgz} '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==, tarball: https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz} - '@changesets/types@5.2.0': - resolution: {integrity: sha512-km/66KOqJC+eicZXsm2oq8A8bVTSpkZJ60iPV/Nl5Z5c7p9kk8xxh6XGRTlnludHldxOOfudhnDN2qPxtHmXzA==} + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==, tarball: https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz} - '@changesets/write@0.2.2': - resolution: {integrity: sha512-kCYNHyF3xaId1Q/QE+DF3UTrHTyg3Cj/f++T8S8/EkC+jh1uK2LFnM9h+EzV+fsmnZDrs7r0J4LLpeI/VWC5Hg==} + '@changesets/write@0.3.1': + resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==, tarball: https://registry.npmjs.org/@changesets/write/-/write-0.3.1.tgz} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, tarball: https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz} @@ -698,6 +710,12 @@ packages: '@bufbuild/protobuf': ^1.4.2 '@connectrpc/connect': 1.4.0 + '@connectrpc/connect-web@1.4.0': + resolution: {integrity: sha512-13aO4psFbbm7rdOFGV0De2Za64DY/acMspgloDlcOKzLPPs0yZkhp1OOzAQeiAIr7BM/VOHIA3p8mF0inxCYTA==, tarball: https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-1.4.0.tgz} + peerDependencies: + '@bufbuild/protobuf': ^1.4.2 + '@connectrpc/connect': 1.4.0 + '@connectrpc/connect@1.4.0': resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==, tarball: https://registry.npmjs.org/@connectrpc/connect/-/connect-1.4.0.tgz} peerDependencies: @@ -1009,7 +1027,7 @@ packages: engines: {node: '>=14'} '@grpc/grpc-js@1.8.13': - resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==, tarball: https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.13.tgz} engines: {node: ^8.13.0 || >=10.10.0} '@grpc/proto-loader@0.7.6': @@ -1023,15 +1041,15 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@headlessui/react@1.7.14': - resolution: {integrity: sha512-znzdq9PG8rkwcu9oQ2FwIy0ZFtP9Z7ycS+BAqJ3R5EIqC/0bJGvhT7193rFf+45i9nnPsYvCQVW4V/bB9Xc+gA==} + '@headlessui/react@1.7.19': + resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==, tarball: https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz} engines: {node: '>=10'} peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - '@heroicons/react@2.0.13': - resolution: {integrity: sha512-iSN5XwmagrnirWlYEWNPdCDj9aRYVD/lnK3JlsC9/+fqGF80k8C7rl+1HCvBX0dBoagKqOFBs6fMhJJ1hOg1EQ==} + '@heroicons/react@2.1.3': + resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==, tarball: https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz} peerDependencies: react: '>= 16' @@ -1091,10 +1109,10 @@ packages: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, tarball: https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz} '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, tarball: https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz} '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==, tarball: https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz} '@mapbox/node-pre-gyp@1.0.10': resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} @@ -1181,34 +1199,34 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, tarball: https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz} '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, tarball: https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz} '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, tarball: https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz} '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, tarball: https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz} '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, tarball: https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz} '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, tarball: https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz} '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, tarball: https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz} '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, tarball: https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz} '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, tarball: https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz} '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, tarball: https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz} '@rollup/rollup-android-arm-eabi@4.17.2': resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==, tarball: https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz} @@ -1312,10 +1330,24 @@ packages: resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==, tarball: https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz} '@tailwindcss/forms@0.5.3': - resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} + resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==, tarball: https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz} peerDependencies: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + '@tailwindcss/forms@0.5.7': + resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==, tarball: https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + + '@tanstack/react-virtual@3.5.0': + resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==, tarball: https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/virtual-core@3.5.0': + resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==, tarball: https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.5.0.tgz} + '@testing-library/dom@10.1.0': resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==, tarball: https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz} engines: {node: '>=18'} @@ -1381,9 +1413,6 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz} - '@types/is-ci@3.0.0': - resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} - '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz} @@ -1397,16 +1426,19 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, tarball: https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz} '@types/node@18.11.9': resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + '@types/node@20.14.2': + resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==, tarball: https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz} + '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} '@types/object-hash@1.3.4': - resolution: {integrity: sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==} + resolution: {integrity: sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==, tarball: https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz} '@types/prop-types@15.7.5': resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -1429,8 +1461,8 @@ packages: '@types/scheduler@0.16.2': resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - '@types/semver@6.2.3': - resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, tarball: https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz} '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==, tarball: https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz} @@ -1481,10 +1513,16 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, tarball: https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz} - '@vercel/analytics@1.0.0': - resolution: {integrity: sha512-RQmj7pv82JwGDHrnKeRc6TtSw2U7rWNubc2IH0ernTzWTj02yr9zvIYiYJeztsBzrJtWv7m8Nz6vxxb+cdEtJw==} + '@vercel/analytics@1.3.1': + resolution: {integrity: sha512-xhSlYgAuJ6Q4WQGkzYTLmXwhYl39sWjoMA3nHxfkvG+WdBT25c563a7QhwwKivEOZtPJXifYHR1m2ihoisbWyA==, tarball: https://registry.npmjs.org/@vercel/analytics/-/analytics-1.3.1.tgz} peerDependencies: - react: ^16.8||^17||^18 + next: '>= 13' + react: ^18 || ^19 + peerDependenciesMeta: + next: + optional: true + react: + optional: true '@vercel/git-hooks@1.0.0': resolution: {integrity: sha512-OxDFAAdyiJ/H0b8zR9rFCu3BIb78LekBXOphOYG3snV4ULhKFX387pBPpqZ9HLiRTejBWBxYEahkw79tuIgdAA==} @@ -1614,7 +1652,7 @@ packages: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, tarball: https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, tarball: https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz} @@ -1742,7 +1780,7 @@ packages: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==, tarball: https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz} better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==, tarball: https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz} engines: {node: '>=4'} binary-extensions@2.2.0: @@ -1766,7 +1804,7 @@ packages: engines: {node: '>=8'} breakword@1.0.5: - resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==, tarball: https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz} browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} @@ -1818,7 +1856,7 @@ packages: engines: {node: '>= 6'} camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, tarball: https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz} engines: {node: '>=8'} camelcase-keys@7.0.2: @@ -1826,7 +1864,7 @@ packages: engines: {node: '>=12'} camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, tarball: https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz} engines: {node: '>=6'} camelcase@6.3.0: @@ -1851,7 +1889,7 @@ packages: engines: {node: '>=4'} chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, tarball: https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz} engines: {node: '>=4'} chalk@3.0.0: @@ -1863,7 +1901,7 @@ packages: engines: {node: '>=10'} chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, tarball: https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz} check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, tarball: https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz} @@ -1884,6 +1922,10 @@ packages: resolution: {integrity: sha512-lVZdhvbEudris15CLytp2u6Y0p5EKfztae9Fqa189MfNmln9F33XuH69v5fvNfiRN5/0eAUz2yJL3mo+nhaRKg==} engines: {node: '>=8'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, tarball: https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz} + engines: {node: '>=8'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1909,10 +1951,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, tarball: https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz} cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, tarball: https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz} cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -1922,7 +1964,7 @@ packages: engines: {node: '>=12'} clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, tarball: https://registry.npmjs.org/clone/-/clone-1.0.4.tgz} engines: {node: '>=0.8'} clsx@1.2.1: @@ -1993,7 +2035,7 @@ packages: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==, tarball: https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz} cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==, tarball: https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz} cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -2015,16 +2057,16 @@ packages: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==, tarball: https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz} csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, tarball: https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz} csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, tarball: https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz} csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==, tarball: https://registry.npmjs.org/csv/-/csv-5.5.3.tgz} engines: {node: '>= 0.1.90'} cypress@13.9.0: @@ -2108,7 +2150,7 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, tarball: https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz} define-data-property@1.1.0: resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==, tarball: https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz} @@ -2150,7 +2192,7 @@ packages: engines: {node: '>=6'} detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, tarball: https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz} engines: {node: '>=8'} detect-libc@1.0.3: @@ -2179,7 +2221,7 @@ packages: engines: {node: '>=8'} dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, tarball: https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, tarball: https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz} @@ -2423,7 +2465,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, tarball: https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz} engines: {node: '>=4'} hasBin: true @@ -2476,10 +2518,10 @@ packages: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, tarball: https://registry.npmjs.org/extend/-/extend-3.0.2.tgz} extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==, tarball: https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz} external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, tarball: https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz} engines: {node: '>=4'} extract-zip@2.0.1: @@ -2494,8 +2536,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} - fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2531,7 +2573,7 @@ packages: engines: {node: '>=10'} find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, tarball: https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz} flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} @@ -2574,11 +2616,11 @@ packages: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz} engines: {node: '>=6 <7 || >=8'} fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz} engines: {node: '>=6 <7 || >=8'} fs-extra@9.1.0: @@ -2720,7 +2762,7 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, tarball: https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz} @@ -2782,7 +2824,7 @@ packages: engines: {node: '>= 0.4'} hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, tarball: https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz} hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} @@ -2809,7 +2851,7 @@ packages: engines: {node: '>= 14'} human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==, tarball: https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz} human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==, tarball: https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz} @@ -2828,7 +2870,7 @@ packages: engines: {node: '>=16.17.0'} iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, tarball: https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz} engines: {node: '>=0.10.0'} iconv-lite@0.6.3: @@ -3027,7 +3069,7 @@ packages: engines: {node: '>= 0.4'} is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==, tarball: https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz} engines: {node: '>=4'} is-symbol@1.0.4: @@ -3059,7 +3101,7 @@ packages: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, tarball: https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz} engines: {node: '>=0.10.0'} is-wsl@2.2.0: @@ -3091,7 +3133,7 @@ packages: resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} jose@4.13.1: - resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} + resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==, tarball: https://registry.npmjs.org/jose/-/jose-4.13.1.tgz} jose@5.3.0: resolution: {integrity: sha512-IChe9AtAE79ru084ow8jzkN2lNrG3Ntfiv65Cvj9uOCE2m5LNsdHG+9EbxWxAoWRF9TgDOqLN5jm08++owDVRg==, tarball: https://registry.npmjs.org/jose/-/jose-5.3.0.tgz} @@ -3110,7 +3152,7 @@ packages: resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==, tarball: https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz} js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz} hasBin: true js-yaml@4.1.0: @@ -3159,7 +3201,7 @@ packages: hasBin: true jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz} jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz} @@ -3177,7 +3219,7 @@ packages: engines: {node: '>=0.10.0'} kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, tarball: https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz} engines: {node: '>=6'} language-subtag-registry@0.3.22: @@ -3198,8 +3240,8 @@ packages: resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} engines: {node: '>=10'} - lilconfig@2.0.6: - resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, tarball: https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz} engines: {node: '>=10'} lines-and-columns@1.2.4: @@ -3233,7 +3275,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, tarball: https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz} engines: {node: '>=6'} local-pkg@0.5.0: @@ -3261,7 +3303,7 @@ packages: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, tarball: https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz} lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -3275,10 +3317,10 @@ packages: engines: {node: '>=10'} long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==, tarball: https://registry.npmjs.org/long/-/long-4.0.0.tgz} long@5.2.1: - resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==, tarball: https://registry.npmjs.org/long/-/long-5.2.1.tgz} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, tarball: https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz} @@ -3292,7 +3334,7 @@ packages: engines: {node: 14 || >=16.14} lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz} @@ -3333,7 +3375,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==, tarball: https://registry.npmjs.org/meow/-/meow-6.1.1.tgz} engines: {node: '>=8'} merge-stream@2.0.0: @@ -3368,7 +3410,7 @@ packages: engines: {node: '>=4'} mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==, tarball: https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz} hasBin: true minimatch@3.1.2: @@ -3402,7 +3444,7 @@ packages: engines: {node: '>= 8'} mixme@0.5.4: - resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} + resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==, tarball: https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz} engines: {node: '>= 8.0.0'} mkdirp@1.0.4: @@ -3464,13 +3506,13 @@ packages: optional: true nice-grpc-common@2.0.2: - resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==, tarball: https://registry.npmjs.org/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz} nice-grpc-web@3.2.3: resolution: {integrity: sha512-oNuCBhCffmpED/dTtbQycKkMkJ6DCaPeyi/W/hbLaGIZfiwSFg+kmWSKmTdI07XqMQ1POKxn//bdldXZsE1ZUg==} nice-grpc@2.0.1: - resolution: {integrity: sha512-Q5CGXO08STsv+HAkXeFgRayANT62X1LnIDhNXdCf+LP0XaP7EiHM0Cr3QefnoFjDZAx/Kxq+qiQfY66BrtKcNQ==} + resolution: {integrity: sha512-Q5CGXO08STsv+HAkXeFgRayANT62X1LnIDhNXdCf+LP0XaP7EiHM0Cr3QefnoFjDZAx/Kxq+qiQfY66BrtKcNQ==, tarball: https://registry.npmjs.org/nice-grpc/-/nice-grpc-2.0.1.tgz} node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} @@ -3502,7 +3544,7 @@ packages: hasBin: true normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, tarball: https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz} normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} @@ -3535,7 +3577,7 @@ packages: engines: {node: '>=0.10.0'} object-hash@1.3.1: - resolution: {integrity: sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==} + resolution: {integrity: sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==, tarball: https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz} engines: {node: '>= 0.10.0'} object-hash@3.0.0: @@ -3606,21 +3648,21 @@ packages: engines: {node: '>= 0.8.0'} os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, tarball: https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz} engines: {node: '>=0.10.0'} ospath@1.2.2: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==, tarball: https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz} outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==, tarball: https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz} p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, tarball: https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz} engines: {node: '>=8'} p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz} engines: {node: '>=6'} p-limit@3.1.0: @@ -3632,7 +3674,7 @@ packages: engines: {node: '>=18'} p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz} engines: {node: '>=8'} p-locate@5.0.0: @@ -3640,7 +3682,7 @@ packages: engines: {node: '>=10'} p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, tarball: https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz} engines: {node: '>=6'} p-map@4.0.0: @@ -3652,7 +3694,7 @@ packages: engines: {node: '>=12'} p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz} engines: {node: '>=6'} parent-module@1.0.1: @@ -3728,7 +3770,7 @@ packages: engines: {node: '>=0.10.0'} pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, tarball: https://registry.npmjs.org/pify/-/pify-4.0.1.tgz} engines: {node: '>=6'} pirates@4.0.5: @@ -3736,7 +3778,7 @@ packages: engines: {node: '>= 6'} pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, tarball: https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz} engines: {node: '>=8'} pkg-types@1.1.1: @@ -3808,7 +3850,7 @@ packages: engines: {node: ^10 || ^12 || >=14} preferred-pm@3.0.3: - resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==, tarball: https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz} engines: {node: '>=10'} prelude-ls@1.2.1: @@ -3851,11 +3893,11 @@ packages: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, tarball: https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz} protobufjs@6.11.3: - resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==} + resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==, tarball: https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz} hasBin: true protobufjs@7.2.3: - resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} + resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==, tarball: https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz} engines: {node: '>=12.0.0'} proxy-from-env@1.0.0: @@ -3867,7 +3909,7 @@ packages: hasBin: true pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, tarball: https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz} psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} @@ -3902,7 +3944,7 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, tarball: https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz} engines: {node: '>=8'} quick-lru@5.1.1: @@ -3945,7 +3987,7 @@ packages: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, tarball: https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz} engines: {node: '>=8'} read-pkg-up@8.0.0: @@ -3953,7 +3995,7 @@ packages: engines: {node: '>=12'} read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, tarball: https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz} engines: {node: '>=8'} read-pkg@6.0.0: @@ -3961,7 +4003,7 @@ packages: engines: {node: '>=12'} read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==, tarball: https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz} engines: {node: '>=6'} readable-stream@3.6.2: @@ -4003,7 +4045,7 @@ packages: engines: {node: '>=0.10.0'} require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, tarball: https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz} requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, tarball: https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz} @@ -4016,12 +4058,8 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==, tarball: https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz} hasBin: true resolve@2.0.0-next.5: @@ -4115,6 +4153,9 @@ packages: engines: {node: '>=10'} hasBin: true + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==, tarball: https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -4131,7 +4172,7 @@ packages: engines: {node: '>= 0.4'} shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, tarball: https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz} engines: {node: '>=0.10.0'} shebang-command@2.0.0: @@ -4139,7 +4180,7 @@ packages: engines: {node: '>=8'} shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, tarball: https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz} engines: {node: '>=0.10.0'} shebang-regex@3.0.0: @@ -4191,7 +4232,7 @@ packages: engines: {node: '>=12'} smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==, tarball: https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz} engines: {node: '>=6'} hasBin: true @@ -4211,7 +4252,7 @@ packages: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==, tarball: https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz} spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} @@ -4229,7 +4270,7 @@ packages: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, tarball: https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz} sshpk@1.17.0: resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==, tarball: https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz} @@ -4255,7 +4296,7 @@ packages: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==, tarball: https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz} streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, tarball: https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz} @@ -4383,7 +4424,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} tailwindcss@3.2.4: - resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} + resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==, tarball: https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz} engines: {node: '>=12.13.0'} hasBin: true peerDependencies: @@ -4398,7 +4439,7 @@ packages: engines: {node: '>=10'} term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, tarball: https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz} engines: {node: '>=8'} text-table@0.2.0: @@ -4435,7 +4476,7 @@ packages: engines: {node: '>=14.0.0'} tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, tarball: https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz} engines: {node: '>=0.6.0'} tmp@0.2.1: @@ -4476,7 +4517,7 @@ packages: hasBin: true trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, tarball: https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz} engines: {node: '>=8'} trim-newlines@4.1.1: @@ -4490,7 +4531,7 @@ packages: typescript: '>=4.2.0' ts-error@1.0.6: - resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==, tarball: https://registry.npmjs.org/ts-error/-/ts-error-1.0.6.tgz} ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -4499,10 +4540,10 @@ packages: resolution: {integrity: sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==} ts-proto-descriptors@1.8.0: - resolution: {integrity: sha512-iV20plcI8+GRkeZIAygxOOH0p2xpOsKfw9kI1W20NCwawi1/4bG/YRd9rQY9XSJP+lD9j7XbSy3tFFuikfsljw==} + resolution: {integrity: sha512-iV20plcI8+GRkeZIAygxOOH0p2xpOsKfw9kI1W20NCwawi1/4bG/YRd9rQY9XSJP+lD9j7XbSy3tFFuikfsljw==, tarball: https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.8.0.tgz} ts-proto@1.146.0: - resolution: {integrity: sha512-OyBZRjmqqw+aatLEUbRooWO6VKTtOLJQyaQFMciigEZPNgTsWtApqHpQDtqDMQFWEXhIARqEV+B7ZJx8cljhZA==} + resolution: {integrity: sha512-OyBZRjmqqw+aatLEUbRooWO6VKTtOLJQyaQFMciigEZPNgTsWtApqHpQDtqDMQFWEXhIARqEV+B7ZJx8cljhZA==, tarball: https://registry.npmjs.org/ts-proto/-/ts-proto-1.146.0.tgz} hasBin: true tsconfck@3.0.3: @@ -4541,7 +4582,7 @@ packages: optional: true tty-table@4.1.6: - resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} + resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==, tarball: https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz} engines: {node: '>=8.0.0'} hasBin: true @@ -4594,7 +4635,7 @@ packages: engines: {node: '>=4'} type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz} engines: {node: '>=10'} type-fest@0.20.2: @@ -4606,11 +4647,11 @@ packages: engines: {node: '>=10'} type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz} engines: {node: '>=8'} type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz} engines: {node: '>=8'} type-fest@1.4.0: @@ -4662,12 +4703,15 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==, tarball: https://registry.npmjs.org/undici/-/undici-5.28.4.tgz} engines: {node: '>=14.0'} universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, tarball: https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz} engines: {node: '>= 4.0.0'} universalify@0.2.0: @@ -4795,7 +4839,7 @@ packages: hasBin: true wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, tarball: https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, tarball: https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz} @@ -4836,10 +4880,10 @@ packages: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==, tarball: https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz} which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==, tarball: https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz} which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, tarball: https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz} engines: {node: '>=8.15'} which-typed-array@1.1.11: @@ -4851,7 +4895,7 @@ packages: engines: {node: '>= 0.4'} which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, tarball: https://registry.npmjs.org/which/-/which-1.3.1.tgz} hasBin: true which@2.0.2: @@ -4910,14 +4954,14 @@ packages: engines: {node: '>=0.4'} y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, tarball: https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, tarball: https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz} yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz} @@ -4934,7 +4978,7 @@ packages: engines: {node: '>= 14'} yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, tarball: https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz} engines: {node: '>=6'} yargs-parser@20.2.9: @@ -4946,7 +4990,7 @@ packages: engines: {node: '>=12'} yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, tarball: https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz} engines: {node: '>=8'} yargs@16.2.0: @@ -5203,13 +5247,14 @@ snapshots: '@bufbuild/protobuf@1.9.0': {} - '@changesets/apply-release-plan@6.1.2': + '@changesets/apply-release-plan@7.0.3': dependencies: '@babel/runtime': 7.22.3 - '@changesets/config': 2.2.0 - '@changesets/get-version-range-type': 0.3.2 - '@changesets/git': 1.5.0 - '@changesets/types': 5.2.0 + '@changesets/config': 3.0.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.0 + '@changesets/should-skip-package': 0.1.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -5217,136 +5262,144 @@ snapshots: outdent: 0.5.0 prettier: 2.8.0 resolve-from: 5.0.0 - semver: 5.7.1 + semver: 7.6.2 - '@changesets/assemble-release-plan@5.2.2': + '@changesets/assemble-release-plan@6.0.2': dependencies: '@babel/runtime': 7.22.3 - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.4 - '@changesets/types': 5.2.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.0 + '@changesets/should-skip-package': 0.1.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - semver: 5.7.1 + semver: 7.6.2 - '@changesets/changelog-git@0.1.13': + '@changesets/changelog-git@0.2.0': dependencies: - '@changesets/types': 5.2.0 + '@changesets/types': 6.0.0 - '@changesets/cli@2.25.2': + '@changesets/cli@2.27.5': dependencies: - '@babel/runtime': 7.20.1 - '@changesets/apply-release-plan': 6.1.2 - '@changesets/assemble-release-plan': 5.2.2 - '@changesets/changelog-git': 0.1.13 - '@changesets/config': 2.2.0 - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.4 - '@changesets/get-release-plan': 3.0.15 - '@changesets/git': 1.5.0 - '@changesets/logger': 0.0.5 - '@changesets/pre': 1.0.13 - '@changesets/read': 0.5.8 - '@changesets/types': 5.2.0 - '@changesets/write': 0.2.2 + '@babel/runtime': 7.22.3 + '@changesets/apply-release-plan': 7.0.3 + '@changesets/assemble-release-plan': 6.0.2 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.0 + '@changesets/get-release-plan': 4.0.2 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/should-skip-package': 0.1.0 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.1 '@manypkg/get-packages': 1.1.3 - '@types/is-ci': 3.0.0 - '@types/semver': 6.2.3 + '@types/semver': 7.5.8 ansi-colors: 4.1.3 chalk: 2.4.2 + ci-info: 3.9.0 enquirer: 2.3.6 external-editor: 3.1.0 fs-extra: 7.0.1 human-id: 1.0.2 - is-ci: 3.0.1 meow: 6.1.1 outdent: 0.5.0 p-limit: 2.3.0 preferred-pm: 3.0.3 resolve-from: 5.0.0 - semver: 5.7.1 + semver: 7.6.2 spawndamnit: 2.0.0 term-size: 2.2.1 tty-table: 4.1.6 - '@changesets/config@2.2.0': + '@changesets/config@3.0.1': dependencies: - '@changesets/errors': 0.1.4 - '@changesets/get-dependents-graph': 1.3.4 - '@changesets/logger': 0.0.5 - '@changesets/types': 5.2.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.0 + '@changesets/logger': 0.1.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.5 - '@changesets/errors@0.1.4': + '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@1.3.4': + '@changesets/get-dependents-graph@2.1.0': dependencies: - '@changesets/types': 5.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 - semver: 5.7.1 + semver: 7.6.2 - '@changesets/get-release-plan@3.0.15': + '@changesets/get-release-plan@4.0.2': dependencies: '@babel/runtime': 7.22.3 - '@changesets/assemble-release-plan': 5.2.2 - '@changesets/config': 2.2.0 - '@changesets/pre': 1.0.13 - '@changesets/read': 0.5.8 - '@changesets/types': 5.2.0 + '@changesets/assemble-release-plan': 6.0.2 + '@changesets/config': 3.0.1 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - '@changesets/get-version-range-type@0.3.2': {} + '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@1.5.0': + '@changesets/git@3.0.0': dependencies: '@babel/runtime': 7.22.3 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.0 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 + micromatch: 4.0.5 spawndamnit: 2.0.0 - '@changesets/logger@0.0.5': + '@changesets/logger@0.1.0': dependencies: chalk: 2.4.2 - '@changesets/parse@0.3.15': + '@changesets/parse@0.4.0': dependencies: - '@changesets/types': 5.2.0 + '@changesets/types': 6.0.0 js-yaml: 3.14.1 - '@changesets/pre@1.0.13': + '@changesets/pre@2.0.0': dependencies: '@babel/runtime': 7.22.3 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.0 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.5.8': + '@changesets/read@0.6.0': dependencies: '@babel/runtime': 7.22.3 - '@changesets/git': 1.5.0 - '@changesets/logger': 0.0.5 - '@changesets/parse': 0.3.15 - '@changesets/types': 5.2.0 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 + '@changesets/should-skip-package@0.1.0': + dependencies: + '@babel/runtime': 7.22.3 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + '@changesets/types@4.1.0': {} - '@changesets/types@5.2.0': {} + '@changesets/types@6.0.0': {} - '@changesets/write@0.2.2': + '@changesets/write@0.3.1': dependencies: '@babel/runtime': 7.22.3 - '@changesets/types': 5.2.0 + '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.0 @@ -5360,6 +5413,11 @@ snapshots: '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.9.0) undici: 5.28.4 + '@connectrpc/connect-web@1.4.0(@bufbuild/protobuf@1.9.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0))': + dependencies: + '@bufbuild/protobuf': 1.9.0 + '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.9.0) + '@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0)': dependencies: '@bufbuild/protobuf': 1.9.0 @@ -5558,7 +5616,7 @@ snapshots: '@grpc/grpc-js@1.8.13': dependencies: '@grpc/proto-loader': 0.7.6 - '@types/node': 18.11.9 + '@types/node': 20.14.2 '@grpc/proto-loader@0.7.6': dependencies: @@ -5574,13 +5632,14 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@headlessui/react@1.7.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: + '@tanstack/react-virtual': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) client-only: 0.0.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@heroicons/react@2.0.13(react@18.3.1)': + '@heroicons/react@2.1.3(react@18.3.1)': dependencies: react: 18.3.1 @@ -5821,15 +5880,23 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.4.1 - '@tailwindcss/forms@0.5.3(tailwindcss@3.2.4(postcss@8.4.21))': + '@tailwindcss/forms@0.5.3(tailwindcss@3.2.4(postcss@8.4.38))': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.2.4(postcss@8.4.38) + + '@tailwindcss/forms@0.5.7(tailwindcss@3.2.4(postcss@8.4.21))': dependencies: mini-svg-data-uri: 1.4.4 tailwindcss: 3.2.4(postcss@8.4.21) - '@tailwindcss/forms@0.5.3(tailwindcss@3.2.4(postcss@8.4.38))': + '@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - mini-svg-data-uri: 1.4.4 - tailwindcss: 3.2.4(postcss@8.4.38) + '@tanstack/virtual-core': 3.5.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/virtual-core@3.5.0': {} '@testing-library/dom@10.1.0': dependencies: @@ -5866,13 +5933,26 @@ snapshots: optionalDependencies: vitest: 1.6.0(@types/node@18.11.9)(jsdom@24.0.0)(sass@1.77.1) - '@testing-library/react@14.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': + '@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.14.2)(jsdom@24.0.0)(sass@1.77.1))': + dependencies: + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.22.3 + aria-query: 5.1.3 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + optionalDependencies: + vitest: 1.6.0(@types/node@20.14.2)(jsdom@24.0.0)(sass@1.77.1) + + '@testing-library/react@14.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.20.1 '@testing-library/dom': 9.3.0 '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.3.1(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) '@testing-library/react@15.0.7(@types/react@18.2.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -5909,10 +5989,6 @@ snapshots: '@types/estree@1.0.5': {} - '@types/is-ci@3.0.0': - dependencies: - ci-info: 3.6.2 - '@types/json5@0.0.29': {} '@types/long@4.0.2': {} @@ -5925,6 +6001,10 @@ snapshots: '@types/node@18.11.9': {} + '@types/node@20.14.2': + dependencies: + undici-types: 5.26.5 + '@types/normalize-package-data@2.4.1': {} '@types/object-hash@1.3.4': {} @@ -5959,7 +6039,7 @@ snapshots: '@types/scheduler@0.16.2': {} - '@types/semver@6.2.3': {} + '@types/semver@7.5.8': {} '@types/sinonjs__fake-timers@8.1.1': {} @@ -5971,7 +6051,7 @@ snapshots: '@types/yauzl@2.10.0': dependencies: - '@types/node': 18.11.9 + '@types/node': 20.14.2 optional: true '@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5)': @@ -6016,20 +6096,23 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vercel/analytics@1.0.0(react@18.3.1)': + '@vercel/analytics@1.3.1(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.1))(react@18.3.1)': dependencies: + server-only: 0.0.1 + optionalDependencies: + next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.1) react: 18.3.1 '@vercel/git-hooks@1.0.0': {} - '@vitejs/plugin-react@4.2.1(vite@5.2.11(@types/node@18.11.9)(sass@1.77.1))': + '@vitejs/plugin-react@4.2.1(vite@5.2.11(@types/node@20.14.2)(sass@1.77.1))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.11(@types/node@18.11.9)(sass@1.77.1) + vite: 5.2.11(@types/node@20.14.2)(sass@1.77.1) transitivePeerDependencies: - supports-color @@ -6469,6 +6552,8 @@ snapshots: ci-info@3.6.2: {} + ci-info@3.9.0: {} + clean-stack@2.2.0: {} clean-stack@4.2.0: @@ -7393,7 +7478,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.2.12: + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -7635,7 +7720,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.2 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -7643,7 +7728,7 @@ snapshots: globby@13.1.3: dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.2 ignore: 5.2.0 merge2: 1.4.1 slash: 4.0.0 @@ -8106,7 +8191,7 @@ snapshots: lilconfig@2.0.5: {} - lilconfig@2.0.6: {} + lilconfig@2.1.0: {} lines-and-columns@1.2.4: {} @@ -8730,21 +8815,21 @@ snapshots: postcss-load-config@3.1.4(postcss@8.4.21): dependencies: - lilconfig: 2.0.6 + lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.21 postcss-load-config@3.1.4(postcss@8.4.38): dependencies: - lilconfig: 2.0.6 + lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.38 postcss-load-config@4.0.1(postcss@8.4.38): dependencies: - lilconfig: 2.0.6 + lilconfig: 2.1.0 yaml: 2.2.1 optionalDependencies: postcss: 8.4.38 @@ -8836,7 +8921,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 - '@types/node': 18.11.9 + '@types/node': 20.14.2 long: 4.0.0 protobufjs@7.2.3: @@ -9018,12 +9103,6 @@ snapshots: resolve-from@5.0.0: {} - resolve@1.22.1: - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.6: dependencies: is-core-module: 2.13.0 @@ -9141,6 +9220,8 @@ snapshots: semver@7.6.2: {} + server-only@0.0.1: {} + set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -9465,14 +9546,14 @@ snapshots: detective: 5.2.1 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - lilconfig: 2.0.6 + lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.21 postcss-import: 14.1.0(postcss@8.4.21) postcss-js: 4.0.1(postcss@8.4.21) @@ -9481,7 +9562,7 @@ snapshots: postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 - resolve: 1.22.1 + resolve: 1.22.6 transitivePeerDependencies: - ts-node @@ -9493,14 +9574,14 @@ snapshots: detective: 5.2.1 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - lilconfig: 2.0.6 + lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 postcss: 8.4.38 postcss-import: 14.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) @@ -9509,7 +9590,7 @@ snapshots: postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 - resolve: 1.22.1 + resolve: 1.22.6 transitivePeerDependencies: - ts-node @@ -9792,6 +9873,8 @@ snapshots: undefsafe@2.0.5: {} + undici-types@5.26.5: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -9860,14 +9943,32 @@ snapshots: - sugarss - supports-color - terser + optional: true - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@18.11.9)(sass@1.77.1)): + vite-node@1.6.0(@types/node@20.14.2)(sass@1.77.1): + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@8.1.1) + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.2.11(@types/node@20.14.2)(sass@1.77.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.14.2)(sass@1.77.1)): dependencies: debug: 4.3.4(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.11(@types/node@18.11.9)(sass@1.77.1) + vite: 5.2.11(@types/node@20.14.2)(sass@1.77.1) transitivePeerDependencies: - supports-color - typescript @@ -9881,6 +9982,17 @@ snapshots: '@types/node': 18.11.9 fsevents: 2.3.3 sass: 1.77.1 + optional: true + + vite@5.2.11(@types/node@20.14.2)(sass@1.77.1): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + '@types/node': 20.14.2 + fsevents: 2.3.3 + sass: 1.77.1 vitest@1.6.0(@types/node@18.11.9)(jsdom@24.0.0)(sass@1.77.1): dependencies: @@ -9915,6 +10027,41 @@ snapshots: - sugarss - supports-color - terser + optional: true + + vitest@1.6.0(@types/node@20.14.2)(jsdom@24.0.0)(sass@1.77.1): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4(supports-color@8.1.1) + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.11(@types/node@20.14.2)(sass@1.77.1) + vite-node: 1.6.0(@types/node@20.14.2)(sass@1.77.1) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.14.2 + jsdom: 24.0.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser w3c-xmlserializer@5.0.0: dependencies: