throw out @zitadel/react @zitadel/next

This commit is contained in:
peintnermax
2024-09-04 15:47:29 +02:00
parent 3fef934a4a
commit 6204cdaaae
63 changed files with 191 additions and 744 deletions

View File

@@ -84,10 +84,9 @@ The application is now available at `http://localhost:3000`
You can execute the following commands `pnpm test` for a single test run or `pnpm test:watch` in the following directories: You can execute the following commands `pnpm test` for a single test run or `pnpm test:watch` in the following directories:
- apps/login - apps/login
- packages/zitadel-proto
- packages/zitadel-client - packages/zitadel-client
- packages/zitadel-server - packages/zitadel-node
- packages/zitadel-react
- packages/zitadel-next
- The projects root directory: all tests in the project are executed - The projects root directory: all tests in the project are executed
In apps/login, these commands also spin up the application and a ZITADEL gRPC API mock server to run integration tests using [Cypress](https://www.cypress.io/) against them. In apps/login, these commands also spin up the application and a ZITADEL gRPC API mock server to run integration tests using [Cypress](https://www.cypress.io/) against them.

View File

@@ -31,8 +31,6 @@ We think the easiest path of getting up and running, is the following:
- `@zitadel/node`: core components for establishing node client connection, grpc stub - `@zitadel/node`: core components for establishing node client connection, grpc stub
- `@zitadel/client`: shared client utilities - `@zitadel/client`: shared client utilities
- `@zitadel/proto`: shared protobuf types - `@zitadel/proto`: shared protobuf types
- `@zitadel/react`: shared React utilities and components built with tailwindcss
- `@zitadel/next`: shared Next.js utilities
- `@zitadel/tsconfig`: shared `tsconfig.json`s used throughout the monorepo - `@zitadel/tsconfig`: shared `tsconfig.json`s used throughout the monorepo
- `eslint-config-zitadel`: ESLint preset - `eslint-config-zitadel`: ESLint preset

View File

@@ -37,10 +37,8 @@
"@tailwindcss/forms": "0.5.7", "@tailwindcss/forms": "0.5.7",
"@vercel/analytics": "^1.2.2", "@vercel/analytics": "^1.2.2",
"@zitadel/client": "workspace:*", "@zitadel/client": "workspace:*",
"@zitadel/next": "workspace:*",
"@zitadel/node": "workspace:*", "@zitadel/node": "workspace:*",
"@zitadel/proto": "workspace:*", "@zitadel/proto": "workspace:*",
"@zitadel/react": "workspace:*",
"clsx": "1.2.1", "clsx": "1.2.1",
"copy-to-clipboard": "^3.3.3", "copy-to-clipboard": "^3.3.3",
"moment": "^2.29.4", "moment": "^2.29.4",
@@ -57,7 +55,7 @@
"devDependencies": { "devDependencies": {
"@bufbuild/buf": "^1.36.0", "@bufbuild/buf": "^1.36.0",
"@testing-library/jest-dom": "^6.4.5", "@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^16.0.0", "@testing-library/react": "^16.0.1",
"@types/ms": "0.7.34", "@types/ms": "0.7.34",
"@types/node": "22.1.0", "@types/node": "22.1.0",
"@types/react": "18.3.3", "@types/react": "18.3.3",
@@ -65,7 +63,7 @@
"@types/tinycolor2": "1.4.3", "@types/tinycolor2": "1.4.3",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"@vercel/git-hooks": "1.0.0", "@vercel/git-hooks": "1.0.0",
"@zitadel/prettier-config": "workspace:*", "@zitadel/prettier-config": "workspace:^",
"@zitadel/tsconfig": "workspace:*", "@zitadel/tsconfig": "workspace:*",
"autoprefixer": "10.4.20", "autoprefixer": "10.4.20",
"concurrently": "^8.1.0", "concurrently": "^8.1.0",

View File

@@ -1,9 +1,9 @@
import { getBrandingSettings, listSessions } from "@/lib/zitadel"; import { getBrandingSettings, listSessions } from "@/lib/zitadel";
import { getAllSessionCookieIds } from "@zitadel/next";
import { UserPlusIcon } from "@heroicons/react/24/outline"; import { UserPlusIcon } from "@heroicons/react/24/outline";
import Link from "next/link"; import Link from "next/link";
import SessionsList from "@/ui/SessionsList"; import SessionsList from "@/ui/SessionsList";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import { getAllSessionCookieIds } from "@/lib/cookies";
async function loadSessions() { async function loadSessions() {
const ids = await getAllSessionCookieIds(); const ids = await getAllSessionCookieIds();

View File

@@ -1,3 +1,5 @@
import { getSessionCookieById } from "@/lib/cookies";
import { loadMostRecentSession } from "@/lib/session";
import { import {
getBrandingSettings, getBrandingSettings,
getSession, getSession,
@@ -9,7 +11,6 @@ import BackButton from "@/ui/BackButton";
import ChooseSecondFactor from "@/ui/ChooseSecondFactor"; import ChooseSecondFactor from "@/ui/ChooseSecondFactor";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { getSessionCookieById, loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -1,3 +1,5 @@
import { getSessionCookieById } from "@/lib/cookies";
import { loadMostRecentSession } from "@/lib/session";
import { import {
getBrandingSettings, getBrandingSettings,
getLoginSettings, getLoginSettings,
@@ -11,7 +13,6 @@ import BackButton from "@/ui/BackButton";
import ChooseSecondFactorToSetup from "@/ui/ChooseSecondFactorToSetup"; import ChooseSecondFactorToSetup from "@/ui/ChooseSecondFactorToSetup";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { getSessionCookieById, loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -1,9 +1,9 @@
import { loadMostRecentSession } from "@/lib/session";
import { getBrandingSettings, sessionService } from "@/lib/zitadel"; import { getBrandingSettings, sessionService } from "@/lib/zitadel";
import Alert from "@/ui/Alert"; import Alert from "@/ui/Alert";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import LoginOTP from "@/ui/LoginOTP"; import LoginOTP from "@/ui/LoginOTP";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -13,7 +13,7 @@ import TOTPRegister from "@/ui/TOTPRegister";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import Link from "next/link"; import Link from "next/link";
import { RegisterTOTPResponse } from "@zitadel/proto/zitadel/user/v2/user_service_pb"; import { RegisterTOTPResponse } from "@zitadel/proto/zitadel/user/v2/user_service_pb";
import { loadMostRecentSession } from "@zitadel/next"; import { loadMostRecentSession } from "@/lib/session";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -1,9 +1,9 @@
import { loadMostRecentSession } from "@/lib/session";
import { getBrandingSettings, sessionService } from "@/lib/zitadel"; import { getBrandingSettings, sessionService } from "@/lib/zitadel";
import Alert, { AlertType } from "@/ui/Alert"; import Alert, { AlertType } from "@/ui/Alert";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import RegisterPasskey from "@/ui/RegisterPasskey"; import RegisterPasskey from "@/ui/RegisterPasskey";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -1,9 +1,10 @@
import { getSessionCookieById } from "@/lib/cookies";
import { loadMostRecentSession } from "@/lib/session";
import { getBrandingSettings, getSession, sessionService } from "@/lib/zitadel"; import { getBrandingSettings, getSession, sessionService } from "@/lib/zitadel";
import Alert from "@/ui/Alert"; import Alert from "@/ui/Alert";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import LoginPasskey from "@/ui/LoginPasskey"; import LoginPasskey from "@/ui/LoginPasskey";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { getSessionCookieById, loadMostRecentSession } from "@zitadel/next";
const title = "Authenticate with a passkey"; const title = "Authenticate with a passkey";
const description = const description =

View File

@@ -1,3 +1,4 @@
import { loadMostRecentSession } from "@/lib/session";
import { import {
getBrandingSettings, getBrandingSettings,
getLoginSettings, getLoginSettings,
@@ -7,7 +8,6 @@ import Alert from "@/ui/Alert";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import PasswordForm from "@/ui/PasswordForm"; import PasswordForm from "@/ui/PasswordForm";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -2,12 +2,12 @@ import { createCallback, getBrandingSettings, getSession } from "@/lib/zitadel";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import { getMostRecentCookieWithLoginname } from "@zitadel/next";
import { redirect } from "next/navigation"; import { redirect } from "next/navigation";
import { import {
CreateCallbackRequestSchema, CreateCallbackRequestSchema,
SessionSchema, SessionSchema,
} from "@zitadel/proto/zitadel/oidc/v2/oidc_service_pb"; } from "@zitadel/proto/zitadel/oidc/v2/oidc_service_pb";
import { getMostRecentCookieWithLoginname } from "@/lib/cookies";
async function loadSession(loginName: string, authRequestId?: string) { async function loadSession(loginName: string, authRequestId?: string) {
const recent = await getMostRecentCookieWithLoginname({ loginName }); const recent = await getMostRecentCookieWithLoginname({ loginName });

View File

@@ -1,9 +1,10 @@
import { getSessionCookieById } from "@/lib/cookies";
import { loadMostRecentSession } from "@/lib/session";
import { getBrandingSettings, getSession, sessionService } from "@/lib/zitadel"; import { getBrandingSettings, getSession, sessionService } from "@/lib/zitadel";
import Alert from "@/ui/Alert"; import Alert from "@/ui/Alert";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import LoginPasskey from "@/ui/LoginPasskey"; import LoginPasskey from "@/ui/LoginPasskey";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { getSessionCookieById, loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -1,9 +1,9 @@
import { loadMostRecentSession } from "@/lib/session";
import { getBrandingSettings, sessionService } from "@/lib/zitadel"; import { getBrandingSettings, sessionService } from "@/lib/zitadel";
import Alert from "@/ui/Alert"; import Alert from "@/ui/Alert";
import DynamicTheme from "@/ui/DynamicTheme"; import DynamicTheme from "@/ui/DynamicTheme";
import RegisterU2F from "@/ui/RegisterU2F"; import RegisterU2F from "@/ui/RegisterU2F";
import UserAvatar from "@/ui/UserAvatar"; import UserAvatar from "@/ui/UserAvatar";
import { loadMostRecentSession } from "@zitadel/next";
export default async function Page({ export default async function Page({
searchParams, searchParams,

View File

@@ -15,7 +15,6 @@ import {
listSessions, listSessions,
startIdentityProviderFlow, startIdentityProviderFlow,
} from "@/lib/zitadel"; } from "@/lib/zitadel";
import { getAllSessions } from "@zitadel/next";
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb";
import { import {
@@ -25,6 +24,7 @@ import {
import { IdentityProviderType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { IdentityProviderType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb";
import { idpTypeToSlug } from "@/lib/idp"; import { idpTypeToSlug } from "@/lib/idp";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import { getAllSessions } from "@/lib/cookies";
async function loadSessions(ids: string[]): Promise<Session[]> { async function loadSessions(ids: string[]): Promise<Session[]> {
const response = await listSessions( const response = await listSessions(

View File

@@ -1,5 +1,5 @@
import { getAllSessions } from "@/lib/cookies";
import { listSessions } from "@/lib/zitadel"; import { listSessions } from "@/lib/zitadel";
import { getAllSessions } from "@zitadel/next";
import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb";
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";

View File

@@ -1,6 +1,6 @@
"use server"; "use server";
import { loadMostRecentSession } from "@zitadel/next"; import { loadMostRecentSession } from "./session";
import { sessionService, verifyTOTPRegistration } from "./zitadel"; import { sessionService, verifyTOTPRegistration } from "./zitadel";
export async function verifyTOTP( export async function verifyTOTP(

View File

@@ -1,18 +1,17 @@
"use server"; "use server";
import {
getMostRecentSessionCookie,
getSessionCookieById,
getSessionCookieByLoginName,
} from "@zitadel/next";
import { setSessionAndUpdateCookie } from "@/utils/session"; import { setSessionAndUpdateCookie } from "@/utils/session";
import { NextRequest, NextResponse } from "next/server";
import { import {
CheckOTPSchema, CheckOTPSchema,
ChecksSchema, ChecksSchema,
CheckTOTPSchema, CheckTOTPSchema,
} from "@zitadel/proto/zitadel/session/v2/session_service_pb"; } from "@zitadel/proto/zitadel/session/v2/session_service_pb";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import {
getMostRecentSessionCookie,
getSessionCookieById,
getSessionCookieByLoginName,
} from "../cookies";
export type SetOTPCommand = { export type SetOTPCommand = {
loginName?: string; loginName?: string;

View File

@@ -6,12 +6,12 @@ import {
registerPasskey, registerPasskey,
verifyPasskeyRegistration, verifyPasskeyRegistration,
} from "@/lib/zitadel"; } from "@/lib/zitadel";
import { getSessionCookieById } from "@zitadel/next";
import { userAgent } from "next/server"; import { userAgent } from "next/server";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import { VerifyPasskeyRegistrationRequestSchema } from "@zitadel/proto/zitadel/user/v2/user_service_pb"; import { VerifyPasskeyRegistrationRequestSchema } from "@zitadel/proto/zitadel/user/v2/user_service_pb";
import { headers } from "next/headers"; import { headers } from "next/headers";
import { RegisterPasskeyResponse } from "@zitadel/proto/zitadel/user/v2/user_service_pb"; import { RegisterPasskeyResponse } from "@zitadel/proto/zitadel/user/v2/user_service_pb";
import { getSessionCookieById } from "../cookies";
type VerifyPasskeyCommand = { type VerifyPasskeyCommand = {
passkeyId: string; passkeyId: string;

View File

@@ -6,12 +6,6 @@ import {
getUserByID, getUserByID,
listAuthenticationMethodTypes, listAuthenticationMethodTypes,
} from "@/lib/zitadel"; } from "@/lib/zitadel";
import {
getMostRecentSessionCookie,
getSessionCookieById,
getSessionCookieByLoginName,
removeSessionFromCookie,
} from "@zitadel/next";
import { import {
createSessionAndUpdateCookie, createSessionAndUpdateCookie,
createSessionForIdpAndUpdateCookie, createSessionForIdpAndUpdateCookie,
@@ -24,6 +18,12 @@ import {
RequestChallengesSchema, RequestChallengesSchema,
} from "@zitadel/proto/zitadel/session/v2/challenge_pb"; } from "@zitadel/proto/zitadel/session/v2/challenge_pb";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import {
getMostRecentSessionCookie,
getSessionCookieById,
getSessionCookieByLoginName,
removeSessionFromCookie,
} from "../cookies";
type CreateNewSessionCommand = { type CreateNewSessionCommand = {
userId: string; userId: string;

View File

@@ -1,11 +1,11 @@
"use server"; "use server";
import { getSession, registerU2F, verifyU2FRegistration } from "@/lib/zitadel"; import { getSession, registerU2F, verifyU2FRegistration } from "@/lib/zitadel";
import { getSessionCookieById } from "@zitadel/next";
import { userAgent } from "next/server"; import { userAgent } from "next/server";
import { VerifyU2FRegistrationRequestSchema } from "@zitadel/proto/zitadel/user/v2/user_service_pb"; import { VerifyU2FRegistrationRequestSchema } from "@zitadel/proto/zitadel/user/v2/user_service_pb";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import { headers } from "next/headers"; import { headers } from "next/headers";
import { getSessionCookieById } from "../cookies";
type RegisterU2FCommand = { type RegisterU2FCommand = {
sessionId: string; sessionId: string;

View File

@@ -1,5 +1,4 @@
// include styles from the ui package // include styles from the ui package
@import "@zitadel/react/styles.css";
@import "./vars.scss"; @import "./vars.scss";
@tailwind base; @tailwind base;

View File

@@ -3,7 +3,6 @@
import React from "react"; import React from "react";
import { Logo } from "@/ui/Logo"; import { Logo } from "@/ui/Logo";
import ThemeWrapper from "./ThemeWrapper"; import ThemeWrapper from "./ThemeWrapper";
import { LayoutProviders } from "./LayoutProviders";
import { BrandingSettings } from "@zitadel/proto/zitadel/settings/v2/branding_settings_pb"; import { BrandingSettings } from "@zitadel/proto/zitadel/settings/v2/branding_settings_pb";
export default function DynamicTheme({ export default function DynamicTheme({
@@ -15,29 +14,25 @@ export default function DynamicTheme({
}) { }) {
return ( return (
<ThemeWrapper branding={branding}> <ThemeWrapper branding={branding}>
{/* <ThemeProvider> */} <div className="rounded-lg bg-vc-border-gradient dark:bg-dark-vc-border-gradient p-px shadow-lg shadow-black/5 dark:shadow-black/20 mb-10">
<LayoutProviders> <div className="rounded-lg bg-background-light-400 dark:bg-background-dark-500 px-8 py-12">
<div className="rounded-lg bg-vc-border-gradient dark:bg-dark-vc-border-gradient p-px shadow-lg shadow-black/5 dark:shadow-black/20 mb-10"> <div className="mx-auto flex flex-col items-center space-y-4">
<div className="rounded-lg bg-background-light-400 dark:bg-background-dark-500 px-8 py-12"> <div className="relative">
<div className="mx-auto flex flex-col items-center space-y-4"> {branding && (
<div className="relative"> <Logo
{branding && ( lightSrc={branding.lightTheme?.logoUrl}
<Logo darkSrc={branding.darkTheme?.logoUrl}
lightSrc={branding.lightTheme?.logoUrl} height={150}
darkSrc={branding.darkTheme?.logoUrl} width={150}
height={150} />
width={150} )}
/>
)}
</div>
<div className="w-full">{children}</div>
<div className="flex flex-row justify-between"></div>
</div> </div>
<div className="w-full">{children}</div>
<div className="flex flex-row justify-between"></div>
</div> </div>
</div> </div>
</LayoutProviders> </div>
{/* </ThemeProvider> */}
</ThemeWrapper> </ThemeWrapper>
); );
} }

View File

@@ -1,6 +1,5 @@
"use client"; "use client";
import { ZitadelReactProvider } from "@zitadel/react";
import { useTheme } from "next-themes"; import { useTheme } from "next-themes";
type Props = { type Props = {
@@ -12,8 +11,6 @@ export function LayoutProviders({ children }: Props) {
const isDark = resolvedTheme === "dark"; const isDark = resolvedTheme === "dark";
return ( return (
<div className={`${isDark ? "ui-dark" : "ui-light"} `}> <div className={`${isDark ? "ui-dark" : "ui-light"} `}>{children}</div>
<ZitadelReactProvider dark={isDark}>{children}</ZitadelReactProvider>
</div>
); );
} }

View File

@@ -1,18 +1,16 @@
"use client"; "use client";
import { ReactNode, useState } from "react"; import { ReactNode, useState } from "react";
import {
SignInWithGitlab,
SignInWithAzureAD,
SignInWithGoogle,
SignInWithGithub,
} from "@zitadel/react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import Alert from "./Alert"; import Alert from "./Alert";
import { IdentityProvider } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { IdentityProvider } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb";
import { idpTypeToSlug } from "@/lib/idp"; import { idpTypeToSlug } from "@/lib/idp";
import { IdentityProviderType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { IdentityProviderType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb";
import { startIDPFlow } from "@/lib/server/idp"; import { startIDPFlow } from "@/lib/server/idp";
import { SignInWithGithub } from "./idps/SignInWithGithub";
import { SignInWithAzureAD } from "./idps/SignInWithAzureAD";
import { SignInWithGoogle } from "./idps/SignInWithGoogle";
import { SignInWithGitlab } from "./idps/SignInWithGitlab";
export interface SignInWithIDPProps { export interface SignInWithIDPProps {
children?: ReactNode; children?: ReactNode;

View File

@@ -0,0 +1,40 @@
"use client";
import { ReactNode, forwardRef } from "react";
import { IdpButtonClasses, SignInWithIdentityProviderProps } from "./classes";
export const SignInWithAzureAD = forwardRef<
HTMLButtonElement,
SignInWithIdentityProviderProps
>(
({ children, className = "", name = "", ...props }, ref): ReactNode => (
<button
type="button"
ref={ref}
className={`${IdpButtonClasses} ${className}`}
{...props}
>
<div className="h-12 p-[10px] w-12 flex items-center justify-center">
<svg
xmlns="http://www.w3.org/2000/svg"
width="21"
height="21"
viewBox="0 0 21 21"
className="w-full h-full"
>
<path fill="#f25022" d="M1 1H10V10H1z"></path>
<path fill="#00a4ef" d="M1 11H10V20H1z"></path>
<path fill="#7fba00" d="M11 1H20V10H11z"></path>
<path fill="#ffb900" d="M11 11H20V20H11z"></path>
</svg>
</div>
{children ? (
children
) : (
<span className="ml-4">{name ? name : "Sign in with AzureAD"}</span>
)}
</button>
),
);
SignInWithAzureAD.displayName = "SignInWithAzureAD";

View File

@@ -1,20 +1,27 @@
"use client"; "use client";
import { ReactNode, forwardRef } from "react"; import { ReactNode, forwardRef } from "react";
import { SignInWithIdentityProviderProps } from "./SignInWith"; import { IdpButtonClasses, SignInWithIdentityProviderProps } from "./classes";
import { IdpButtonClasses } from "./classes";
export const SignInWithGithub = forwardRef<HTMLButtonElement, SignInWithIdentityProviderProps>( export const SignInWithGithub = forwardRef<
HTMLButtonElement,
SignInWithIdentityProviderProps
>(
({ children, className = "", name = "", ...props }, ref): ReactNode => ( ({ children, className = "", name = "", ...props }, ref): ReactNode => (
<button type="button" ref={ref} className={`${IdpButtonClasses} ${className}`} {...props}> <button
<div className="ztdl-h-8 ztdl-w-8 ztdl-mx-2 flex items-center justify-center"> type="button"
ref={ref}
className={`${IdpButtonClasses} ${className}`}
{...props}
>
<div className="h-8 w-8 mx-2 flex items-center justify-center">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="1024" width="1024"
height="1024" height="1024"
fill="none" fill="none"
viewBox="0 0 1024 1024" viewBox="0 0 1024 1024"
className="hidden dark:ztdl-block" className="hidden dark:block"
> >
<path <path
fill="#fafafa" fill="#fafafa"
@@ -29,7 +36,7 @@ export const SignInWithGithub = forwardRef<HTMLButtonElement, SignInWithIdentity
height="1024" height="1024"
fill="none" fill="none"
viewBox="0 0 1024 1024" viewBox="0 0 1024 1024"
className="ztdl-block dark:ztdl-hidden" className="block dark:hidden"
> >
<path <path
fill="#1B1F23" fill="#1B1F23"
@@ -39,7 +46,11 @@ export const SignInWithGithub = forwardRef<HTMLButtonElement, SignInWithIdentity
></path> ></path>
</svg> </svg>
</div> </div>
{children ? children : <span className="ztdl-ml-4">{name ? name : "Sign in with GitHub"}</span>} {children ? (
children
) : (
<span className="ml-4">{name ? name : "Sign in with GitHub"}</span>
)}
</button> </button>
), ),
); );

View File

@@ -1,12 +1,26 @@
import { ReactNode, forwardRef } from "react"; "use client";
import { SignInWithIdentityProviderProps } from "./SignInWith";
import { IdpButtonClasses } from "./classes";
export const SignInWithGitlab = forwardRef<HTMLButtonElement, SignInWithIdentityProviderProps>( import { ReactNode, forwardRef } from "react";
import { IdpButtonClasses, SignInWithIdentityProviderProps } from "./classes";
export const SignInWithGitlab = forwardRef<
HTMLButtonElement,
SignInWithIdentityProviderProps
>(
({ children, className = "", name = "", ...props }, ref): ReactNode => ( ({ children, className = "", name = "", ...props }, ref): ReactNode => (
<button type="button" ref={ref} className={`${IdpButtonClasses} ${className}`} {...props}> <button
<div className="ztdl-h-12 ztdl-w-12 flex items-center justify-center"> type="button"
<svg xmlns="http://www.w3.org/2000/svg" width={25} height={24} fill="none"> ref={ref}
className={`${IdpButtonClasses} ${className}`}
{...props}
>
<div className="h-12 w-12 flex items-center justify-center">
<svg
xmlns="http://www.w3.org/2000/svg"
width={25}
height={24}
fill="none"
>
<path <path
fill="#e24329" fill="#e24329"
d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5z" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5z"
@@ -25,7 +39,11 @@ export const SignInWithGitlab = forwardRef<HTMLButtonElement, SignInWithIdentity
/> />
</svg> </svg>
</div> </div>
{children ? children : <span className="ztdl-ml-4">{name ? name : "Sign in with GitLab"}</span>} {children ? (
children
) : (
<span className="ml-4">{name ? name : "Sign in with GitLab"}</span>
)}
</button> </button>
), ),
); );

View File

@@ -1,12 +1,26 @@
import { ReactNode, forwardRef } from "react"; "use client";
import { SignInWithIdentityProviderProps } from "./SignInWith";
import { IdpButtonClasses } from "./classes";
export const SignInWithGoogle = forwardRef<HTMLButtonElement, SignInWithIdentityProviderProps>( import { ReactNode, forwardRef } from "react";
import { IdpButtonClasses, SignInWithIdentityProviderProps } from "./classes";
export const SignInWithGoogle = forwardRef<
HTMLButtonElement,
SignInWithIdentityProviderProps
>(
({ children, className = "", name = "", ...props }, ref): ReactNode => ( ({ children, className = "", name = "", ...props }, ref): ReactNode => (
<button type="button" ref={ref} className={`${IdpButtonClasses} ${className}`} {...props}> <button
<div className="ztdl-h-12 ztdl-w-12 ztdl-flex ztdl-items-center ztdl-justify-center"> type="button"
<svg xmlns="http://www.w3.org/2000/svg" xmlSpace="preserve" id="Capa_1" viewBox="0 0 150 150"> ref={ref}
className={`${IdpButtonClasses} ${className}`}
{...props}
>
<div className="h-12 w-12 flex items-center justify-center">
<svg
xmlns="http://www.w3.org/2000/svg"
xmlSpace="preserve"
id="Capa_1"
viewBox="0 0 150 150"
>
<style> <style>
{ {
".st0{fill:#1a73e8}.st1{fill:#ea4335}.st2{fill:#4285f4}.st3{fill:#fbbc04}.st4{fill:#34a853}.st5{fill:#4caf50}.st6{fill:#1e88e5}.st7{fill:#e53935}.st8{fill:#c62828}.st9{fill:#fbc02d}.st10{fill:#1565c0}.st11{fill:#2e7d32}.st16{clip-path:url(#SVGID_2_)}.st17{fill:#188038}.st18,.st19{opacity:.2;fill:#fff;enable-background:new}.st19{opacity:.3;fill:#0d652d}.st20{clip-path:url(#SVGID_4_)}.st21{opacity:.3;fill:url(#_45_shadow_1_);enable-background:new}.st22{clip-path:url(#SVGID_6_)}.st23{fill:#fa7b17}.st24,.st25,.st26{opacity:.3;fill:#174ea6;enable-background:new}.st25,.st26{fill:#a50e0e}.st26{fill:#e37400}.st27{fill:url(#Finish_mask_1_)}.st28{fill:#fff}.st29{fill:#0c9d58}.st30,.st31{opacity:.2;fill:#004d40;enable-background:new}.st31{fill:#3e2723}.st32{fill:#ffc107}.st33{fill:#1a237e;enable-background:new}.st33,.st34{opacity:.2}.st35{fill:#1a237e}.st36{fill:url(#SVGID_7_)}.st37{fill:#fbbc05}.st38{clip-path:url(#SVGID_9_);fill:#e53935}.st39{clip-path:url(#SVGID_11_);fill:#fbc02d}.st40{clip-path:url(#SVGID_13_);fill:#e53935}.st41{clip-path:url(#SVGID_15_);fill:#fbc02d}" ".st0{fill:#1a73e8}.st1{fill:#ea4335}.st2{fill:#4285f4}.st3{fill:#fbbc04}.st4{fill:#34a853}.st5{fill:#4caf50}.st6{fill:#1e88e5}.st7{fill:#e53935}.st8{fill:#c62828}.st9{fill:#fbc02d}.st10{fill:#1565c0}.st11{fill:#2e7d32}.st16{clip-path:url(#SVGID_2_)}.st17{fill:#188038}.st18,.st19{opacity:.2;fill:#fff;enable-background:new}.st19{opacity:.3;fill:#0d652d}.st20{clip-path:url(#SVGID_4_)}.st21{opacity:.3;fill:url(#_45_shadow_1_);enable-background:new}.st22{clip-path:url(#SVGID_6_)}.st23{fill:#fa7b17}.st24,.st25,.st26{opacity:.3;fill:#174ea6;enable-background:new}.st25,.st26{fill:#a50e0e}.st26{fill:#e37400}.st27{fill:url(#Finish_mask_1_)}.st28{fill:#fff}.st29{fill:#0c9d58}.st30,.st31{opacity:.2;fill:#004d40;enable-background:new}.st31{fill:#3e2723}.st32{fill:#ffc107}.st33{fill:#1a237e;enable-background:new}.st33,.st34{opacity:.2}.st35{fill:#1a237e}.st36{fill:url(#SVGID_7_)}.st37{fill:#fbbc05}.st38{clip-path:url(#SVGID_9_);fill:#e53935}.st39{clip-path:url(#SVGID_11_);fill:#fbc02d}.st40{clip-path:url(#SVGID_13_);fill:#e53935}.st41{clip-path:url(#SVGID_15_);fill:#fbc02d}"
@@ -38,7 +52,11 @@ export const SignInWithGoogle = forwardRef<HTMLButtonElement, SignInWithIdentity
/> />
</svg> </svg>
</div> </div>
{children ? children : <span className="ztdl-ml-4">{name ? name : "Sign in with Google"}</span>} {children ? (
children
) : (
<span className="ml-4">{name ? name : "Sign in with Google"}</span>
)}
</button> </button>
), ),
); );

View File

@@ -0,0 +1,17 @@
import { ButtonHTMLAttributes, DetailedHTMLProps } from "react";
export const IdpButtonClasses =
"transition-all w-full cursor-pointer flex flex-row items-center bg-background-light-400 text-text-light-500 dark:bg-background-dark-500 dark:text-text-dark-500 border border-divider-light hover:border-black dark:border-divider-dark hover:dark:border-white focus:border-primary-light-500 focus:dark:border-primary-dark-500 outline-none rounded-md px-4 text-sm";
export interface SignInWithIDPProps {
children?: React.ReactNode;
orgId?: string;
}
export type SignInWithIdentityProviderProps = DetailedHTMLProps<
ButtonHTMLAttributes<HTMLButtonElement>,
HTMLButtonElement
> & {
name?: string;
e2e?: string;
};

View File

@@ -6,7 +6,6 @@ import {
getSession, getSession,
setSession, setSession,
} from "@/lib/zitadel"; } from "@/lib/zitadel";
import { addSessionToCookie, updateSessionCookie } from "@zitadel/next";
import { import {
Challenges, Challenges,
RequestChallenges, RequestChallenges,
@@ -18,6 +17,7 @@ import {
} from "@zitadel/proto/zitadel/session/v2/session_service_pb"; } from "@zitadel/proto/zitadel/session/v2/session_service_pb";
import { timestampDate, toDate } from "@zitadel/client"; import { timestampDate, toDate } from "@zitadel/client";
import { create } from "@zitadel/client"; import { create } from "@zitadel/client";
import { addSessionToCookie, updateSessionCookie } from "@/lib/cookies";
type CustomCookieData = { type CustomCookieData = {
id: string; id: string;

View File

@@ -6,36 +6,16 @@
"dependsOn": ["^build"] "dependsOn": ["^build"]
}, },
"test": { "test": {
"dependsOn": [ "dependsOn": ["@zitadel/node#build", "@zitadel/client#build"]
"@zitadel/node#build",
"@zitadel/client#build",
"@zitadel/react#build",
"@zitadel/next#build"
]
}, },
"test:integration": { "test:integration": {
"dependsOn": [ "dependsOn": ["@zitadel/node#build", "@zitadel/client#build"]
"@zitadel/node#build",
"@zitadel/client#build",
"@zitadel/react#build",
"@zitadel/next#build"
]
}, },
"test:unit": { "test:unit": {
"dependsOn": [ "dependsOn": ["@zitadel/node#build", "@zitadel/client#build"]
"@zitadel/node#build",
"@zitadel/client#build",
"@zitadel/react#build",
"@zitadel/next#build"
]
}, },
"test:watch": { "test:watch": {
"dependsOn": [ "dependsOn": ["@zitadel/node#build", "@zitadel/client#build"]
"@zitadel/node#build",
"@zitadel/client#build",
"@zitadel/react#build",
"@zitadel/next#build"
]
} }
} }
} }

View File

@@ -1,4 +0,0 @@
module.exports = {
root: true,
extends: ["zitadel"],
};

View File

@@ -1,48 +0,0 @@
{
"name": "@zitadel/next",
"version": "0.0.0",
"sideEffects": false,
"license": "MIT",
"type": "module",
"exports": {
".": {
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
}
},
"files": [
"dist/**"
],
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "tsup",
"test": "pnpm test:unit",
"test:watch": "pnpm test:unit:watch",
"test:unit": "vitest",
"test:unit:watch": "vitest --watch",
"dev": "tsup --watch",
"lint": "eslint \"src/**/*.ts*\"",
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
},
"peerDependencies": {
"@zitadel/node": "workspace:*",
"@zitadel/react": "workspace:*",
"@zitadel/client": "workspace:*",
"@zitadel/proto": "workspace:*",
"next": "^14.2.5",
"react": "^18.3.1"
},
"dependencies": {
"next": "^14.2.5"
},
"devDependencies": {
"@types/react": "^18.3.3",
"@zitadel/tsconfig": "workspace:*",
"eslint-config-zitadel": "workspace:*",
"postcss": "8.4.41",
"tailwindcss": "3.4.9",
"zitadel-tailwind-config": "workspace:*"
}
}

View File

@@ -1,9 +0,0 @@
// If you want to use other PostCSS plugins, see the following:
// https://tailwindcss.com/docs/using-with-preprocessors
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View File

@@ -1,8 +0,0 @@
export type ZitadelNextProps = {
dark: boolean;
children: React.ReactNode;
};
export function ZitadelNextProvider({ dark, children }: ZitadelNextProps) {
return <div className={`${dark ? "ztdl-dark" : "ztdl-light"} `}>{children}</div>;
}

View File

@@ -1,5 +0,0 @@
// import "./styles.css";
export { ZitadelNextProvider, type ZitadelNextProps } from "./components/ZitadelNextProvider";
export * from "./utils/cookies";
export { loadMostRecentSession } from "./utils/session";

View File

@@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -1,9 +0,0 @@
const sharedConfig = require("zitadel-tailwind-config/tailwind.config.mjs");
/** @type {import('tailwindcss').Config} */
module.exports = {
presets: [sharedConfig],
prefix: "ztdl-next-",
darkMode: "class",
content: [`src/**/*.{js,ts,jsx,tsx}`],
};

View File

@@ -1,5 +0,0 @@
{
"extends": "@zitadel/tsconfig/react-library.json",
"include": ["."],
"exclude": ["dist", "build", "node_modules"]
}

View File

@@ -1,14 +0,0 @@
import { defineConfig, Options } from "tsup";
export default defineConfig((options: Options) => ({
treeshake: true,
splitting: true,
publicDir: true,
entry: ["src/**/*.tsx"],
format: ["esm"],
dts: true,
minify: true,
clean: true,
external: ["react"],
...options,
}));

View File

@@ -1,9 +0,0 @@
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": ["dist/**"],
"dependsOn": ["@zitadel/client#build", "@zitadel/react#build"]
}
}
}

View File

@@ -1,4 +0,0 @@
module.exports = {
root: true,
extends: ["zitadel"],
};

View File

@@ -1,39 +0,0 @@
# How to use
### Install
```sh
npm install @zitadel/react
```
or
```sh
yarn add @zitadel/react
```
### Import styles file
To get the styles, import them in `_app.tsx` or global styling file
```
import "@zitadel/react/styles.css";
```
### Setup Dark mode
to set dark theme, wrap your components in a `ui-dark` class.
### Use components
```tsx
import { SignInWithGoogle } from "@zitadel/react";
export default function IdentityProviders() {
return (
<div className="py-4">
<SignInWithGoogle />
</div>
);
}
```

View File

@@ -1,48 +0,0 @@
{
"name": "@zitadel/react",
"version": "0.0.0",
"types": "./dist/index.d.ts",
"sideEffects": [
"**/*.css"
],
"license": "MIT",
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./styles.css": "./dist/index.css",
"./assets/*": "./dist/assets/*"
},
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "tsup",
"test": "pnpm test:unit",
"test:watch": "pnpm test:unit:watch",
"test:unit": "vitest",
"test:unit:watch": "vitest --watch",
"dev": "tsup --watch",
"lint": "eslint \"src/**/*.ts*\"",
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
"copy-files": "cp -R ./src/public/ ./dist/"
},
"peerDependencies": {
"react": "^18.3.1"
},
"devDependencies": {
"@testing-library/jest-dom": "^6.4.5",
"@testing-library/react": "^16.0.0",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@zitadel/tsconfig": "workspace:*",
"autoprefixer": "10.4.20",
"eslint-config-zitadel": "workspace:*",
"jsdom": "^24.0.0",
"postcss": "8.4.41",
"sass": "^1.77.1",
"tailwindcss": "3.4.9",
"zitadel-tailwind-config": "workspace:*"
}
}

View File

@@ -1,9 +0,0 @@
// If you want to use other PostCSS plugins, see the following:
// https://tailwindcss.com/docs/using-with-preprocessors
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View File

@@ -1,9 +0,0 @@
import { ButtonHTMLAttributes, DetailedHTMLProps } from "react";
export type SignInWithIdentityProviderProps = DetailedHTMLProps<
ButtonHTMLAttributes<HTMLButtonElement>,
HTMLButtonElement
> & {
name?: string;
e2e?: string;
};

View File

@@ -1,23 +0,0 @@
"use client";
import { ReactNode, forwardRef } from "react";
import { SignInWithIdentityProviderProps } from "./SignInWith";
import { IdpButtonClasses } from "./classes";
export const SignInWithAzureAD = forwardRef<HTMLButtonElement, SignInWithIdentityProviderProps>(
({ children, className = "", name = "", ...props }, ref): ReactNode => (
<button type="button" ref={ref} className={`${IdpButtonClasses} ${className}`} {...props}>
<div className="ztdl-h-12 ztdl-p-[10px] ztdl-w-12 ztdl-flex ztdl-items-center ztdl-justify-center">
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="21" viewBox="0 0 21 21" className="w-full h-full">
<path fill="#f25022" d="M1 1H10V10H1z"></path>
<path fill="#00a4ef" d="M1 11H10V20H1z"></path>
<path fill="#7fba00" d="M11 1H20V10H11z"></path>
<path fill="#ffb900" d="M11 11H20V20H11z"></path>
</svg>
</div>
{children ? children : <span className="ztdl-ml-4">{name ? name : "Sign in with AzureAD"}</span>}
</button>
),
);
SignInWithAzureAD.displayName = "SignInWithAzureAD";

View File

@@ -1,17 +0,0 @@
import * as React from "react";
export interface SignInWithIDPProps {
children?: React.ReactNode;
orgId?: string;
}
export function SignInWithIDP(props: SignInWithIDPProps) {
return (
<div className="ztdl-flex ztdl-flex-row border ztdl-border-divider-light dark:ztdl-border-divider-dark rounded-md px-4 text-sm">
<div></div>
{props.children}
</div>
);
}
SignInWithIDP.displayName = "SignInWithIDP";

View File

@@ -1,8 +0,0 @@
export type ZitadelReactProps = {
dark: boolean;
children: React.ReactNode;
};
export function ZitadelReactProvider({ dark, children }: ZitadelReactProps) {
return <div className={`${dark ? "ztdl-dark" : "ztdl-light"} `}>{children}</div>;
}

View File

@@ -1,2 +0,0 @@
export const IdpButtonClasses =
"transition-all ztdl-w-full ztdl-cursor-pointer ztdl-flex ztdl-flex-row ztdl-items-center bg-background-light-400 text-text-light-500 dark:bg-background-dark-500 dark:text-text-dark-500 border border-divider-light hover:border-black dark:border-divider-dark hover:dark:border-white focus:border-primary-light-500 focus:dark:border-primary-dark-500 outline-none rounded-md px-4 text-sm";

View File

@@ -1,13 +0,0 @@
import "./styles.css";
export { SignInWithGoogle } from "./components/SignInWithGoogle";
export { SignInWithGitlab } from "./components/SignInWithGitlab";
export { SignInWithAzureAD } from "./components/SignInWithAzureAD";
export { SignInWithGithub } from "./components/SignInWithGithub";
export { ZitadelReactProvider, type ZitadelReactProps } from "./components/ZitadelReactProvider";
export { SignInWithIDP, type SignInWithIDPProps } from "./components/SignInWithIDP";

View File

@@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -1,9 +0,0 @@
const sharedConfig = require("zitadel-tailwind-config/tailwind.config.mjs");
/** @type {import('tailwindcss').Config} */
module.exports = {
presets: [sharedConfig],
prefix: "ztdl-",
darkMode: "class",
content: [`src/**/*.{js,ts,jsx,tsx}`],
};

View File

@@ -1,8 +0,0 @@
{
"extends": "@zitadel/tsconfig/react-library.json",
"include": ["."],
"exclude": ["dist", "build", "node_modules"],
"compilerOptions": {
"types": ["@testing-library/jest-dom"]
}
}

View File

@@ -1,9 +0,0 @@
import { defineConfig, Options } from "tsup";
export default defineConfig((options: Options) => ({
entry: ["src/index.tsx"],
format: ["esm", "cjs"],
dts: true,
external: ["react"],
...options,
}));

View File

@@ -1,12 +0,0 @@
{
"extends": [
"//"
],
"tasks": {
"build": {
"outputs": [
"dist/**"
]
}
}
}

View File

@@ -1,11 +0,0 @@
import { defineConfig } from "vitest/config";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
test: {
include: ['src/**/*.test.ts', 'src/**/*.test.tsx'],
environment: "jsdom",
setupFiles: ["@testing-library/jest-dom/vitest"],
},
});

290
pnpm-lock.yaml generated
View File

@@ -62,18 +62,12 @@ importers:
'@zitadel/client': '@zitadel/client':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/zitadel-client version: link:../../packages/zitadel-client
'@zitadel/next':
specifier: workspace:*
version: link:../../packages/zitadel-next
'@zitadel/node': '@zitadel/node':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/zitadel-node version: link:../../packages/zitadel-node
'@zitadel/proto': '@zitadel/proto':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/zitadel-proto version: link:../../packages/zitadel-proto
'@zitadel/react':
specifier: workspace:*
version: link:../../packages/zitadel-react
clsx: clsx:
specifier: 1.2.1 specifier: 1.2.1
version: 1.2.1 version: 1.2.1
@@ -118,7 +112,7 @@ importers:
specifier: ^6.4.5 specifier: ^6.4.5
version: 6.5.0 version: 6.5.0
'@testing-library/react': '@testing-library/react':
specifier: ^16.0.0 specifier: ^16.0.1
version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
'@types/ms': '@types/ms':
specifier: 0.7.34 specifier: 0.7.34
@@ -142,7 +136,7 @@ importers:
specifier: 1.0.0 specifier: 1.0.0
version: 1.0.0 version: 1.0.0
'@zitadel/prettier-config': '@zitadel/prettier-config':
specifier: workspace:* specifier: workspace:^
version: link:../../packages/zitadel-prettier-config version: link:../../packages/zitadel-prettier-config
'@zitadel/tsconfig': '@zitadel/tsconfig':
specifier: workspace:* specifier: workspace:*
@@ -239,46 +233,6 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../eslint-config-zitadel version: link:../eslint-config-zitadel
packages/zitadel-next:
dependencies:
'@zitadel/client':
specifier: workspace:*
version: link:../zitadel-client
'@zitadel/node':
specifier: workspace:*
version: link:../zitadel-node
'@zitadel/proto':
specifier: workspace:*
version: link:../zitadel-proto
'@zitadel/react':
specifier: workspace:*
version: link:../zitadel-react
next:
specifier: ^14.2.5
version: 14.2.5(@babel/core@7.25.2)(react-dom@18.3.1)(react@18.3.1)(sass@1.77.8)
react:
specifier: ^18.3.1
version: 18.3.1
devDependencies:
'@types/react':
specifier: ^18.3.3
version: 18.3.3
'@zitadel/tsconfig':
specifier: workspace:*
version: link:../zitadel-tsconfig
eslint-config-zitadel:
specifier: workspace:*
version: link:../eslint-config-zitadel
postcss:
specifier: 8.4.41
version: 8.4.41
tailwindcss:
specifier: 3.4.9
version: 3.4.9
zitadel-tailwind-config:
specifier: workspace:*
version: link:../zitadel-tailwind-config
packages/zitadel-node: packages/zitadel-node:
dependencies: dependencies:
'@connectrpc/connect-node': '@connectrpc/connect-node':
@@ -316,49 +270,6 @@ importers:
specifier: ^1.36.0 specifier: ^1.36.0
version: 1.39.0 version: 1.39.0
packages/zitadel-react:
dependencies:
react:
specifier: ^18.3.1
version: 18.3.1
devDependencies:
'@testing-library/jest-dom':
specifier: ^6.4.5
version: 6.5.0
'@testing-library/react':
specifier: ^16.0.0
version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
'@types/react':
specifier: ^18.3.3
version: 18.3.3
'@types/react-dom':
specifier: ^18.3.0
version: 18.3.0
'@zitadel/tsconfig':
specifier: workspace:*
version: link:../zitadel-tsconfig
autoprefixer:
specifier: 10.4.20
version: 10.4.20(postcss@8.4.41)
eslint-config-zitadel:
specifier: workspace:*
version: link:../eslint-config-zitadel
jsdom:
specifier: ^24.0.0
version: 24.1.3
postcss:
specifier: 8.4.41
version: 8.4.41
sass:
specifier: ^1.77.1
version: 1.77.8
tailwindcss:
specifier: 3.4.9
version: 3.4.9
zitadel-tailwind-config:
specifier: workspace:*
version: link:../zitadel-tailwind-config
packages/zitadel-tailwind-config: packages/zitadel-tailwind-config:
devDependencies: devDependencies:
'@tailwindcss/forms': '@tailwindcss/forms':
@@ -2189,15 +2100,6 @@ packages:
- supports-color - supports-color
dev: true dev: true
/agent-base@7.1.1:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
dependencies:
debug: 4.3.6(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
dev: true
/aggregate-error@3.1.0: /aggregate-error@3.1.0:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -2914,13 +2816,6 @@ packages:
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
/cssstyle@4.0.1:
resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
engines: {node: '>=18'}
dependencies:
rrweb-cssom: 0.6.0
dev: true
/csstype@3.1.3: /csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
dev: true dev: true
@@ -2986,14 +2881,6 @@ packages:
assert-plus: 1.0.0 assert-plus: 1.0.0
dev: true dev: true
/data-urls@5.0.0:
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
engines: {node: '>=18'}
dependencies:
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
dev: true
/data-view-buffer@1.0.1: /data-view-buffer@1.0.1:
resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -3086,10 +2973,6 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
dev: true
/deep-eql@5.0.2: /deep-eql@5.0.2:
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -3285,11 +3168,6 @@ packages:
strip-ansi: 6.0.1 strip-ansi: 6.0.1
dev: true dev: true
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
dev: true
/env-cmd@10.1.0: /env-cmd@10.1.0:
resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==} resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==}
engines: {node: '>=8.0.0'} engines: {node: '>=8.0.0'}
@@ -4400,23 +4278,6 @@ packages:
lru-cache: 6.0.0 lru-cache: 6.0.0
dev: true dev: true
/html-encoding-sniffer@4.0.0:
resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
engines: {node: '>=18'}
dependencies:
whatwg-encoding: 3.1.1
dev: true
/http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.1
debug: 4.3.6(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
dev: true
/http-signature@1.3.6: /http-signature@1.3.6:
resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
@@ -4436,16 +4297,6 @@ packages:
- supports-color - supports-color
dev: true dev: true
/https-proxy-agent@7.0.5:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.1
debug: 4.3.6(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
dev: true
/human-id@1.0.2: /human-id@1.0.2:
resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
dev: true dev: true
@@ -4472,13 +4323,6 @@ packages:
safer-buffer: 2.1.2 safer-buffer: 2.1.2
dev: true dev: true
/iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: true
/ieee754@1.2.1: /ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: true dev: true
@@ -4711,10 +4555,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
dev: true
/is-regex@1.1.4: /is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -4887,42 +4727,6 @@ packages:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
dev: true dev: true
/jsdom@24.1.3:
resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==}
engines: {node: '>=18'}
peerDependencies:
canvas: ^2.11.2
peerDependenciesMeta:
canvas:
optional: true
dependencies:
cssstyle: 4.0.1
data-urls: 5.0.0
decimal.js: 10.4.3
form-data: 4.0.0
html-encoding-sniffer: 4.0.0
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.5
is-potential-custom-element-name: 1.0.1
nwsapi: 2.2.12
parse5: 7.1.2
rrweb-cssom: 0.7.1
saxes: 6.0.0
symbol-tree: 3.2.4
tough-cookie: 4.1.4
w3c-xmlserializer: 5.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
ws: 8.18.0
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
dev: true
/jsesc@2.5.2: /jsesc@2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -5562,10 +5366,6 @@ packages:
set-blocking: 2.0.0 set-blocking: 2.0.0
dev: true dev: true
/nwsapi@2.2.12:
resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==}
dev: true
/object-assign@4.1.1: /object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@@ -5764,12 +5564,6 @@ packages:
lines-and-columns: 1.2.4 lines-and-columns: 1.2.4
dev: true dev: true
/parse5@7.1.2:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
dependencies:
entities: 4.5.0
dev: true
/path-exists@4.0.0: /path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -6395,14 +6189,6 @@ packages:
fsevents: 2.3.3 fsevents: 2.3.3
dev: true dev: true
/rrweb-cssom@0.6.0:
resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
dev: true
/rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
dev: true
/run-parallel@1.2.0: /run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies: dependencies:
@@ -6450,13 +6236,6 @@ packages:
immutable: 4.3.7 immutable: 4.3.7
source-map-js: 1.2.0 source-map-js: 1.2.0
/saxes@6.0.0:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
dependencies:
xmlchars: 2.2.0
dev: true
/scheduler@0.23.2: /scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
dependencies: dependencies:
@@ -6912,10 +6691,6 @@ packages:
use-sync-external-store: 1.2.2(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1)
dev: false dev: false
/symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: true
/tailwindcss@3.4.9: /tailwindcss@3.4.9:
resolution: {integrity: sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==} resolution: {integrity: sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
@@ -7064,13 +6839,6 @@ packages:
punycode: 2.3.1 punycode: 2.3.1
dev: true dev: true
/tr46@5.0.0:
resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
engines: {node: '>=18'}
dependencies:
punycode: 2.3.1
dev: true
/tree-kill@1.2.2: /tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true hasBin: true
@@ -7556,13 +7324,6 @@ packages:
- terser - terser
dev: true dev: true
/w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
dependencies:
xml-name-validator: 5.0.0
dev: true
/wait-on@7.2.0(debug@4.3.6): /wait-on@7.2.0(debug@4.3.6):
resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@@ -7585,31 +7346,6 @@ packages:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
dev: true dev: true
/webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
dev: true
/whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
dependencies:
iconv-lite: 0.6.3
dev: true
/whatwg-mimetype@4.0.0:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
dev: true
/whatwg-url@14.0.0:
resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
engines: {node: '>=18'}
dependencies:
tr46: 5.0.0
webidl-conversions: 7.0.0
dev: true
/whatwg-url@5.0.0: /whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies: dependencies:
@@ -7752,28 +7488,6 @@ packages:
/wrappy@1.0.2: /wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
/ws@8.18.0:
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: '>=5.0.2'
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
dev: true
/xml-name-validator@5.0.0:
resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
engines: {node: '>=18'}
dev: true
/xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
dev: true
/y18n@5.0.8: /y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'} engines: {node: '>=10'}