From 461b19d84cb489cd15d5e1090016ed1f4becb402 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 13 Jun 2024 16:36:58 +0530 Subject: [PATCH 001/109] init: Add auth pages to playground app --- playground/toolpad-core-nextjs/package.json | 2 + .../src/app/api/auth/[...nextauth]/route.ts | 2 + .../src/app/auth-error/page.tsx | 63 ++++++++++ .../src/app/dashboard/page.tsx | 28 ++++- .../src/app/signin/page.tsx | 116 ++++++++++++++++++ .../src/app/signout/page.tsx | 56 +++++++++ playground/toolpad-core-nextjs/src/auth.ts | 28 +++++ .../src/components/UserAvatar.tsx | 15 +++ pnpm-lock.yaml | 54 ++++++++ 9 files changed, 361 insertions(+), 3 deletions(-) create mode 100644 playground/toolpad-core-nextjs/src/app/api/auth/[...nextauth]/route.ts create mode 100644 playground/toolpad-core-nextjs/src/app/auth-error/page.tsx create mode 100644 playground/toolpad-core-nextjs/src/app/signin/page.tsx create mode 100644 playground/toolpad-core-nextjs/src/app/signout/page.tsx create mode 100644 playground/toolpad-core-nextjs/src/auth.ts create mode 100644 playground/toolpad-core-nextjs/src/components/UserAvatar.tsx diff --git a/playground/toolpad-core-nextjs/package.json b/playground/toolpad-core-nextjs/package.json index 8a82d90329f..5abe3e8f691 100644 --- a/playground/toolpad-core-nextjs/package.json +++ b/playground/toolpad-core-nextjs/package.json @@ -10,12 +10,14 @@ "@emotion/react": "11.11.4", "@emotion/styled": "11.11.5", "@mui/icons-material": "5.15.19", + "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.15.19", "@toolpad/core": "workspace:*", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "eslint-config-next": "14.2.3", "next": "14.2.3", + "next-auth": "5.0.0-beta.19", "react": "18.3.1", "react-dom": "18.3.1" } diff --git a/playground/toolpad-core-nextjs/src/app/api/auth/[...nextauth]/route.ts b/playground/toolpad-core-nextjs/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 00000000000..608e25d7131 --- /dev/null +++ b/playground/toolpad-core-nextjs/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,2 @@ +import { handlers } from '../../../../auth'; +export const { GET, POST } = handlers; diff --git a/playground/toolpad-core-nextjs/src/app/auth-error/page.tsx b/playground/toolpad-core-nextjs/src/app/auth-error/page.tsx new file mode 100644 index 00000000000..65bdf2816c0 --- /dev/null +++ b/playground/toolpad-core-nextjs/src/app/auth-error/page.tsx @@ -0,0 +1,63 @@ +'use client'; + +import * as React from 'react'; +import { Container, Box, Typography, Button } from '@mui/material'; +import { useParams, useSearchParams } from 'next/navigation'; + +enum Error { + Configuration = 'Configuration', +} + +const errorMap = { + [Error.Configuration]: ( +

+ There was a problem when trying to authenticate. Please contact us if this error persists. + Unique error code: Configuration +

+ ), +}; + +export default function AuthErrorPage() { + const search = useSearchParams(); + const params = useParams(); + const error = search.get('error') as Error; + return ( + + +

{JSON.stringify(params)}

+ + Something went wrong + + + {errorMap[error] || 'Please contact us if this error persists.'} + + +
+
+ ); +} diff --git a/playground/toolpad-core-nextjs/src/app/dashboard/page.tsx b/playground/toolpad-core-nextjs/src/app/dashboard/page.tsx index fff0d65050c..817a76132a5 100644 --- a/playground/toolpad-core-nextjs/src/app/dashboard/page.tsx +++ b/playground/toolpad-core-nextjs/src/app/dashboard/page.tsx @@ -1,8 +1,14 @@ import * as React from 'react'; + import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import UserAvatar from '../../components/UserAvatar'; +import { auth } from '../../auth'; + +export default async function Dashboard() { + const session = await auth(); -export default function Dashboard() { return ( - - Welcome to the Toolpad dashboard! + + + Welcome to the Toolpad dashboard, {session?.user?.name || 'user'} + ); } diff --git a/playground/toolpad-core-nextjs/src/app/signin/page.tsx b/playground/toolpad-core-nextjs/src/app/signin/page.tsx new file mode 100644 index 00000000000..32123a97d41 --- /dev/null +++ b/playground/toolpad-core-nextjs/src/app/signin/page.tsx @@ -0,0 +1,116 @@ +import * as React from 'react'; +import { redirect } from 'next/navigation'; +import { + Avatar, + Box, + Button, + Container, + Divider, + Grid, + Link, + TextField, + Typography, +} from '@mui/material'; +import { LoadingButton } from '@mui/lab'; +import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +import GitHubIcon from '@mui/icons-material/GitHub'; +import PasswordIcon from '@mui/icons-material/Password'; +import { AuthError } from 'next-auth'; +import { signIn, providerMap } from '../../auth'; +// import { AuthContext } from '../../AuthContext'; + +const IconProviderMap = new Map([ + ['github', ], + ['credentials', ], + [ + 'google', + Google logo, + ], +]); + +const IconBackgroundMap = new Map([ + ['github', '#24292e'], + ['credentials', 'default'], +]); + +export default function SignInPage() { + return ( + + + + + + + Sign in + + + with one of the following providers: + +
+ {providerMap.map((provider) => ( +
{ + 'use server'; + try { + await signIn(provider.id, { redirectTo: '/dashboard' }); + } catch (error) { + // Signin can fail for a number of reasons, such as the user + // not existing, or the user not having the correct role. + if (error instanceof AuthError) { + return redirect(`/auth-error?error=${error.type}`); + } + // Otherwise if a redirects happens NextJS can handle it + // so you can just re-throw the error and let NextJS handle it. + // Docs: + // https://nextjs.org/docs/app/api-reference/functions/redirect#server-component + throw error; + } + }} + > + + Sign in with {provider.name} + +
+ ))} +
+
+
+ ); +} diff --git a/playground/toolpad-core-nextjs/src/app/signout/page.tsx b/playground/toolpad-core-nextjs/src/app/signout/page.tsx new file mode 100644 index 00000000000..26502982f2d --- /dev/null +++ b/playground/toolpad-core-nextjs/src/app/signout/page.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { signOut } from '../../auth.ts'; +import { Container, Box, Typography } from '@mui/material'; +import { LoadingButton } from '@mui/lab'; + +export default function SignOutPage() { + return ( + + + + Sign out + + + You will be redirected to the home page. + + +
{ + 'use server'; + await signOut({ redirectTo: '/signin' }); + }} + > + + Sign out + +
+
+
+ ); +} diff --git a/playground/toolpad-core-nextjs/src/auth.ts b/playground/toolpad-core-nextjs/src/auth.ts new file mode 100644 index 00000000000..1d95d8de942 --- /dev/null +++ b/playground/toolpad-core-nextjs/src/auth.ts @@ -0,0 +1,28 @@ +import NextAuth from 'next-auth'; +import GitHub from 'next-auth/providers/github'; +import type { Provider } from 'next-auth/providers'; + +const providers: Provider[] = [ + GitHub({ + clientId: process.env.TOOLPAD_GITHUB_CLIENT_ID, + clientSecret: process.env.TOOLPAD_GITHUB_CLIENT_SECRET, + }), +]; + +export const providerMap = providers.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } else { + return { id: provider.id, name: provider.name }; + } +}); + +export const { handlers, auth, signIn, signOut } = NextAuth({ + providers, + secret: process.env.TOOLPAD_AUTH_SECRET, + pages: { + signIn: '/signin', + signOut: '/signout', + }, +}); diff --git a/playground/toolpad-core-nextjs/src/components/UserAvatar.tsx b/playground/toolpad-core-nextjs/src/components/UserAvatar.tsx new file mode 100644 index 00000000000..01f9388cc39 --- /dev/null +++ b/playground/toolpad-core-nextjs/src/components/UserAvatar.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import { auth } from '../auth'; +import Avatar from '@mui/material/Avatar'; + +export default async function UserAvatar() { + const session = await auth(); + + if (!session || !session.user) return null; + + return ( +
+ +
+ ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b156e257caf..c4ad8c07004 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1160,6 +1160,9 @@ importers: '@mui/icons-material': specifier: 5.15.19 version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/lab': + specifier: 5.0.0-alpha.170 + version: 5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': specifier: 5.15.19 version: 5.15.19(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1178,6 +1181,9 @@ importers: next: specifier: 14.2.3 version: 14.2.3(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: 5.0.0-beta.19 + version: 5.0.0-beta.19(next@14.2.3(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -1311,6 +1317,20 @@ packages: nodemailer: optional: true + '@auth/core@0.32.0': + resolution: {integrity: sha512-3+ssTScBd+1fd0/fscAyQN1tSygXzuhysuVVzB942ggU4mdfiTbv36P0ccVnExKWYJKvu3E2r3/zxXCCAmTOrg==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + '@babel/cli@7.24.7': resolution: {integrity: sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A==} engines: {node: '>=6.9.0'} @@ -2428,6 +2448,7 @@ packages: '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -2435,6 +2456,7 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@hutson/parse-repository-url@3.0.2': resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} @@ -7426,6 +7448,22 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} + next-auth@5.0.0-beta.19: + resolution: {integrity: sha512-YHu1igcAxZPh8ZB7GIM93dqgY6gcAzq66FOhQFheAdOx1raxNcApt05nNyNCSB6NegSiyJ4XOPsaNow4pfDmsg==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + next: ^14 || ^15.0.0-0 + nodemailer: ^6.6.5 + react: ^18.2.0 || ^19.0.0-0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + next-router-mock@0.9.13: resolution: {integrity: sha512-906n2RRaE6Y28PfYJbaz5XZeJ6Tw8Xz1S6E31GGwZ0sXB6/XjldD1/2azn1ZmBmRk5PQRkzjg+n+RHZe5xQzWA==} peerDependencies: @@ -9982,6 +10020,16 @@ snapshots: preact: 10.11.3 preact-render-to-string: 5.2.3(preact@10.11.3) + '@auth/core@0.32.0': + dependencies: + '@panva/hkdf': 1.1.1 + '@types/cookie': 0.6.0 + cookie: 0.6.0 + jose: 5.3.0 + oauth4webapi: 2.10.4 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + '@babel/cli@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 @@ -17162,6 +17210,12 @@ snapshots: nested-error-stacks@2.1.1: {} + next-auth@5.0.0-beta.19(next@14.2.3(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + dependencies: + '@auth/core': 0.32.0 + next: 14.2.3(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + next-router-mock@0.9.13(next@14.2.3(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: next: 14.2.3(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) From 55eb08e4fc4ddb3639a0f7948dbf9436115f80bf Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 13 Jun 2024 17:19:43 +0530 Subject: [PATCH 002/109] wip: Clean up --- .../src/app/{ => (auth)}/auth-error/page.tsx | 5 +- .../src/app/{ => (auth)}/signin/page.tsx | 4 +- .../nextjs/src/app/(auth)/signout/page.tsx | 26 +++++++++ .../nextjs/src/app/(dashboard)/page.tsx | 14 ++++- playground/nextjs/src/app/signout/page.tsx | 56 ------------------- playground/nextjs/src/auth.ts | 4 +- playground/nextjs/src/components/SignOut.tsx | 37 ++++++++++++ 7 files changed, 80 insertions(+), 66 deletions(-) rename playground/nextjs/src/app/{ => (auth)}/auth-error/page.tsx (92%) rename playground/nextjs/src/app/{ => (auth)}/signin/page.tsx (96%) create mode 100644 playground/nextjs/src/app/(auth)/signout/page.tsx delete mode 100644 playground/nextjs/src/app/signout/page.tsx create mode 100644 playground/nextjs/src/components/SignOut.tsx diff --git a/playground/nextjs/src/app/auth-error/page.tsx b/playground/nextjs/src/app/(auth)/auth-error/page.tsx similarity index 92% rename from playground/nextjs/src/app/auth-error/page.tsx rename to playground/nextjs/src/app/(auth)/auth-error/page.tsx index 65bdf2816c0..eaccf01a3d1 100644 --- a/playground/nextjs/src/app/auth-error/page.tsx +++ b/playground/nextjs/src/app/(auth)/auth-error/page.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { Container, Box, Typography, Button } from '@mui/material'; -import { useParams, useSearchParams } from 'next/navigation'; +import { useSearchParams } from 'next/navigation'; enum Error { Configuration = 'Configuration', @@ -19,7 +19,7 @@ const errorMap = { export default function AuthErrorPage() { const search = useSearchParams(); - const params = useParams(); + const error = search.get('error') as Error; return ( @@ -31,7 +31,6 @@ export default function AuthErrorPage() { alignItems: 'center', }} > -

{JSON.stringify(params)}

Something went wrong diff --git a/playground/nextjs/src/app/signin/page.tsx b/playground/nextjs/src/app/(auth)/signin/page.tsx similarity index 96% rename from playground/nextjs/src/app/signin/page.tsx rename to playground/nextjs/src/app/(auth)/signin/page.tsx index 32123a97d41..8408e57c225 100644 --- a/playground/nextjs/src/app/signin/page.tsx +++ b/playground/nextjs/src/app/(auth)/signin/page.tsx @@ -16,7 +16,7 @@ import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; import GitHubIcon from '@mui/icons-material/GitHub'; import PasswordIcon from '@mui/icons-material/Password'; import { AuthError } from 'next-auth'; -import { signIn, providerMap } from '../../auth'; +import { signIn, providerMap } from '../../../auth'; // import { AuthContext } from '../../AuthContext'; const IconProviderMap = new Map([ @@ -67,7 +67,7 @@ export default function SignInPage() { action={async () => { 'use server'; try { - await signIn(provider.id, { redirectTo: '/dashboard' }); + await signIn(provider.id, { redirectTo: '/' }); } catch (error) { // Signin can fail for a number of reasons, such as the user // not existing, or the user not having the correct role. diff --git a/playground/nextjs/src/app/(auth)/signout/page.tsx b/playground/nextjs/src/app/(auth)/signout/page.tsx new file mode 100644 index 00000000000..9c7e80dc69c --- /dev/null +++ b/playground/nextjs/src/app/(auth)/signout/page.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { Container, Box, Typography } from '@mui/material'; +import SignOut from '../../../components/SignOut'; + +export default function SignOutPage() { + return ( + + + + Sign out + + + You will be redirected to the home page. + + + + + ); +} diff --git a/playground/nextjs/src/app/(dashboard)/page.tsx b/playground/nextjs/src/app/(dashboard)/page.tsx index 761eebce518..3946c092dff 100644 --- a/playground/nextjs/src/app/(dashboard)/page.tsx +++ b/playground/nextjs/src/app/(dashboard)/page.tsx @@ -1,8 +1,14 @@ import * as React from 'react'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; +import { LoadingButton } from '@mui/lab'; +import UserAvatar from '../../components/UserAvatar'; +import SignOut from '../../components/SignOut'; +import { auth, signOut } from '../../auth'; + +export default async function HomePage() { + const session = await auth(); -export default function HomePage() { return ( - - Welcome to Toolpad! + + + Welcome to Toolpad, {session?.user?.name || 'User'}! + ); } diff --git a/playground/nextjs/src/app/signout/page.tsx b/playground/nextjs/src/app/signout/page.tsx deleted file mode 100644 index 26502982f2d..00000000000 --- a/playground/nextjs/src/app/signout/page.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from 'react'; -import { signOut } from '../../auth.ts'; -import { Container, Box, Typography } from '@mui/material'; -import { LoadingButton } from '@mui/lab'; - -export default function SignOutPage() { - return ( - - - - Sign out - - - You will be redirected to the home page. - - -
{ - 'use server'; - await signOut({ redirectTo: '/signin' }); - }} - > - - Sign out - -
-
-
- ); -} diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 1d95d8de942..a5777cc4d34 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -4,8 +4,8 @@ import type { Provider } from 'next-auth/providers'; const providers: Provider[] = [ GitHub({ - clientId: process.env.TOOLPAD_GITHUB_CLIENT_ID, - clientSecret: process.env.TOOLPAD_GITHUB_CLIENT_SECRET, + clientId: process.env.TOOLPAD_AUTH_GITHUB_CLIENT_ID, + clientSecret: process.env.TOOLPAD_AUTH_GITHUB_CLIENT_SECRET, }), ]; diff --git a/playground/nextjs/src/components/SignOut.tsx b/playground/nextjs/src/components/SignOut.tsx new file mode 100644 index 00000000000..d1848801e25 --- /dev/null +++ b/playground/nextjs/src/components/SignOut.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { signOut } from '../auth'; +import LoadingButton from '@mui/lab/LoadingButton'; + +export default async function SignOut() { + return ( +
{ + 'use server'; + await signOut({ redirectTo: '/signin' }); + }} + > + + Sign out + +
+ ); +} From 334288be1b13c72c5d2ae6a22a23ceee0e3e7f24 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 13 Jun 2024 20:41:54 +0530 Subject: [PATCH 003/109] fix: Lint --- .../nextjs/src/app/(auth)/auth-error/page.tsx | 8 +++---- .../nextjs/src/app/(auth)/signin/page.tsx | 22 ++++++------------- .../nextjs/src/app/(dashboard)/page.tsx | 3 +-- .../src/app/api/auth/[...nextauth]/route.ts | 1 + playground/nextjs/src/auth.ts | 3 +-- playground/nextjs/src/components/SignOut.tsx | 2 +- .../nextjs/src/components/UserAvatar.tsx | 6 +++-- 7 files changed, 19 insertions(+), 26 deletions(-) diff --git a/playground/nextjs/src/app/(auth)/auth-error/page.tsx b/playground/nextjs/src/app/(auth)/auth-error/page.tsx index eaccf01a3d1..d074023e27b 100644 --- a/playground/nextjs/src/app/(auth)/auth-error/page.tsx +++ b/playground/nextjs/src/app/(auth)/auth-error/page.tsx @@ -4,9 +4,9 @@ import * as React from 'react'; import { Container, Box, Typography, Button } from '@mui/material'; import { useSearchParams } from 'next/navigation'; -enum Error { - Configuration = 'Configuration', -} +const Error = { + Configuration: 'Configuration', +}; const errorMap = { [Error.Configuration]: ( @@ -20,7 +20,7 @@ const errorMap = { export default function AuthErrorPage() { const search = useSearchParams(); - const error = search.get('error') as Error; + const error = search.get('error') || Error.Configuration; return ( ([ - ['github', ], - ['credentials', ], + ['github', ], + ['credentials', ], [ 'google', - Google logo { if (typeof provider === 'function') { const providerData = provider(); return { id: providerData.id, name: providerData.name }; - } else { - return { id: provider.id, name: provider.name }; } + return { id: provider.id, name: provider.name }; }); export const { handlers, auth, signIn, signOut } = NextAuth({ diff --git a/playground/nextjs/src/components/SignOut.tsx b/playground/nextjs/src/components/SignOut.tsx index d1848801e25..f391ab7330a 100644 --- a/playground/nextjs/src/components/SignOut.tsx +++ b/playground/nextjs/src/components/SignOut.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { signOut } from '../auth'; import LoadingButton from '@mui/lab/LoadingButton'; +import { signOut } from '../auth'; export default async function SignOut() { return ( diff --git a/playground/nextjs/src/components/UserAvatar.tsx b/playground/nextjs/src/components/UserAvatar.tsx index 01f9388cc39..0108d0f5936 100644 --- a/playground/nextjs/src/components/UserAvatar.tsx +++ b/playground/nextjs/src/components/UserAvatar.tsx @@ -1,11 +1,13 @@ import * as React from 'react'; -import { auth } from '../auth'; import Avatar from '@mui/material/Avatar'; +import { auth } from '../auth'; export default async function UserAvatar() { const session = await auth(); - if (!session || !session.user) return null; + if (!session || !session.user) { + return null; + } return (
From d1399c01be98437ec56399131f41cb06aa0973be Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 13 Jun 2024 21:17:04 +0530 Subject: [PATCH 004/109] fix: Missed --- playground/nextjs/src/auth.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 1bae46a1429..1a95b420504 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -23,5 +23,6 @@ export const { handlers, auth, signIn, signOut } = NextAuth({ pages: { signIn: '/signin', signOut: '/signout', + error: '/auth-error', }, }); From d32d986ee49eaa02ab235ee51d22c88da957df98 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 18 Jun 2024 18:31:50 +0200 Subject: [PATCH 005/109] Batch of changes --- .../src/SignInPage/SignInPage.tsx | 173 ++++++++++++++++++ packages/toolpad-core/src/SignInPage/index.ts | 1 + playground/nextjs-pages/package.json | 1 + .../src/app/api/auth/[...nextauth]/route.ts | 3 + playground/nextjs-pages/src/auth.ts | 27 +++ .../nextjs-pages/src/pages/auth/signin.tsx | 28 +++ .../nextjs/src/app/(auth)/signin/page.tsx | 108 ----------- .../nextjs/src/app/(dashboard)/layout.tsx | 10 +- .../app/{(auth) => auth}/auth-error/page.tsx | 0 .../nextjs/src/app/auth/signin/page.tsx | 30 +++ .../src/app/{(auth) => auth}/signout/page.tsx | 0 playground/nextjs/src/app/layout.tsx | 8 +- playground/nextjs/src/auth.ts | 10 +- playground/nextjs/src/components/SignOut.tsx | 2 +- pnpm-lock.yaml | 3 + 15 files changed, 288 insertions(+), 116 deletions(-) create mode 100644 packages/toolpad-core/src/SignInPage/SignInPage.tsx create mode 100644 packages/toolpad-core/src/SignInPage/index.ts create mode 100644 playground/nextjs-pages/src/app/api/auth/[...nextauth]/route.ts create mode 100644 playground/nextjs-pages/src/auth.ts create mode 100644 playground/nextjs-pages/src/pages/auth/signin.tsx delete mode 100644 playground/nextjs/src/app/(auth)/signin/page.tsx rename playground/nextjs/src/app/{(auth) => auth}/auth-error/page.tsx (100%) create mode 100644 playground/nextjs/src/app/auth/signin/page.tsx rename playground/nextjs/src/app/{(auth) => auth}/signout/page.tsx (100%) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx new file mode 100644 index 00000000000..41b2cf3ce70 --- /dev/null +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -0,0 +1,173 @@ +'use client'; + +import * as React from 'react'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import Container from '@mui/material/Container'; +import Divider from '@mui/material/Divider'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Grid from '@mui/material/Grid'; +import Link from '@mui/material/Link'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import LoadingButton from '@mui/lab/LoadingButton'; +import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +import GitHubIcon from '@mui/icons-material/GitHub'; +import PasswordIcon from '@mui/icons-material/Password'; +import Stack from '@mui/material/Stack'; +import { BrandingContext } from '../AppProvider'; + +const IconProviderMap = new Map([ + ['github', ], + ['credentials', ], + [ + 'google', + Google logo, + ], +]); + +const IconBackgroundMap = new Map([ + ['github', '#24292e'], + ['credentials', 'default'], +]); + +export interface AuthProvider { + id: string; + name: string; +} + +export interface SignInPageProps { + providers?: AuthProvider[]; + signIn: (provider: AuthProvider, formData?: FormData) => void; +} + +export function SignInPage({ providers, signIn }: SignInPageProps) { + const branding = React.useContext(BrandingContext); + const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); + return ( + + + + {branding?.logo ?? } + + + Sign in {branding?.title ? `to ${branding.title}` : null} + + + Welcome user, please sign in to continue + + + + {Object.values(providers ?? {}).map((provider) => { + if (provider.id === 'credentials') { + return null; + } + return ( +
{ + signIn(provider); + }} + > + + Sign in with {provider.name} + +
+ ); + })} +
+ + {credentialsProvider ? ( + + or + { + signIn(credentialsProvider, formData); + }} + noValidate + > + + + } + label="Remember me" + /> + + + + + Forgot password? + + + + + {"Don't have an account? Sign Up"} + + + + + + ) : null} +
+
+
+ ); +} diff --git a/packages/toolpad-core/src/SignInPage/index.ts b/packages/toolpad-core/src/SignInPage/index.ts new file mode 100644 index 00000000000..aa485859b44 --- /dev/null +++ b/packages/toolpad-core/src/SignInPage/index.ts @@ -0,0 +1 @@ +export * from './SignInPage'; diff --git a/playground/nextjs-pages/package.json b/playground/nextjs-pages/package.json index 334c6d72ace..70105ba5278 100644 --- a/playground/nextjs-pages/package.json +++ b/playground/nextjs-pages/package.json @@ -12,6 +12,7 @@ "@mui/icons-material": "5.15.20", "@mui/material": "5.15.20", "@mui/material-nextjs": "5.15.11", + "next-auth": "5.0.0-beta.19", "@toolpad/core": "workspace:*", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", diff --git a/playground/nextjs-pages/src/app/api/auth/[...nextauth]/route.ts b/playground/nextjs-pages/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 00000000000..ca225652075 --- /dev/null +++ b/playground/nextjs-pages/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,3 @@ +import { handlers } from '../../../../auth'; + +export const { GET, POST } = handlers; diff --git a/playground/nextjs-pages/src/auth.ts b/playground/nextjs-pages/src/auth.ts new file mode 100644 index 00000000000..1c4e50ca1c7 --- /dev/null +++ b/playground/nextjs-pages/src/auth.ts @@ -0,0 +1,27 @@ +import NextAuth from 'next-auth'; +import GitHub from 'next-auth/providers/github'; +import type { Provider } from 'next-auth/providers'; + +const providers: Provider[] = [ + GitHub({ + clientId: process.env.AUTH_GITHUB_ID, + clientSecret: process.env.AUTH_GITHUB_SECRET, + }), +]; + +export const providerMap = providers.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } + return { id: provider.id, name: provider.name }; +}); + +export const { handlers, auth, signIn, signOut } = NextAuth({ + providers, + secret: process.env.AUTH_SECRET, + pages: { + signIn: '/auth/signin', + signOut: '/auth/signout', + }, +}); diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx new file mode 100644 index 00000000000..4be4bb009eb --- /dev/null +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; +import type { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next'; +import { signIn } from 'next-auth/react'; +import { SignInPage } from '@toolpad/core/SignInPage'; +import { auth, providerMap } from '../../auth'; + +export default function SignIn({ + providers, +}: InferGetServerSidePropsType) { + return signIn(provider.id)} />; +} + +export async function getServerSideProps(context: GetServerSidePropsContext) { + const session = await auth(context); + + // If the user is already logged in, redirect. + // Note: Make sure not to redirect to the same page + // To avoid an infinite loop! + if (session) { + return { redirect: { destination: '/' } }; + } + + return { + props: { + providers: providerMap, + }, + }; +} diff --git a/playground/nextjs/src/app/(auth)/signin/page.tsx b/playground/nextjs/src/app/(auth)/signin/page.tsx deleted file mode 100644 index a3bfd7ac70c..00000000000 --- a/playground/nextjs/src/app/(auth)/signin/page.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import * as React from 'react'; -import { redirect } from 'next/navigation'; -import { Avatar, Box, Container, Typography } from '@mui/material'; -import { LoadingButton } from '@mui/lab'; -import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; -import GitHubIcon from '@mui/icons-material/GitHub'; -import PasswordIcon from '@mui/icons-material/Password'; -import { AuthError } from 'next-auth'; -import Image from 'next/image'; -import { signIn, providerMap } from '../../../auth'; -// import { AuthContext } from '../../AuthContext'; - -const IconProviderMap = new Map([ - ['github', ], - ['credentials', ], - [ - 'google', - Google logo, - ], -]); - -const IconBackgroundMap = new Map([ - ['github', '#24292e'], - ['credentials', 'default'], -]); - -export default function SignInPage() { - return ( - - - - - - - Sign in - - - with one of the following providers: - -
- {providerMap.map((provider) => ( -
{ - 'use server'; - try { - await signIn(provider.id, { redirectTo: '/' }); - } catch (error) { - // Signin can fail for a number of reasons, such as the user - // not existing, or the user not having the correct role. - if (error instanceof AuthError) { - redirect(`/auth-error?error=${error.type}`); - } - // Otherwise if a redirects happens NextJS can handle it - // so you can just re-throw the error and let NextJS handle it. - // Docs: - // https://nextjs.org/docs/app/api-reference/functions/redirect#server-component - throw error; - } - }} - > - - Sign in with {provider.name} - -
- ))} -
-
-
- ); -} diff --git a/playground/nextjs/src/app/(dashboard)/layout.tsx b/playground/nextjs/src/app/(dashboard)/layout.tsx index cf4e6b4dd8f..56135cddd61 100644 --- a/playground/nextjs/src/app/(dashboard)/layout.tsx +++ b/playground/nextjs/src/app/(dashboard)/layout.tsx @@ -1,6 +1,14 @@ import * as React from 'react'; import { DashboardLayout } from '@toolpad/core/DashboardLayout'; +import { redirect } from 'next/navigation'; +import { auth } from '../../auth'; + +export default async function DashboardPagesLayout(props: { children: React.ReactNode }) { + const session = await auth(); + + if (!session) { + redirect('/auth/signin'); + } -export default function DashboardPagesLayout(props: { children: React.ReactNode }) { return {props.children}; } diff --git a/playground/nextjs/src/app/(auth)/auth-error/page.tsx b/playground/nextjs/src/app/auth/auth-error/page.tsx similarity index 100% rename from playground/nextjs/src/app/(auth)/auth-error/page.tsx rename to playground/nextjs/src/app/auth/auth-error/page.tsx diff --git a/playground/nextjs/src/app/auth/signin/page.tsx b/playground/nextjs/src/app/auth/signin/page.tsx new file mode 100644 index 00000000000..29a33d00216 --- /dev/null +++ b/playground/nextjs/src/app/auth/signin/page.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { redirect } from 'next/navigation'; +import { AuthError } from 'next-auth'; +import { SignInPage } from '@toolpad/core/SignInPage'; +import { providerMap, signIn } from '../../../auth'; + +export default async function SignIn() { + return ( + { + 'use server'; + try { + await signIn(provider.id, { redirectTo: '/' }); + } catch (error) { + // Signin can fail for a number of reasons, such as the user + // not existing, or the user not having the correct role. + if (error instanceof AuthError) { + redirect(`/auth-error?error=${error.type}`); + } + // Otherwise if a redirects happens NextJS can handle it + // so you can just re-throw the error and let NextJS handle it. + // Docs: + // https://nextjs.org/docs/app/api-reference/functions/redirect#server-component + throw error; + } + }} + /> + ); +} diff --git a/playground/nextjs/src/app/(auth)/signout/page.tsx b/playground/nextjs/src/app/auth/signout/page.tsx similarity index 100% rename from playground/nextjs/src/app/(auth)/signout/page.tsx rename to playground/nextjs/src/app/auth/signout/page.tsx diff --git a/playground/nextjs/src/app/layout.tsx b/playground/nextjs/src/app/layout.tsx index 91843f848d7..40d102acb43 100644 --- a/playground/nextjs/src/app/layout.tsx +++ b/playground/nextjs/src/app/layout.tsx @@ -22,12 +22,18 @@ const NAVIGATION: Navigation = [ }, ]; +const BRANDING = { + title: 'My Toolpad Core App', +}; + export default function RootLayout(props: { children: React.ReactNode }) { return ( - {props.children} + + {props.children} + diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 1bae46a1429..1c4e50ca1c7 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -4,8 +4,8 @@ import type { Provider } from 'next-auth/providers'; const providers: Provider[] = [ GitHub({ - clientId: process.env.TOOLPAD_AUTH_GITHUB_CLIENT_ID, - clientSecret: process.env.TOOLPAD_AUTH_GITHUB_CLIENT_SECRET, + clientId: process.env.AUTH_GITHUB_ID, + clientSecret: process.env.AUTH_GITHUB_SECRET, }), ]; @@ -19,9 +19,9 @@ export const providerMap = providers.map((provider) => { export const { handlers, auth, signIn, signOut } = NextAuth({ providers, - secret: process.env.TOOLPAD_AUTH_SECRET, + secret: process.env.AUTH_SECRET, pages: { - signIn: '/signin', - signOut: '/signout', + signIn: '/auth/signin', + signOut: '/auth/signout', }, }); diff --git a/playground/nextjs/src/components/SignOut.tsx b/playground/nextjs/src/components/SignOut.tsx index f391ab7330a..ae77b45fc5e 100644 --- a/playground/nextjs/src/components/SignOut.tsx +++ b/playground/nextjs/src/components/SignOut.tsx @@ -7,7 +7,7 @@ export default async function SignOut() {
{ 'use server'; - await signOut({ redirectTo: '/signin' }); + await signOut({ redirectTo: '/' }); }} > Date: Wed, 19 Jun 2024 13:09:25 -0700 Subject: [PATCH 006/109] fix: Broken merge --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78080acc08d..ce4cfce900e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10011,7 +10011,7 @@ snapshots: '@panva/hkdf': 1.1.1 '@types/cookie': 0.6.0 cookie: 0.6.0 - jose: 5.3.0 + jose: 5.2.4 oauth4webapi: 2.10.4 preact: 10.11.3 preact-render-to-string: 5.2.3(preact@10.11.3) From 0fc1812e35a90a949e2294c134694ac9e11d3890 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 19 Jun 2024 14:03:31 -0700 Subject: [PATCH 007/109] fix: Rename `auth-error` to `auth/error` --- playground/nextjs/src/app/auth/{auth-error => error}/page.tsx | 0 playground/nextjs/src/app/auth/signin/page.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename playground/nextjs/src/app/auth/{auth-error => error}/page.tsx (100%) diff --git a/playground/nextjs/src/app/auth/auth-error/page.tsx b/playground/nextjs/src/app/auth/error/page.tsx similarity index 100% rename from playground/nextjs/src/app/auth/auth-error/page.tsx rename to playground/nextjs/src/app/auth/error/page.tsx diff --git a/playground/nextjs/src/app/auth/signin/page.tsx b/playground/nextjs/src/app/auth/signin/page.tsx index 29a33d00216..db8170b8453 100644 --- a/playground/nextjs/src/app/auth/signin/page.tsx +++ b/playground/nextjs/src/app/auth/signin/page.tsx @@ -16,7 +16,7 @@ export default async function SignIn() { // Signin can fail for a number of reasons, such as the user // not existing, or the user not having the correct role. if (error instanceof AuthError) { - redirect(`/auth-error?error=${error.type}`); + redirect(`/auth/error?error=${error.type}`); } // Otherwise if a redirects happens NextJS can handle it // so you can just re-throw the error and let NextJS handle it. From 39272e998e94e25c9f6cc342ee0f780910c81a4e Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 19 Jun 2024 14:44:25 -0700 Subject: [PATCH 008/109] fix: Style changes for Credentials form --- .../src/SignInPage/SignInPage.tsx | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 41b2cf3ce70..158660d4baf 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -116,7 +116,7 @@ export function SignInPage({ providers, signIn }: SignInPageProps) { {credentialsProvider ? ( - or + or { @@ -125,8 +125,14 @@ export function SignInPage({ providers, signIn }: SignInPageProps) { noValidate > } label="Remember me" + slotProps={{ typography: { color: 'textSecondary' } }} /> - - + Forgot password? - + {"Don't have an account? Sign Up"} From 0ee065cc47d1115627757633ca4b92ba74440b86 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Fri, 21 Jun 2024 09:24:32 -0700 Subject: [PATCH 009/109] fix: CI --- pnpm-lock.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 968cd443772..b951ee0cb42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8426,7 +8426,6 @@ packages: read-package-json@6.0.4: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. Please use @npmcli/package-json instead. read-package-json@7.0.1: resolution: {integrity: sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==} From 3aa4c3b22e59bb6d3cc03d8c8e04e70bd8a9122f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Fri, 21 Jun 2024 09:27:14 -0700 Subject: [PATCH 010/109] fix: Add prop-types for docs --- .../src/SignInPage/SignInPage.tsx | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 158660d4baf..68a7856de20 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -1,6 +1,7 @@ 'use client'; import * as React from 'react'; +import PropTypes from 'prop-types'; import Avatar from '@mui/material/Avatar'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -51,7 +52,7 @@ export interface SignInPageProps { signIn: (provider: AuthProvider, formData?: FormData) => void; } -export function SignInPage({ providers, signIn }: SignInPageProps) { +function SignInPage({ providers, signIn }: SignInPageProps) { const branding = React.useContext(BrandingContext); const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); return ( @@ -200,3 +201,25 @@ export function SignInPage({ providers, signIn }: SignInPageProps) { ); } + +SignInPage.propTypes /* remove-proptypes */ = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * @ignore + */ + providers: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + }), + ), + /** + * @ignore + */ + signIn: PropTypes.func.isRequired, +} as any; + +export { SignInPage }; From 53ae9b7c474d8cdad82e7b77a52cc30f0bf2e54f Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:02:28 +0200 Subject: [PATCH 011/109] WIP --- .browserslistrc | 94 +++++++++++++++++++ packages/toolpad-core/package.json | 4 +- .../src/AppProvider/AppProvider.tsx | 12 ++- .../src/SignInPage/SignInPage.tsx | 3 +- playground/nextjs-pages/next-env.d.ts | 1 + playground/nextjs-pages/src/pages/_app.tsx | 15 ++- .../nextjs-pages/src/pages/auth/signin.tsx | 4 + playground/nextjs-pages/tsconfig.json | 24 ++++- playground/nextjs/src/app/layout.tsx | 7 +- 9 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 .browserslistrc diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000000..6702d13439b --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,94 @@ +[modern] +last 1 chrome version +last 1 edge version +last 1 firefox version +last 1 safari version +node 14 + +# Default/Fallback +# `npx browserslist --mobile-to-desktop "> 0.5%, last 2 versions, Firefox ESR, not dead, safari >= 15.4, iOS >= 15.4"` when the last major is released. +# Explicit safari versions are here based on the agreed terms in: https://github.com/mui/material-ui/issues/40958#issuecomment-1953215043 +# +# After you update the version, you might need to run `npx update-browserslist-db@latest` to update caniuse-lite to gather latest browser versions. +# Otherwise, running `pnpm build` might fail due to unknown browser versions. +# +# On update, sync references where "#stable-snapshot" is mentioned in the codebase. +[stable] +and_chr 122 +and_chr 121 +and_ff 123 +and_ff 122 +and_qq 14.9 +and_uc 15.5 +android 122 +android 121 +chrome 122 +chrome 121 +chrome 120 +chrome 119 +chrome 109 +edge 122 +edge 121 +firefox 123 +firefox 122 +firefox 115 +ios_saf 17.4 +ios_saf 17.3 +ios_saf 17.2 +ios_saf 17.1 +ios_saf 17.0 +ios_saf 16.6-16.7 +ios_saf 16.5 +ios_saf 16.4 +ios_saf 16.3 +ios_saf 16.2 +ios_saf 16.1 +ios_saf 16.0 +ios_saf 15.6-15.8 +ios_saf 15.5 +ios_saf 15.4 +kaios 3.0-3.1 +kaios 2.5 +op_mini all +op_mob 80 +opera 108 +opera 107 +opera 106 +safari 17.4 +safari 17.3 +safari 17.2 +safari 17.1 +safari 17.0 +safari 16.6 +safari 16.5 +safari 16.4 +safari 16.3 +safari 16.2 +safari 16.1 +safari 16.0 +safari 15.6 +safari 15.5 +safari 15.4 +samsung 23 +samsung 22 + +# snapshot of `npx browserslist "maintained node versions"` +# On update check all #stable-snapshot markers +[node] +node 12.0 + +# same as `node` +[coverage] +node 12.0 + +# same as `node` +[development] +node 12.0 + +# same as `node` +[test] +node 12.0 + +# same as `node` +[benchmark] +node 12.0 \ No newline at end of file diff --git a/packages/toolpad-core/package.json b/packages/toolpad-core/package.json index 6423bb78f9c..3b6b83c3337 100644 --- a/packages/toolpad-core/package.json +++ b/packages/toolpad-core/package.json @@ -35,13 +35,13 @@ }, "homepage": "https://github.com/mui/mui-toolpad#readme", "scripts": { + "prebuild": "rimraf ./build", "build": "pnpm prebuild && pnpm build:node && pnpm build:stable && pnpm build:types && pnpm build:copy-files", "build:node": "node ../../scripts/build.mjs node", "build:stable": "node ../../scripts/build.mjs stable", "build:copy-files": "node ../../scripts/copyFiles.mjs", "build:types": "tsc -b tsconfig.build.json", - "prebuild": "rimraf build tsconfig.build.tsbuildinfo", - "dev": "concurrently \"pnpm build:stable --watch\" \"pnpm build:types --watch --preserveWatchOutput\"", + "dev": "pnpm prebuild && concurrently \"pnpm build:stable --watch\" \"pnpm build:types --watch --preserveWatchOutput\"", "check-types": "tsc --noEmit", "test": "vitest run --coverage", "test:dev": "vitest", diff --git a/packages/toolpad-core/src/AppProvider/AppProvider.tsx b/packages/toolpad-core/src/AppProvider/AppProvider.tsx index 3a12193605d..ca7fadef2db 100644 --- a/packages/toolpad-core/src/AppProvider/AppProvider.tsx +++ b/packages/toolpad-core/src/AppProvider/AppProvider.tsx @@ -50,6 +50,12 @@ export type NavigationItem = NavigationPageItem | NavigationSubheaderItem | Navi export type Navigation = NavigationItem[]; +export interface Session { + user?: { + name?: string | null; + }; +} + // TODO: hide these contexts from public API export const BrandingContext = React.createContext(null); @@ -73,7 +79,7 @@ export interface AppProviderProps { */ branding?: Branding | null; /** - * Navigation definition for the app. + * Navigation definition for the app. * @default [] */ navigation?: Navigation; @@ -83,6 +89,10 @@ export interface AppProviderProps { * @default null */ router?: Router; + /** + * Session info about the current user. + */ + session?: Session | null; } /** diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 68a7856de20..3b5100b0c6e 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -55,6 +55,7 @@ export interface SignInPageProps { function SignInPage({ providers, signIn }: SignInPageProps) { const branding = React.useContext(BrandingContext); const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); + return ( { + onSubmit={() => { signIn(provider); }} > diff --git a/playground/nextjs-pages/next-env.d.ts b/playground/nextjs-pages/next-env.d.ts index 4f11a03dc6c..fd36f9494e2 100644 --- a/playground/nextjs-pages/next-env.d.ts +++ b/playground/nextjs-pages/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/playground/nextjs-pages/src/pages/_app.tsx b/playground/nextjs-pages/src/pages/_app.tsx index 0d961ed4f33..f3d52798f3a 100644 --- a/playground/nextjs-pages/src/pages/_app.tsx +++ b/playground/nextjs-pages/src/pages/_app.tsx @@ -34,21 +34,32 @@ const NAVIGATION: Navigation = [ }, ]; +const BRANDING = { + title: 'My Toolpad Core App', +}; + function getDefaultLayout(page: React.ReactElement) { return {page}; } export default function App(props: AppPropsWithLayout) { - const { Component, pageProps } = props; + const { + Component, + pageProps: { session, ...pageProps }, + } = props; const getLayout = Component.getLayout ?? getDefaultLayout; + console.log('session', session); + return ( - {getLayout()} + + {getLayout()} + ); } diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index 4be4bb009eb..b904dd7a178 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -10,6 +10,10 @@ export default function SignIn({ return signIn(provider.id)} />; } +SignIn.getLayout = function getLayout(page: React.ReactNode) { + return page; +}; + export async function getServerSideProps(context: GetServerSidePropsContext) { const session = await auth(context); diff --git a/playground/nextjs-pages/tsconfig.json b/playground/nextjs-pages/tsconfig.json index a263842bf38..2b5ac85f8d5 100644 --- a/playground/nextjs-pages/tsconfig.json +++ b/playground/nextjs-pages/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,8 +15,20 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/playground/nextjs/src/app/layout.tsx b/playground/nextjs/src/app/layout.tsx index 40d102acb43..6f9b005727d 100644 --- a/playground/nextjs/src/app/layout.tsx +++ b/playground/nextjs/src/app/layout.tsx @@ -4,6 +4,7 @@ import { AppRouterCacheProvider } from '@mui/material-nextjs/v14-appRouter'; import DashboardIcon from '@mui/icons-material/Dashboard'; import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; import type { Navigation } from '@toolpad/core'; +import { auth } from '../auth'; const NAVIGATION: Navigation = [ { @@ -26,12 +27,14 @@ const BRANDING = { title: 'My Toolpad Core App', }; -export default function RootLayout(props: { children: React.ReactNode }) { +export default async function RootLayout(props: { children: React.ReactNode }) { + const session = await auth(); + return ( - + {props.children} From bab132052e8539e022887d28ec127392bd13b7ab Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 25 Jun 2024 12:20:26 +0200 Subject: [PATCH 012/109] fix auth in pages router --- .../src/SignInPage/SignInPage.tsx | 7 +++- playground/nextjs-pages/src/pages/_app.tsx | 41 +++++++++++++++---- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 3b5100b0c6e..16813eaa890 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -84,7 +84,8 @@ function SignInPage({ providers, signIn }: SignInPageProps) { return ( { + onSubmit={(event) => { + event.preventDefault(); signIn(provider); }} > @@ -121,7 +122,9 @@ function SignInPage({ providers, signIn }: SignInPageProps) { or { + onSubmit={(event) => { + event.preventDefault(); + const formData = new FormData(event.currentTarget); signIn(credentialsProvider, formData); }} noValidate diff --git a/playground/nextjs-pages/src/pages/_app.tsx b/playground/nextjs-pages/src/pages/_app.tsx index f3d52798f3a..613616018d7 100644 --- a/playground/nextjs-pages/src/pages/_app.tsx +++ b/playground/nextjs-pages/src/pages/_app.tsx @@ -1,3 +1,4 @@ +import * as React from 'react'; import { AppProvider } from '@toolpad/core/nextjs'; import { DashboardLayout } from '@toolpad/core/DashboardLayout'; import Head from 'next/head'; @@ -5,12 +6,13 @@ import { AppCacheProvider } from '@mui/material-nextjs/v14-pagesRouter'; import DashboardIcon from '@mui/icons-material/Dashboard'; import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; import type { NextPage } from 'next'; - import type { AppProps } from 'next/app'; import type { Navigation } from '@toolpad/core'; +import { SessionProvider, useSession } from 'next-auth/react'; export type NextPageWithLayout

= NextPage & { getLayout?: (page: React.ReactElement) => React.ReactNode; + requireAuth?: boolean; }; type AppPropsWithLayout = AppProps & { @@ -42,6 +44,30 @@ function getDefaultLayout(page: React.ReactElement) { return {page}; } +function RequireAuth({ children }: { children: React.ReactNode }) { + const { status } = useSession({ required: true }); + + if (status === 'loading') { + return

Loading...
; + } + + return children; +} + +function AppLayout({ children }: { children: React.ReactNode }) { + const { data: session } = useSession(); + return ( + + + + + + {children} + + + ); +} + export default function App(props: AppPropsWithLayout) { const { Component, @@ -49,17 +75,16 @@ export default function App(props: AppPropsWithLayout) { } = props; const getLayout = Component.getLayout ?? getDefaultLayout; + const requireAuth = Component.requireAuth ?? true; - console.log('session', session); + let pageContent = {getLayout()}; + if (requireAuth) { + pageContent = {pageContent}; + } return ( - - - - - {getLayout()} - + {pageContent} ); } From 3e93ab7182c548d885e94c8434bd64fe6cda24cf Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:51:30 +0200 Subject: [PATCH 013/109] User flow --- .../src/AppProvider/AppProvider.tsx | 56 ++++++++--- .../src/DashboardLayout/DashboardLayout.tsx | 2 + packages/toolpad-core/src/User/User.tsx | 92 +++++++++++++++++++ packages/toolpad-core/src/User/index.ts | 1 + playground/nextjs-pages/src/pages/_app.tsx | 14 ++- .../nextjs-pages/src/pages/auth/signin.tsx | 6 +- .../nextjs/src/app/(dashboard)/page.tsx | 4 - playground/nextjs/src/app/layout.tsx | 23 ++++- playground/nextjs/src/components/SignOut.tsx | 37 -------- .../nextjs/src/components/UserAvatar.tsx | 17 ---- 10 files changed, 171 insertions(+), 81 deletions(-) create mode 100644 packages/toolpad-core/src/User/User.tsx create mode 100644 packages/toolpad-core/src/User/index.ts delete mode 100644 playground/nextjs/src/components/SignOut.tsx delete mode 100644 playground/nextjs/src/components/UserAvatar.tsx diff --git a/packages/toolpad-core/src/AppProvider/AppProvider.tsx b/packages/toolpad-core/src/AppProvider/AppProvider.tsx index ca7fadef2db..0a545713751 100644 --- a/packages/toolpad-core/src/AppProvider/AppProvider.tsx +++ b/packages/toolpad-core/src/AppProvider/AppProvider.tsx @@ -52,10 +52,18 @@ export type Navigation = NavigationItem[]; export interface Session { user?: { + id?: string | null; name?: string | null; + image?: string | null; + email?: string | null; }; } +export interface Authentication { + signIn: () => void; + signOut: () => void; +} + // TODO: hide these contexts from public API export const BrandingContext = React.createContext(null); @@ -63,6 +71,10 @@ export const NavigationContext = React.createContext([]); export const RouterContext = React.createContext(null); +export const SessionContext = React.createContext(null); + +export const AutheticationContext = React.createContext(null); + export interface AppProviderProps { /** * The content of the app provider. @@ -93,6 +105,10 @@ export interface AppProviderProps { * Session info about the current user. */ session?: Session | null; + /** + * Authentication methods. + */ + authentication?: Authentication | null; } /** @@ -107,21 +123,35 @@ export interface AppProviderProps { * - [AppProvider API](https://mui.com/toolpad/core/api/app-provider) */ function AppProvider(props: AppProviderProps) { - const { children, theme = baseTheme, branding = null, navigation = [], router = null } = props; + const { + children, + theme = baseTheme, + branding = null, + navigation = [], + router = null, + session = null, + authentication = null, + } = props; return ( - - - - - - - {children} - - - - - + + + + + + + + + + {children} + + + + + + + + ); } diff --git a/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx b/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx index d7b8a46f1e3..9819e16ca13 100644 --- a/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx +++ b/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx @@ -18,6 +18,7 @@ import Toolbar from '@mui/material/Toolbar'; import Typography from '@mui/material/Typography'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import { User } from '../User'; import { BrandingContext, Navigation, @@ -226,6 +227,7 @@ function DashboardLayout(props: DashboardLayoutProps) { + + ); +} + +export function User() { + const session = React.useContext(SessionContext); + + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const popoverId = React.useId(); + const id = open ? popoverId : undefined; + + const authentication = React.useContext(AutheticationContext); + + if (!session?.user) { + return null; + } + + return ( + + + + + + + + + + {session.user.name} + {session.user.email} + + + + + + + + + + ); +} diff --git a/packages/toolpad-core/src/User/index.ts b/packages/toolpad-core/src/User/index.ts new file mode 100644 index 00000000000..f6b9f36c6e1 --- /dev/null +++ b/packages/toolpad-core/src/User/index.ts @@ -0,0 +1 @@ +export * from './User'; diff --git a/playground/nextjs-pages/src/pages/_app.tsx b/playground/nextjs-pages/src/pages/_app.tsx index 613616018d7..274f5d8c045 100644 --- a/playground/nextjs-pages/src/pages/_app.tsx +++ b/playground/nextjs-pages/src/pages/_app.tsx @@ -8,7 +8,7 @@ import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; import type { NextPage } from 'next'; import type { AppProps } from 'next/app'; import type { Navigation } from '@toolpad/core'; -import { SessionProvider, useSession } from 'next-auth/react'; +import { SessionProvider, signIn, signOut, useSession } from 'next-auth/react'; export type NextPageWithLayout

= NextPage & { getLayout?: (page: React.ReactElement) => React.ReactNode; @@ -40,6 +40,11 @@ const BRANDING = { title: 'My Toolpad Core App', }; +const AUTHENTICATION = { + signIn, + signOut, +}; + function getDefaultLayout(page: React.ReactElement) { return {page}; } @@ -61,7 +66,12 @@ function AppLayout({ children }: { children: React.ReactNode }) { - + {children} diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index b904dd7a178..8fb1242093d 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -10,9 +10,9 @@ export default function SignIn({ return signIn(provider.id)} />; } -SignIn.getLayout = function getLayout(page: React.ReactNode) { - return page; -}; +SignIn.getLayout = (page: React.ReactNode) => page; + +SignIn.requireAuth = false; export async function getServerSideProps(context: GetServerSidePropsContext) { const session = await auth(context); diff --git a/playground/nextjs/src/app/(dashboard)/page.tsx b/playground/nextjs/src/app/(dashboard)/page.tsx index e975320995a..90c19cf0844 100644 --- a/playground/nextjs/src/app/(dashboard)/page.tsx +++ b/playground/nextjs/src/app/(dashboard)/page.tsx @@ -1,8 +1,6 @@ import * as React from 'react'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; -import UserAvatar from '../../components/UserAvatar'; -import SignOut from '../../components/SignOut'; import { auth } from '../../auth'; export default async function HomePage() { @@ -18,11 +16,9 @@ export default async function HomePage() { alignItems: 'center', }} > - Welcome to Toolpad, {session?.user?.name || 'User'}! - ); } diff --git a/playground/nextjs/src/app/layout.tsx b/playground/nextjs/src/app/layout.tsx index 6f9b005727d..b3697d10a80 100644 --- a/playground/nextjs/src/app/layout.tsx +++ b/playground/nextjs/src/app/layout.tsx @@ -4,6 +4,7 @@ import { AppRouterCacheProvider } from '@mui/material-nextjs/v14-appRouter'; import DashboardIcon from '@mui/icons-material/Dashboard'; import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; import type { Navigation } from '@toolpad/core'; +import { SessionProvider, signIn, signOut } from 'next-auth/react'; import { auth } from '../auth'; const NAVIGATION: Navigation = [ @@ -27,17 +28,29 @@ const BRANDING = { title: 'My Toolpad Core App', }; +const AUTHENTICATION = { + signIn, + signOut, +}; + export default async function RootLayout(props: { children: React.ReactNode }) { const session = await auth(); return ( - - - {props.children} - - + + + + {props.children} + + + ); diff --git a/playground/nextjs/src/components/SignOut.tsx b/playground/nextjs/src/components/SignOut.tsx deleted file mode 100644 index ae77b45fc5e..00000000000 --- a/playground/nextjs/src/components/SignOut.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import * as React from 'react'; -import LoadingButton from '@mui/lab/LoadingButton'; -import { signOut } from '../auth'; - -export default async function SignOut() { - return ( - { - 'use server'; - await signOut({ redirectTo: '/' }); - }} - > - - Sign out - - - ); -} diff --git a/playground/nextjs/src/components/UserAvatar.tsx b/playground/nextjs/src/components/UserAvatar.tsx deleted file mode 100644 index 0108d0f5936..00000000000 --- a/playground/nextjs/src/components/UserAvatar.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react'; -import Avatar from '@mui/material/Avatar'; -import { auth } from '../auth'; - -export default async function UserAvatar() { - const session = await auth(); - - if (!session || !session.user) { - return null; - } - - return ( -

- -
- ); -} From 536d535389b5706b558cddc12a9e3e45cbe74378 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:08:40 +0200 Subject: [PATCH 014/109] tweaks --- packages/toolpad-core/src/User/User.tsx | 2 +- playground/nextjs-pages/src/pages/_app.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/toolpad-core/src/User/User.tsx b/packages/toolpad-core/src/User/User.tsx index 94bcf56bae9..df312df5543 100644 --- a/packages/toolpad-core/src/User/User.tsx +++ b/packages/toolpad-core/src/User/User.tsx @@ -79,7 +79,7 @@ export function User() { variant="outlined" size="small" color="inherit" - endIcon={} + startIcon={} onClick={authentication?.signOut} > Sign out diff --git a/playground/nextjs-pages/src/pages/_app.tsx b/playground/nextjs-pages/src/pages/_app.tsx index 274f5d8c045..c2312eb8d85 100644 --- a/playground/nextjs-pages/src/pages/_app.tsx +++ b/playground/nextjs-pages/src/pages/_app.tsx @@ -9,6 +9,7 @@ import type { NextPage } from 'next'; import type { AppProps } from 'next/app'; import type { Navigation } from '@toolpad/core'; import { SessionProvider, signIn, signOut, useSession } from 'next-auth/react'; +import LinearProgress from '@mui/material/LinearProgress'; export type NextPageWithLayout

= NextPage & { getLayout?: (page: React.ReactElement) => React.ReactNode; @@ -53,7 +54,7 @@ function RequireAuth({ children }: { children: React.ReactNode }) { const { status } = useSession({ required: true }); if (status === 'loading') { - return

Loading...
; + return ; } return children; @@ -87,10 +88,11 @@ export default function App(props: AppPropsWithLayout) { const getLayout = Component.getLayout ?? getDefaultLayout; const requireAuth = Component.requireAuth ?? true; - let pageContent = {getLayout()}; + let pageContent = getLayout(); if (requireAuth) { pageContent = {pageContent}; } + pageContent = {pageContent}; return ( From 174442cc16fea151e76c560e34fe766020868f51 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:17:00 +0200 Subject: [PATCH 015/109] Add basic test --- package.json | 1 + packages/toolpad-core/src/User/User.test.tsx | 58 +++++++ packages/toolpad-core/src/User/User.tsx | 14 +- packages/toolpad-core/vitest.config.mts | 2 +- pnpm-lock.yaml | 170 ++++++++++++------- 5 files changed, 182 insertions(+), 63 deletions(-) create mode 100644 packages/toolpad-core/src/User/User.test.tsx diff --git a/package.json b/package.json index 6d95ecb5c9d..ea7ebae399b 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "@mui/x-charts": "7.7.0", "@next/eslint-plugin-next": "14.2.4", "@playwright/test": "1.44.1", + "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "16.0.0", "@testing-library/user-event": "14.5.2", "@types/archiver": "6.0.2", diff --git a/packages/toolpad-core/src/User/User.test.tsx b/packages/toolpad-core/src/User/User.test.tsx new file mode 100644 index 00000000000..a6ab920234b --- /dev/null +++ b/packages/toolpad-core/src/User/User.test.tsx @@ -0,0 +1,58 @@ +/// + +/** + * @vitest-environment jsdom + */ + +import * as React from 'react'; +import { describe, test, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { User } from './User'; +import { AppProvider } from '../AppProvider'; + +describe('AppProvider', () => { + test('renders nothing in button when no authentication', async () => { + render(); + + expect(screen.queryByRole('button')).not.toBeInTheDocument(); + }); + + test('renders log in button when no session', async () => { + const auth = { signIn: vi.fn(), signOut: vi.fn() }; + render( + + + , + ); + + const loginButton = screen.getByRole('button', { name: 'Sign In' }); + + await userEvent.click(loginButton); + + expect(auth.signIn).toHaveBeenCalled(); + }); + + test('renders content correctly when tehre is a session', async () => { + const auth = { signIn: vi.fn(), signOut: vi.fn() }; + const session = { user: { name: 'John Doe', email: 'john@example.com' } }; + render( + + + , + ); + + const userButton = screen.getByRole('button', { name: 'Current User' }); + + await userEvent.click(userButton); + + expect(screen.getByText('John Doe')).toBeInTheDocument(); + expect(screen.getByText('john@example.com')).toBeInTheDocument(); + + const signOutButton = screen.getByRole('button', { name: 'Sign Out' }); + + await userEvent.click(signOutButton); + + expect(auth.signOut).toHaveBeenCalled(); + }); +}); diff --git a/packages/toolpad-core/src/User/User.tsx b/packages/toolpad-core/src/User/User.tsx index df312df5543..3b32c60e389 100644 --- a/packages/toolpad-core/src/User/User.tsx +++ b/packages/toolpad-core/src/User/User.tsx @@ -41,13 +41,21 @@ export function User() { const authentication = React.useContext(AutheticationContext); - if (!session?.user) { + if (!authentication) { return null; } + if (!session?.user) { + return ( + + ); + } + return ( - + } onClick={authentication?.signOut} > - Sign out + Sign Out diff --git a/packages/toolpad-core/vitest.config.mts b/packages/toolpad-core/vitest.config.mts index 1013f7aa976..9d010f233f7 100644 --- a/packages/toolpad-core/vitest.config.mts +++ b/packages/toolpad-core/vitest.config.mts @@ -2,7 +2,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { - setupFiles: ['../../test/setupVitest.ts'], + setupFiles: ['../../test/setupVitest.ts', '@testing-library/jest-dom/vitest'], browser: { enabled: false, // enabled through CLI name: 'chromium', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b89228193d1..efa7545d7bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 4.17.5 '@vitest/browser': specifier: beta - version: 2.0.0-beta.11(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.11) + version: 2.0.0-beta.12(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.12) archiver: specifier: 7.0.1 version: 7.0.1 @@ -49,7 +49,7 @@ importers: version: 4.15.7 vitest: specifier: beta - version: 2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0) + version: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) yargs: specifier: 17.7.2 version: 17.7.2 @@ -108,6 +108,9 @@ importers: '@playwright/test': specifier: 1.44.1 version: 1.44.1 + '@testing-library/jest-dom': + specifier: ^6.4.6 + version: 6.4.6(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0)) '@testing-library/react': specifier: 16.0.0 version: 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -140,7 +143,7 @@ importers: version: 7.13.1(eslint@8.57.0)(typescript@5.5.2) '@vitest/coverage-v8': specifier: beta - version: 2.0.0-beta.11(vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0)) + version: 2.0.0-beta.12(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0)) babel-plugin-react-remove-properties: specifier: 0.3.0 version: 0.3.0 @@ -188,7 +191,7 @@ importers: version: 7.34.3(eslint@8.57.0) eslint-plugin-react-compiler: specifier: latest - version: 0.0.0-experimental-51a85ea-20240601(eslint@8.57.0) + version: 0.0.0-experimental-0998c1e-20240625(eslint@8.57.0) eslint-plugin-react-hooks: specifier: 4.6.2 version: 4.6.2(eslint@8.57.0) @@ -251,10 +254,10 @@ importers: version: 2.0.3 vitest-dom: specifier: 0.1.1 - version: 0.1.1(vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0)) + version: 0.1.1(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0)) vitest-fail-on-console: specifier: 0.7.0 - version: 0.7.0(vite@5.3.1(@types/node@20.14.8)(terser@5.31.0))(vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0)) + version: 0.7.0(vite@5.3.1(@types/node@20.14.8)(terser@5.31.0))(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0)) docs: dependencies: @@ -630,7 +633,7 @@ importers: version: 17.0.3 '@vitest/browser': specifier: beta - version: 2.0.0-beta.11(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.11) + version: 2.0.0-beta.12(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.12) next: specifier: ^14.2.4 version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -645,7 +648,7 @@ importers: version: 18.0.0 vitest: specifier: beta - version: 2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0) + version: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) packages/toolpad-studio: dependencies: @@ -1277,6 +1280,9 @@ importers: packages: + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} @@ -3712,6 +3718,27 @@ packages: resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} engines: {node: '>=18'} + '@testing-library/jest-dom@6.4.6': + resolution: {integrity: sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + '@testing-library/react@16.0.0': resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} engines: {node: '>=18'} @@ -4201,12 +4228,12 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/browser@2.0.0-beta.11': - resolution: {integrity: sha512-GRsEo/NrMgw4cQZ7Q+S6NAfh3d7450sLbv6uqY2fKH7w3I/eLMETN3aT4pAQu18uXCql0gvvnsp6yDl8vqnSrQ==} + '@vitest/browser@2.0.0-beta.12': + resolution: {integrity: sha512-q8qYJhry+zrJ9I6RPFBlqpCH71PZv0YSTyAgsd90t2OBCafxA793xamuOmJFngHsviG2sY/5HkBW6cHFhxaVtg==} peerDependencies: playwright: '*' safaridriver: '*' - vitest: 2.0.0-beta.11 + vitest: 2.0.0-beta.12 webdriverio: '*' peerDependenciesMeta: playwright: @@ -4216,25 +4243,25 @@ packages: webdriverio: optional: true - '@vitest/coverage-v8@2.0.0-beta.11': - resolution: {integrity: sha512-Lzxyv/QRF/i0vzjy4ioqugtjbqWuHM13p9UDaAz+tvJ3IgdY589jpra5gFYif4aR7PRP+SYg8S3UfD+DDlSAYQ==} + '@vitest/coverage-v8@2.0.0-beta.12': + resolution: {integrity: sha512-yH+sU8xceBkoxiAvRT5JROByglgdYV7Q8i1gIQYd7VWce+9cX81u9BJUeXSjYIXgEg7orT0IB9I1zUBH0gEwsQ==} peerDependencies: - vitest: 2.0.0-beta.11 + vitest: 2.0.0-beta.12 - '@vitest/expect@2.0.0-beta.11': - resolution: {integrity: sha512-d+VCN21Ln7KkyvfU13K7A27tQk57WDtp05DPf05lozHT4KUv4y5AQYf3Pm8fV5v/8mM16EULm3jT2liEbhlIaA==} + '@vitest/expect@2.0.0-beta.12': + resolution: {integrity: sha512-4AoKb3aZRFzFWGVF6iFHuAjsFH0dydQKzEfT8TfCNzx7+iXtVnLJ5nQUC6D4qlvyEmJeGIbbXZcgiSxY4Ry7eA==} - '@vitest/runner@2.0.0-beta.11': - resolution: {integrity: sha512-g1Dp0PGJf3m6al5vQuOXtKpqqMJuS2KctgzkLJESAG3IOKC36FaJImqNjDclKPPSwrkUSjEyC5XLh7mFG1OqGA==} + '@vitest/runner@2.0.0-beta.12': + resolution: {integrity: sha512-nAerpQvAw1/6vO4vRjOy0A+7IwtktSME3thwUoqWZxMKBgmTzIO2/WevbtFsAwYPc3V8NEY/Erv4PjQt9JTlzQ==} - '@vitest/snapshot@2.0.0-beta.11': - resolution: {integrity: sha512-F3LRgdEy0o3mFea4E9KpPyrYVoHhaXjOyMHz9f4Ie2OFZ89BH+750lX1Hp/69MgLwfaIziQP1NHbxOuAmXYU6g==} + '@vitest/snapshot@2.0.0-beta.12': + resolution: {integrity: sha512-NBqn1rTNQ/e3Dsw8LnniHgeZslgIxg8UvSfje/QV3hJLSoLMLbKLopHmK9T2FQA0hcibAaq/TZVyVrBoX+6aig==} - '@vitest/spy@2.0.0-beta.11': - resolution: {integrity: sha512-2i5DKrHgFvMPb0+2jfOFwrrB5/64Hk2py2BCR/ixHgxgN6u0d75262PY/gD6sdwuSgDzApxgi4lfq8jnVX/h9g==} + '@vitest/spy@2.0.0-beta.12': + resolution: {integrity: sha512-o9Di4HtCMY/81YZr13ozhvkEdF2cI/4VmkOO0rC5s4v1kTcM4PpvkkSut/Cwj5LfeENRQI6JINvDaKNgBPSXhA==} - '@vitest/utils@2.0.0-beta.11': - resolution: {integrity: sha512-97nAwg5UaQdjA0lj0kFdtTd7HrsC8+eKKWsZEZlPdr/nx8MkJmpK2T/1K5hT3/opWBoXCvuYpin/UluyBkYIKg==} + '@vitest/utils@2.0.0-beta.12': + resolution: {integrity: sha512-qjVhzdcGnZeWMOoEDk/wgfuO4f/jcz7MIOpSAr2apxeJoWOZ+4GrV77/3EZ9qBodU4MbXBeHdR5KHdMPfl3kAQ==} '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -4794,6 +4821,10 @@ packages: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.0: resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} engines: {node: '>=10'} @@ -5675,8 +5706,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-react-compiler@0.0.0-experimental-51a85ea-20240601: - resolution: {integrity: sha512-ROiKTVu9pZsNHyJepZj/JULWnkw8+I8+9gOF/MkJ8Q22/9f9MkPQkD2f6FXzVH+iyWbp7DQ3RXKhB3hWhf8AIg==} + eslint-plugin-react-compiler@0.0.0-experimental-0998c1e-20240625: + resolution: {integrity: sha512-npq2RomExoQI3jETs4OrifaygyJYgOcX/q74Q9OC7GmffLh5zSJaQpzjs2fi61NMNkJyIvTBD0C6sKTGGcetOw==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' @@ -8533,6 +8564,7 @@ packages: read-package-json@6.0.4: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. read-package-json@7.0.1: resolution: {integrity: sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q==} @@ -9690,8 +9722,8 @@ packages: victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} - vite-node@2.0.0-beta.11: - resolution: {integrity: sha512-F1tso6UvGiyKNS3IuSB91ZND9VwgcIPfl2HAtQS1gEb+xfwkLsaBRIMgOoTbz8KHKcvZkQWvu0h+z/R01Zkrgw==} + vite-node@2.0.0-beta.12: + resolution: {integrity: sha512-aS07DFW00yJNteJ44bPOSz/Zs25ppIqMElzcydBQv7nKiImnb8N6Rrlg9GQYLJByHLbdJAdxXvDsdruwkPA+kw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -9734,15 +9766,15 @@ packages: vite: '>=4.5.2' vitest: '>=0.26.2' - vitest@2.0.0-beta.11: - resolution: {integrity: sha512-L132Ip5fiOFELHLCPyIK/4O2TNQ//9/TB+X23/lzb8bry2pGHCGirKqxDpPV072xHXr7TciJ6PkGiO7eD+wv8Q==} + vitest@2.0.0-beta.12: + resolution: {integrity: sha512-nqputSJprBdVHgQDg7xUVQigEdC8JOva889jbP0LoHQNA8kN+YzAEdAnYqyUk7ZRMlbtCHO16Ys/cfTBIqDm9A==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.0-beta.11 - '@vitest/ui': 2.0.0-beta.11 + '@vitest/browser': 2.0.0-beta.12 + '@vitest/ui': 2.0.0-beta.12 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -10019,6 +10051,8 @@ packages: snapshots: + '@adobe/css-tools@4.4.0': {} + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) @@ -12881,6 +12915,19 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/jest-dom@6.4.6(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0))': + dependencies: + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.24.7 + aria-query: 5.3.0 + 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: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) + '@testing-library/react@16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -13470,15 +13517,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@2.0.0-beta.11(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.11)': + '@vitest/browser@2.0.0-beta.12(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.12)': dependencies: '@testing-library/dom': 10.1.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) - '@vitest/utils': 2.0.0-beta.11 + '@vitest/utils': 2.0.0-beta.12 magic-string: 0.30.10 msw: 2.3.1(typescript@5.5.2) sirv: 2.0.4 - vitest: 2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) ws: 8.17.1 optionalDependencies: playwright: 1.44.1 @@ -13487,7 +13534,7 @@ snapshots: - typescript - utf-8-validate - '@vitest/coverage-v8@2.0.0-beta.11(vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0))': + '@vitest/coverage-v8@2.0.0-beta.12(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -13502,33 +13549,33 @@ snapshots: std-env: 3.7.0 strip-literal: 2.1.0 test-exclude: 7.0.1 - vitest: 2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) transitivePeerDependencies: - supports-color - '@vitest/expect@2.0.0-beta.11': + '@vitest/expect@2.0.0-beta.12': dependencies: - '@vitest/spy': 2.0.0-beta.11 - '@vitest/utils': 2.0.0-beta.11 + '@vitest/spy': 2.0.0-beta.12 + '@vitest/utils': 2.0.0-beta.12 chai: 5.1.1 - '@vitest/runner@2.0.0-beta.11': + '@vitest/runner@2.0.0-beta.12': dependencies: - '@vitest/utils': 2.0.0-beta.11 + '@vitest/utils': 2.0.0-beta.12 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@2.0.0-beta.11': + '@vitest/snapshot@2.0.0-beta.12': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@2.0.0-beta.11': + '@vitest/spy@2.0.0-beta.12': dependencies: tinyspy: 3.0.0 - '@vitest/utils@2.0.0-beta.11': + '@vitest/utils@2.0.0-beta.12': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -14264,6 +14311,11 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.0: dependencies: ansi-styles: 4.3.0 @@ -15295,7 +15347,7 @@ snapshots: globals: 13.24.0 rambda: 7.5.0 - eslint-plugin-react-compiler@0.0.0-experimental-51a85ea-20240601(eslint@8.57.0): + eslint-plugin-react-compiler@0.0.0-experimental-0998c1e-20240625(eslint@8.57.0): dependencies: '@babel/core': 7.24.7 '@babel/parser': 7.24.7 @@ -19931,7 +19983,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@2.0.0-beta.11(@types/node@20.14.8)(terser@5.31.0): + vite-node@2.0.0-beta.12(@types/node@20.14.8)(terser@5.31.0): dependencies: cac: 6.7.14 debug: 4.3.5 @@ -19958,7 +20010,7 @@ snapshots: fsevents: 2.3.3 terser: 5.31.0 - vitest-dom@0.1.1(vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0)): + vitest-dom@0.1.1(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0)): dependencies: aria-query: 5.3.0 chalk: 5.3.0 @@ -19966,22 +20018,22 @@ snapshots: dom-accessibility-api: 0.6.3 lodash-es: 4.17.21 redent: 4.0.0 - vitest: 2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) - vitest-fail-on-console@0.7.0(vite@5.3.1(@types/node@20.14.8)(terser@5.31.0))(vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0)): + vitest-fail-on-console@0.7.0(vite@5.3.1(@types/node@20.14.8)(terser@5.31.0))(vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0)): dependencies: chalk: 5.3.0 vite: 5.3.1(@types/node@20.14.8)(terser@5.31.0) - vitest: 2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0) + vitest: 2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0) - vitest@2.0.0-beta.11(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.11)(jsdom@24.1.0)(terser@5.31.0): + vitest@2.0.0-beta.12(@types/node@20.14.8)(@vitest/browser@2.0.0-beta.12)(jsdom@24.1.0)(terser@5.31.0): dependencies: '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.0-beta.11 - '@vitest/runner': 2.0.0-beta.11 - '@vitest/snapshot': 2.0.0-beta.11 - '@vitest/spy': 2.0.0-beta.11 - '@vitest/utils': 2.0.0-beta.11 + '@vitest/expect': 2.0.0-beta.12 + '@vitest/runner': 2.0.0-beta.12 + '@vitest/snapshot': 2.0.0-beta.12 + '@vitest/spy': 2.0.0-beta.12 + '@vitest/utils': 2.0.0-beta.12 chai: 5.1.1 debug: 4.3.5 execa: 8.0.1 @@ -19992,11 +20044,11 @@ snapshots: tinybench: 2.8.0 tinypool: 1.0.0 vite: 5.3.1(@types/node@20.14.8)(terser@5.31.0) - vite-node: 2.0.0-beta.11(@types/node@20.14.8)(terser@5.31.0) + vite-node: 2.0.0-beta.12(@types/node@20.14.8)(terser@5.31.0) why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.14.8 - '@vitest/browser': 2.0.0-beta.11(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.11) + '@vitest/browser': 2.0.0-beta.12(playwright@1.44.1)(typescript@5.5.2)(vitest@2.0.0-beta.12) jsdom: 24.1.0 transitivePeerDependencies: - less From 8459f296f39227bb24990a2f6076f1c06f3175b6 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:52:25 +0200 Subject: [PATCH 016/109] Begin docs --- .../dashboard-layout/dashboard-layout.md | 2 +- .../sign-in-page/BasicSignInPage.js | 17 +++++ .../sign-in-page/BasicSignInPage.tsx | 17 +++++ .../sign-in-page/BasicSignInPage.tsx.preview | 4 ++ .../components/sign-in-page/sign-in-page.md | 11 ++++ docs/data/toolpad/core/pages.ts | 4 ++ docs/data/toolpad/core/pagesApi.js | 2 + docs/pages/toolpad/core/api/app-provider.json | 11 ++++ docs/pages/toolpad/core/api/sign-in-page.js | 23 +++++++ docs/pages/toolpad/core/api/sign-in-page.json | 14 +++++ docs/pages/toolpad/core/api/user.js | 19 ++++++ docs/pages/toolpad/core/api/user.json | 16 +++++ .../toolpad/core/react-sign-in-page/index.js | 7 +++ .../api-docs/app-provider/app-provider.json | 4 +- .../api-docs/sign-in-page/sign-in-page.json | 1 + docs/translations/api-docs/user/user.json | 1 + .../src/AppProvider/AppProvider.tsx | 24 ++++++- .../src/SignInPage/SignInPage.tsx | 11 +++- .../toolpad-core/src/User/SessionAvatar.tsx | 21 +++++++ packages/toolpad-core/src/User/User.test.tsx | 5 ++ packages/toolpad-core/src/User/User.tsx | 29 ++++----- packages/toolpad-core/src/index.ts | 4 ++ playground/nextjs/src/app/auth/error/page.tsx | 62 ------------------- .../nextjs/src/app/auth/signout/page.tsx | 26 -------- playground/nextjs/src/auth.ts | 1 - 25 files changed, 227 insertions(+), 109 deletions(-) create mode 100644 docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx create mode 100644 docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview create mode 100644 docs/data/toolpad/core/components/sign-in-page/sign-in-page.md create mode 100644 docs/pages/toolpad/core/api/sign-in-page.js create mode 100644 docs/pages/toolpad/core/api/sign-in-page.json create mode 100644 docs/pages/toolpad/core/api/user.js create mode 100644 docs/pages/toolpad/core/api/user.json create mode 100644 docs/pages/toolpad/core/react-sign-in-page/index.js create mode 100644 docs/translations/api-docs/sign-in-page/sign-in-page.json create mode 100644 docs/translations/api-docs/user/user.json create mode 100644 packages/toolpad-core/src/User/SessionAvatar.tsx delete mode 100644 playground/nextjs/src/app/auth/error/page.tsx delete mode 100644 playground/nextjs/src/app/auth/signout/page.tsx diff --git a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md index af87d97cac4..13f5b17dbdd 100644 --- a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md +++ b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md @@ -1,7 +1,7 @@ --- productId: toolpad-core title: Dashboard Layout -components: AppProvider, DashboardLayout +components: AppProvider, DashboardLayout, User --- # Dashboard Layout diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js new file mode 100644 index 00000000000..d2870134357 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js @@ -0,0 +1,17 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; + +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'facebook', name: 'Facebook' }, +]; + +export default function BasicSignInPage() { + return ( + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx new file mode 100644 index 00000000000..d2870134357 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx @@ -0,0 +1,17 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; + +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'facebook', name: 'Facebook' }, +]; + +export default function BasicSignInPage() { + return ( + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview new file mode 100644 index 00000000000..343cf4b4b00 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview @@ -0,0 +1,4 @@ + alert(`Signing in with "${provider.name}"`)} + providers={providers} +/> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md new file mode 100644 index 00000000000..252a4145cfb --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -0,0 +1,11 @@ +--- +productId: toolpad-core +title: Sign In Page +components: SignInPage +--- + +# Sign In Page + +

A component that renders a sign in page for your application.

+ +{{"demo": "BasicSignInPage.js"}} diff --git a/docs/data/toolpad/core/pages.ts b/docs/data/toolpad/core/pages.ts index d2806c38d7a..441ce3d98da 100644 --- a/docs/data/toolpad/core/pages.ts +++ b/docs/data/toolpad/core/pages.ts @@ -71,6 +71,10 @@ const pages: MuiPage[] = [ pathname: '/toolpad/core/react-dashboard-layout', title: 'Dashboard Layout', }, + { + pathname: '/toolpad/core/react-sign-in-page', + title: 'Sign In Page', + }, ], }, { diff --git a/docs/data/toolpad/core/pagesApi.js b/docs/data/toolpad/core/pagesApi.js index 360899799b6..ced40ce604c 100644 --- a/docs/data/toolpad/core/pagesApi.js +++ b/docs/data/toolpad/core/pagesApi.js @@ -5,4 +5,6 @@ module.exports = [ { pathname: '/toolpad/core/api/dialogs-provider' }, { pathname: '/toolpad/core/api/line-chart' }, { pathname: '/toolpad/core/api/notifications-provider' }, + { pathname: '/toolpad/core/api/sign-in-page' }, + { pathname: '/toolpad/core/api/user' }, ]; diff --git a/docs/pages/toolpad/core/api/app-provider.json b/docs/pages/toolpad/core/api/app-provider.json index d4ce89b715a..b0ed06ac4d1 100644 --- a/docs/pages/toolpad/core/api/app-provider.json +++ b/docs/pages/toolpad/core/api/app-provider.json @@ -1,6 +1,10 @@ { "props": { "children": { "type": { "name": "node" }, "required": true }, + "authentication": { + "type": { "name": "shape", "description": "{ signIn: func, signOut: func }" }, + "default": "null" + }, "branding": { "type": { "name": "shape", "description": "{ logo?: node, title?: string }" }, "default": "null" @@ -19,6 +23,13 @@ }, "default": "null" }, + "session": { + "type": { + "name": "shape", + "description": "{ user?: { email?: string, id?: string, image?: string, name?: string } }" + }, + "default": "null" + }, "theme": { "type": { "name": "object" }, "default": "baseTheme" } }, "name": "AppProvider", diff --git a/docs/pages/toolpad/core/api/sign-in-page.js b/docs/pages/toolpad/core/api/sign-in-page.js new file mode 100644 index 00000000000..03b69214011 --- /dev/null +++ b/docs/pages/toolpad/core/api/sign-in-page.js @@ -0,0 +1,23 @@ +import * as React from 'react'; +import ApiPage from 'docs/src/modules/components/ApiPage'; +import mapApiPageTranslations from 'docs/src/modules/utils/mapApiPageTranslations'; +import jsonPageContent from './sign-in-page.json'; + +export default function Page(props) { + const { descriptions, pageContent } = props; + return ; +} + +Page.getInitialProps = () => { + const req = require.context( + 'docs-toolpad/translations/api-docs/sign-in-page', + false, + /\.\/sign-in-page.*.json$/, + ); + const descriptions = mapApiPageTranslations(req); + + return { + descriptions, + pageContent: jsonPageContent, + }; +}; diff --git a/docs/pages/toolpad/core/api/sign-in-page.json b/docs/pages/toolpad/core/api/sign-in-page.json new file mode 100644 index 00000000000..d4177416cf8 --- /dev/null +++ b/docs/pages/toolpad/core/api/sign-in-page.json @@ -0,0 +1,14 @@ +{ + "props": {}, + "name": "SignInPage", + "imports": [ + "import { SignInPage } from '@toolpad-core/SignInPage';", + "import { SignInPage } from '@toolpad-core';" + ], + "classes": [], + "muiName": "SignInPage", + "filename": "/packages/toolpad-core/src/SignInPage/SignInPage.tsx", + "inheritance": null, + "demos": "", + "cssComponent": false +} diff --git a/docs/pages/toolpad/core/api/user.js b/docs/pages/toolpad/core/api/user.js new file mode 100644 index 00000000000..83910525d72 --- /dev/null +++ b/docs/pages/toolpad/core/api/user.js @@ -0,0 +1,19 @@ +import * as React from 'react'; +import ApiPage from 'docs/src/modules/components/ApiPage'; +import mapApiPageTranslations from 'docs/src/modules/utils/mapApiPageTranslations'; +import jsonPageContent from './user.json'; + +export default function Page(props) { + const { descriptions, pageContent } = props; + return ; +} + +Page.getInitialProps = () => { + const req = require.context('docs-toolpad/translations/api-docs/user', false, /\.\/user.*.json$/); + const descriptions = mapApiPageTranslations(req); + + return { + descriptions, + pageContent: jsonPageContent, + }; +}; diff --git a/docs/pages/toolpad/core/api/user.json b/docs/pages/toolpad/core/api/user.json new file mode 100644 index 00000000000..49356cb0d01 --- /dev/null +++ b/docs/pages/toolpad/core/api/user.json @@ -0,0 +1,16 @@ +{ + "props": {}, + "name": "User", + "imports": [ + "import { User } from '@toolpad-core/User';", + "import { User } from '@toolpad-core';" + ], + "classes": [], + "spread": true, + "themeDefaultProps": false, + "muiName": "User", + "filename": "/packages/toolpad-core/src/User/User.tsx", + "inheritance": null, + "demos": "", + "cssComponent": false +} diff --git a/docs/pages/toolpad/core/react-sign-in-page/index.js b/docs/pages/toolpad/core/react-sign-in-page/index.js new file mode 100644 index 00000000000..12dd8f2a6b5 --- /dev/null +++ b/docs/pages/toolpad/core/react-sign-in-page/index.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from '../../../../data/toolpad/core/components/sign-in-page/sign-in-page.md?muiMarkdown'; + +export default function Page() { + return ; +} diff --git a/docs/translations/api-docs/app-provider/app-provider.json b/docs/translations/api-docs/app-provider/app-provider.json index c9a8d257b26..e6120e2fe8d 100644 --- a/docs/translations/api-docs/app-provider/app-provider.json +++ b/docs/translations/api-docs/app-provider/app-provider.json @@ -1,10 +1,12 @@ { "componentDescription": "", "propDescriptions": { + "authentication": { "description": "Authentication methods." }, "branding": { "description": "Branding options for the app." }, "children": { "description": "The content of the app provider." }, - "navigation": { "description": "Navigation definition for the app." }, + "navigation": { "description": "Navigation definition for the app." }, "router": { "description": "Router implementation used inside Toolpad components." }, + "session": { "description": "Session info about the current user." }, "theme": { "description": "Theme used by the app." } diff --git a/docs/translations/api-docs/sign-in-page/sign-in-page.json b/docs/translations/api-docs/sign-in-page/sign-in-page.json new file mode 100644 index 00000000000..f93d4cbd8c7 --- /dev/null +++ b/docs/translations/api-docs/sign-in-page/sign-in-page.json @@ -0,0 +1 @@ +{ "componentDescription": "", "propDescriptions": {}, "classDescriptions": {} } diff --git a/docs/translations/api-docs/user/user.json b/docs/translations/api-docs/user/user.json new file mode 100644 index 00000000000..f93d4cbd8c7 --- /dev/null +++ b/docs/translations/api-docs/user/user.json @@ -0,0 +1 @@ +{ "componentDescription": "", "propDescriptions": {}, "classDescriptions": {} } diff --git a/packages/toolpad-core/src/AppProvider/AppProvider.tsx b/packages/toolpad-core/src/AppProvider/AppProvider.tsx index 0a545713751..8f3bada9df4 100644 --- a/packages/toolpad-core/src/AppProvider/AppProvider.tsx +++ b/packages/toolpad-core/src/AppProvider/AppProvider.tsx @@ -103,10 +103,12 @@ export interface AppProviderProps { router?: Router; /** * Session info about the current user. + * @default null */ session?: Session | null; /** * Authentication methods. + * @default null */ authentication?: Authentication | null; } @@ -160,6 +162,14 @@ AppProvider.propTypes /* remove-proptypes */ = { // │ These PropTypes are generated from the TypeScript type definitions. │ // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ // └─────────────────────────────────────────────────────────────────────┘ + /** + * Authentication methods. + * @default null + */ + authentication: PropTypes.shape({ + signIn: PropTypes.func.isRequired, + signOut: PropTypes.func.isRequired, + }), /** * Branding options for the app. * @default null @@ -173,7 +183,7 @@ AppProvider.propTypes /* remove-proptypes */ = { */ children: PropTypes.node, /** - * Navigation definition for the app. + * Navigation definition for the app. * @default [] */ navigation: PropTypes.arrayOf( @@ -214,6 +224,18 @@ AppProvider.propTypes /* remove-proptypes */ = { pathname: PropTypes.string.isRequired, searchParams: PropTypes.instanceOf(URLSearchParams), }), + /** + * Session info about the current user. + * @default null + */ + session: PropTypes.shape({ + user: PropTypes.shape({ + email: PropTypes.string, + id: PropTypes.string, + image: PropTypes.string, + name: PropTypes.string, + }), + }), /** * [Theme](https://mui.com/material-ui/customization/theming/) used by the app. * @default baseTheme diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 16813eaa890..a40bacd201c 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -51,7 +51,16 @@ export interface SignInPageProps { providers?: AuthProvider[]; signIn: (provider: AuthProvider, formData?: FormData) => void; } - +/** + * + * Demos: + * + * - [Sign In Page](https://mui.com/toolpad/core/react-sign-in-page/) + * + * API: + * + * - [SignInPage API](https://mui.com/toolpad/core/api/sign-in-page) + */ function SignInPage({ providers, signIn }: SignInPageProps) { const branding = React.useContext(BrandingContext); const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); diff --git a/packages/toolpad-core/src/User/SessionAvatar.tsx b/packages/toolpad-core/src/User/SessionAvatar.tsx new file mode 100644 index 00000000000..ae8d31c3e00 --- /dev/null +++ b/packages/toolpad-core/src/User/SessionAvatar.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import Avatar, { AvatarProps } from '@mui/material/Avatar'; +import { Session } from '../AppProvider/AppProvider'; + +/** + * @ignore - internal component. + */ + +export interface SessionAvatarProps extends AvatarProps { + session: Session; +} + +export function SessionAvatar({ session, ...props }: SessionAvatarProps) { + return ( + + ); +} diff --git a/packages/toolpad-core/src/User/User.test.tsx b/packages/toolpad-core/src/User/User.test.tsx index a6ab920234b..892eb386b37 100644 --- a/packages/toolpad-core/src/User/User.test.tsx +++ b/packages/toolpad-core/src/User/User.test.tsx @@ -8,10 +8,15 @@ import * as React from 'react'; import { describe, test, expect, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import describeConformance from '@toolpad/utils/describeConformance'; import { User } from './User'; import { AppProvider } from '../AppProvider'; describe('AppProvider', () => { + describeConformance(, () => ({ + skip: ['themeDefaultProps'], + })); + test('renders nothing in button when no authentication', async () => { render(); diff --git a/packages/toolpad-core/src/User/User.tsx b/packages/toolpad-core/src/User/User.tsx index 3b32c60e389..91a08285bad 100644 --- a/packages/toolpad-core/src/User/User.tsx +++ b/packages/toolpad-core/src/User/User.tsx @@ -1,28 +1,25 @@ import * as React from 'react'; import IconButton from '@mui/material/IconButton'; import Button from '@mui/material/Button'; -import Avatar, { AvatarProps } from '@mui/material/Avatar'; import Popover from '@mui/material/Popover'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import LogoutIcon from '@mui/icons-material/Logout'; -import { Session, SessionContext, AutheticationContext } from '../AppProvider/AppProvider'; +import { SessionContext, AutheticationContext } from '../AppProvider/AppProvider'; +import { SessionAvatar } from './SessionAvatar'; -interface SessionAvatarProps extends AvatarProps { - session: Session; -} - -function SessionAvatar({ session, ...props }: SessionAvatarProps) { - return ( - - ); -} +export interface UserProps {} -export function User() { +export/** + * + * Demos: + * + * - [Dashboard Layout](https://mui.com/toolpad/core/react-dashboard-layout/) + * + * API: + * + * - [User API](https://mui.com/toolpad/core/api/user) + */ function User(props: UserProps) { const session = React.useContext(SessionContext); const [anchorEl, setAnchorEl] = React.useState(null); diff --git a/packages/toolpad-core/src/index.ts b/packages/toolpad-core/src/index.ts index 6257db47151..22a38be9cb1 100644 --- a/packages/toolpad-core/src/index.ts +++ b/packages/toolpad-core/src/index.ts @@ -8,6 +8,10 @@ export * from './DataGrid'; export * from './LineChart'; +export * from './SignInPage'; + +export * from './User'; + export * from './useDialogs'; export * from './useNotifications'; diff --git a/playground/nextjs/src/app/auth/error/page.tsx b/playground/nextjs/src/app/auth/error/page.tsx deleted file mode 100644 index d074023e27b..00000000000 --- a/playground/nextjs/src/app/auth/error/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; - -import * as React from 'react'; -import { Container, Box, Typography, Button } from '@mui/material'; -import { useSearchParams } from 'next/navigation'; - -const Error = { - Configuration: 'Configuration', -}; - -const errorMap = { - [Error.Configuration]: ( -

- There was a problem when trying to authenticate. Please contact us if this error persists. - Unique error code: Configuration -

- ), -}; - -export default function AuthErrorPage() { - const search = useSearchParams(); - - const error = search.get('error') || Error.Configuration; - return ( - - - - Something went wrong - - - {errorMap[error] || 'Please contact us if this error persists.'} - - - - - ); -} diff --git a/playground/nextjs/src/app/auth/signout/page.tsx b/playground/nextjs/src/app/auth/signout/page.tsx deleted file mode 100644 index 9c7e80dc69c..00000000000 --- a/playground/nextjs/src/app/auth/signout/page.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from 'react'; -import { Container, Box, Typography } from '@mui/material'; -import SignOut from '../../../components/SignOut'; - -export default function SignOutPage() { - return ( - - - - Sign out - - - You will be redirected to the home page. - - - - - ); -} diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 1c4e50ca1c7..814d15e61a7 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -22,6 +22,5 @@ export const { handlers, auth, signIn, signOut } = NextAuth({ secret: process.env.AUTH_SECRET, pages: { signIn: '/auth/signin', - signOut: '/auth/signout', }, }); From a0051175663ad5b28ae72f6f2b39bcb83d67e9fb Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:53:29 +0200 Subject: [PATCH 017/109] Fix typo --- packages/toolpad-core/src/AppProvider/AppProvider.tsx | 6 +++--- packages/toolpad-core/src/User/User.tsx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/toolpad-core/src/AppProvider/AppProvider.tsx b/packages/toolpad-core/src/AppProvider/AppProvider.tsx index 8f3bada9df4..583c7feae1c 100644 --- a/packages/toolpad-core/src/AppProvider/AppProvider.tsx +++ b/packages/toolpad-core/src/AppProvider/AppProvider.tsx @@ -73,7 +73,7 @@ export const RouterContext = React.createContext(null); export const SessionContext = React.createContext(null); -export const AutheticationContext = React.createContext(null); +export const AuthenticationContext = React.createContext(null); export interface AppProviderProps { /** @@ -136,7 +136,7 @@ function AppProvider(props: AppProviderProps) { } = props; return ( - + @@ -153,7 +153,7 @@ function AppProvider(props: AppProviderProps) { - + ); } diff --git a/packages/toolpad-core/src/User/User.tsx b/packages/toolpad-core/src/User/User.tsx index 91a08285bad..c9cce72373a 100644 --- a/packages/toolpad-core/src/User/User.tsx +++ b/packages/toolpad-core/src/User/User.tsx @@ -5,12 +5,12 @@ import Popover from '@mui/material/Popover'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import LogoutIcon from '@mui/icons-material/Logout'; -import { SessionContext, AutheticationContext } from '../AppProvider/AppProvider'; +import { SessionContext, AuthenticationContext } from '../AppProvider/AppProvider'; import { SessionAvatar } from './SessionAvatar'; export interface UserProps {} -export/** +export /** * * Demos: * @@ -36,7 +36,7 @@ export/** const popoverId = React.useId(); const id = open ? popoverId : undefined; - const authentication = React.useContext(AutheticationContext); + const authentication = React.useContext(AuthenticationContext); if (!authentication) { return null; From 1a4731a2a90ea184983d0d4a40f065f5d2df5524 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:57:12 +0200 Subject: [PATCH 018/109] lint --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 1 + packages/toolpad-core/src/User/User.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index a40bacd201c..65020ec58b6 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -51,6 +51,7 @@ export interface SignInPageProps { providers?: AuthProvider[]; signIn: (provider: AuthProvider, formData?: FormData) => void; } + /** * * Demos: diff --git a/packages/toolpad-core/src/User/User.tsx b/packages/toolpad-core/src/User/User.tsx index c9cce72373a..4f6e3ea160c 100644 --- a/packages/toolpad-core/src/User/User.tsx +++ b/packages/toolpad-core/src/User/User.tsx @@ -10,7 +10,7 @@ import { SessionAvatar } from './SessionAvatar'; export interface UserProps {} -export /** +/** * * Demos: * @@ -19,7 +19,7 @@ export /** * API: * * - [User API](https://mui.com/toolpad/core/api/user) - */ function User(props: UserProps) { + */ function User() { const session = React.useContext(SessionContext); const [anchorEl, setAnchorEl] = React.useState(null); @@ -95,3 +95,5 @@ export /**
); } + +export { User }; From 2c190a2bd72c2d5b45be33229ed3afd46ad5152d Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:04:52 +0200 Subject: [PATCH 019/109] frfgr --- .eslintignore | 1 + playground/nextjs-pages/tsconfig.json | 17 +++-------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.eslintignore b/.eslintignore index 29f70af6b0d..2b55df2cfa9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -16,3 +16,4 @@ build .generated .github +.coverage diff --git a/playground/nextjs-pages/tsconfig.json b/playground/nextjs-pages/tsconfig.json index 2b5ac85f8d5..bb5584ed1a4 100644 --- a/playground/nextjs-pages/tsconfig.json +++ b/playground/nextjs-pages/tsconfig.json @@ -1,10 +1,6 @@ { "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -22,13 +18,6 @@ } ] }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } From 56b0256d7366a8df03110a7fc5e6a9b22f29ea4b Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:38:08 +0200 Subject: [PATCH 020/109] Remove background --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 65020ec58b6..163fb67c2b3 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -37,11 +37,6 @@ const IconProviderMap = new Map([ ], ]); -const IconBackgroundMap = new Map([ - ['github', '#24292e'], - ['credentials', 'default'], -]); - export interface AuthProvider { id: string; name: string; @@ -109,13 +104,12 @@ function SignInPage({ providers, signIn }: SignInPageProps) { name={'provider'} value={provider.id} startIcon={IconProviderMap.get(provider.id)} + color="inherit" sx={{ textTransform: 'capitalize', - backgroundColor: IconBackgroundMap.get(provider.id) || '#333', filter: 'opacity(0.9)', transition: 'filter 0.2s ease-in', '&:hover': { - backgroundColor: IconBackgroundMap.get(provider.id) || '#333', filter: 'opacity(1)', }, }} @@ -182,6 +176,7 @@ function SignInPage({ providers, signIn }: SignInPageProps) { size="large" variant="contained" disableElevation + color="inherit" sx={{ mt: 3, mb: 2, From 8adeef5148e3f148a9fb53b583f7a91b97069b89 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:55:22 +0200 Subject: [PATCH 021/109] Add tests --- .../src/SignInPage/SignInPage.test.tsx | 48 +++++++++++++++++++ .../src/SignInPage/SignInPage.tsx | 8 ++-- 2 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 packages/toolpad-core/src/SignInPage/SignInPage.test.tsx diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx new file mode 100644 index 00000000000..7480ee1f0a7 --- /dev/null +++ b/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx @@ -0,0 +1,48 @@ +/// + +/** + * @vitest-environment jsdom + */ + +import * as React from 'react'; +import { describe, test, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import describeConformance from '@toolpad/utils/describeConformance'; +import { SignInPage } from './SignInPage'; + +describe('SignInPage', () => { + describeConformance(, () => ({ + skip: ['themeDefaultProps'], + })); + + test('renders oauth button', async () => { + const signIn = vi.fn(); + render(); + + const signInButton = screen.getByRole('button', { name: 'Sign in with GitHub' }); + + await userEvent.click(signInButton); + + expect(signIn).toHaveBeenCalled(); + expect(signIn.mock.calls[0][0]).toHaveProperty('id', 'github'); + }); + + test('renders credentials provider', async () => { + const signIn = vi.fn(); + render(); + + const emailField = screen.getByRole('textbox', { name: 'Email Address' }); + const passwordField = screen.getByLabelText(/Password/); + const signInButton = screen.getByRole('button', { name: 'Sign in with username and password' }); + + await userEvent.type(emailField, 'john@example.com'); + await userEvent.type(passwordField, 'thepassword'); + await userEvent.click(signInButton); + + expect(signIn).toHaveBeenCalled(); + expect(signIn.mock.calls[0][0]).toHaveProperty('id', 'credentials'); + expect(signIn.mock.calls[0][1].get('email')).toBe('john@example.com'); + expect(signIn.mock.calls[0][1].get('password')).toBe('thepassword'); + }); +}); diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 163fb67c2b3..5754e1098f5 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -44,7 +44,7 @@ export interface AuthProvider { export interface SignInPageProps { providers?: AuthProvider[]; - signIn: (provider: AuthProvider, formData?: FormData) => void; + signIn?: (provider: AuthProvider, formData?: FormData) => void; } /** @@ -91,7 +91,7 @@ function SignInPage({ providers, signIn }: SignInPageProps) { key={provider.id} onSubmit={(event) => { event.preventDefault(); - signIn(provider); + signIn?.(provider); }} > { event.preventDefault(); const formData = new FormData(event.currentTarget); - signIn(credentialsProvider, formData); + signIn?.(credentialsProvider, formData); }} noValidate > @@ -188,7 +188,7 @@ function SignInPage({ providers, signIn }: SignInPageProps) { }, }} > - Sign In + Sign in with username and password From d063c32215181444bb60ef888928893664334cc4 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:57:00 +0200 Subject: [PATCH 022/109] Update SignInPage.tsx --- docs/pages/toolpad/core/api/sign-in-page.json | 2 ++ packages/toolpad-core/src/SignInPage/SignInPage.tsx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/pages/toolpad/core/api/sign-in-page.json b/docs/pages/toolpad/core/api/sign-in-page.json index d4177416cf8..c8a939c2e3e 100644 --- a/docs/pages/toolpad/core/api/sign-in-page.json +++ b/docs/pages/toolpad/core/api/sign-in-page.json @@ -6,6 +6,8 @@ "import { SignInPage } from '@toolpad-core';" ], "classes": [], + "spread": true, + "themeDefaultProps": false, "muiName": "SignInPage", "filename": "/packages/toolpad-core/src/SignInPage/SignInPage.tsx", "inheritance": null, diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 5754e1098f5..4ec0700f175 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -228,7 +228,7 @@ SignInPage.propTypes /* remove-proptypes */ = { /** * @ignore */ - signIn: PropTypes.func.isRequired, + signIn: PropTypes.func, } as any; export { SignInPage }; From caaba768bc99242f07a73565c8875a7aa9846d57 Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Thu, 27 Jun 2024 12:57:39 +0200 Subject: [PATCH 023/109] Add public page --- playground/nextjs/src/app/public/layout.tsx | 6 ++++++ playground/nextjs/src/app/public/page.tsx | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 playground/nextjs/src/app/public/layout.tsx create mode 100644 playground/nextjs/src/app/public/page.tsx diff --git a/playground/nextjs/src/app/public/layout.tsx b/playground/nextjs/src/app/public/layout.tsx new file mode 100644 index 00000000000..94ecc97609f --- /dev/null +++ b/playground/nextjs/src/app/public/layout.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import { DashboardLayout } from '@toolpad/core/DashboardLayout'; + +export default async function DashboardPagesLayout(props: { children: React.ReactNode }) { + return {props.children}; +} diff --git a/playground/nextjs/src/app/public/page.tsx b/playground/nextjs/src/app/public/page.tsx new file mode 100644 index 00000000000..800d6b2d3f2 --- /dev/null +++ b/playground/nextjs/src/app/public/page.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; + +export default async function HomePage() { + return ( + + + Public page + + + ); +} From b5ac9b4b4c0b19917c83950c5248425d2706c20d Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Fri, 28 Jun 2024 14:31:03 -0700 Subject: [PATCH 024/109] docs: Fix typos, more content to Account --- .../core/all-components/all-components.md | 2 + .../components/account/AccountSignedIn.js | 68 ++++++++++++++++++ .../components/account/AccountSignedOut.js | 61 ++++++++++++++++ .../core/components/account/account.md | 17 +++++ .../dashboard-layout/dashboard-layout.md | 2 +- docs/data/toolpad/core/components/index.md | 7 -- .../sign-in-page/BasicSignInPage.js | 1 - .../sign-in-page/BasicSignInPage.tsx | 1 - .../components/sign-in-page/sign-in-page.md | 6 +- docs/data/toolpad/core/pages.ts | 4 ++ docs/data/toolpad/core/pagesApi.js | 2 +- .../toolpad/core/api/{user.js => account.js} | 8 ++- docs/pages/toolpad/core/api/account.json | 16 +++++ docs/pages/toolpad/core/api/app-provider.json | 4 +- .../toolpad/core/api/dashboard-layout.json | 4 +- docs/pages/toolpad/core/api/data-grid.json | 4 +- .../toolpad/core/api/dialogs-provider.json | 2 +- docs/pages/toolpad/core/api/line-chart.json | 4 +- .../core/api/notifications-provider.json | 2 +- docs/pages/toolpad/core/api/sign-in-page.json | 4 +- docs/pages/toolpad/core/api/user.json | 16 ----- .../pages/toolpad/core/react-account/index.js | 7 ++ .../static/toolpad/docs/core/sign-in-1.png | Bin 0 -> 190330 bytes .../{user/user.json => account/account.json} | 0 .../Account.test.tsx} | 10 +-- .../{User/User.tsx => Account/Account.tsx} | 11 +-- .../src/{User => Account}/SessionAvatar.tsx | 0 packages/toolpad-core/src/Account/index.ts | 1 + .../src/DashboardLayout/DashboardLayout.tsx | 4 +- .../src/SignInPage/SignInPage.tsx | 13 +++- packages/toolpad-core/src/User/index.ts | 1 - packages/toolpad-core/src/index.ts | 2 +- .../config/getComponentImports.ts | 10 +-- 33 files changed, 233 insertions(+), 61 deletions(-) create mode 100644 docs/data/toolpad/core/components/account/AccountSignedIn.js create mode 100644 docs/data/toolpad/core/components/account/AccountSignedOut.js create mode 100644 docs/data/toolpad/core/components/account/account.md delete mode 100644 docs/data/toolpad/core/components/index.md rename docs/pages/toolpad/core/api/{user.js => account.js} (74%) create mode 100644 docs/pages/toolpad/core/api/account.json delete mode 100644 docs/pages/toolpad/core/api/user.json create mode 100644 docs/pages/toolpad/core/react-account/index.js create mode 100644 docs/public/static/toolpad/docs/core/sign-in-1.png rename docs/translations/api-docs/{user/user.json => account/account.json} (100%) rename packages/toolpad-core/src/{User/User.test.tsx => Account/Account.test.tsx} (92%) rename packages/toolpad-core/src/{User/User.tsx => Account/Account.tsx} (90%) rename packages/toolpad-core/src/{User => Account}/SessionAvatar.tsx (100%) create mode 100644 packages/toolpad-core/src/Account/index.ts delete mode 100644 packages/toolpad-core/src/User/index.ts diff --git a/docs/data/toolpad/core/all-components/all-components.md b/docs/data/toolpad/core/all-components/all-components.md index 287ebabff60..238a1d667e4 100644 --- a/docs/data/toolpad/core/all-components/all-components.md +++ b/docs/data/toolpad/core/all-components/all-components.md @@ -3,5 +3,7 @@

This page contains an index to the components included in Toolpad Core.

- [App Provider](/toolpad/core/react-app-provider/) +- [Account](/toolpad/core/react-account/) - [Dashboard Layout](/toolpad/core/react-dashboard-layout/) - [Data Grid](/toolpad/core/react-data-grid/) +- [Sign In Page](/toolpad/core/react-sign-in-page/) diff --git a/docs/data/toolpad/core/components/account/AccountSignedIn.js b/docs/data/toolpad/core/components/account/AccountSignedIn.js new file mode 100644 index 00000000000..79719651ca3 --- /dev/null +++ b/docs/data/toolpad/core/components/account/AccountSignedIn.js @@ -0,0 +1,68 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import { AppProvider } from '@toolpad/core/AppProvider'; +import { DashboardLayout } from '@toolpad/core/DashboardLayout'; + +const signIn = () => {}; +const signOut = () => {}; + +const NAVIGATION = [ + { + kind: 'header', + title: 'Main items', + }, + { + slug: '/dashboard', + title: 'Dashboard', + icon: , + }, +]; + +const AUTHENTICATION = { + signIn, + signOut, +}; + +export default function AccountSignedIn() { + const session = { + user: { + name: 'Bharat Kashyap', + email: 'bharatkashyap@outlook.com', + username: 'bharatkashyap', + image: 'https://avatars.githubusercontent.com/u/19550456', + }, + }; + const [pathname, setPathname] = React.useState('/page'); + + const router = React.useMemo(() => { + return { + pathname, + searchParams: new URLSearchParams(), + navigate: (path) => setPathname(String(path)), + }; + }, [pathname]); + + return ( + + + + Dashboard content for {pathname} + + + + ); +} diff --git a/docs/data/toolpad/core/components/account/AccountSignedOut.js b/docs/data/toolpad/core/components/account/AccountSignedOut.js new file mode 100644 index 00000000000..30dfecdd33b --- /dev/null +++ b/docs/data/toolpad/core/components/account/AccountSignedOut.js @@ -0,0 +1,61 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import { AppProvider } from '@toolpad/core/AppProvider'; +import { DashboardLayout } from '@toolpad/core/DashboardLayout'; + +const signIn = () => {}; +const signOut = () => {}; + +const NAVIGATION = [ + { + kind: 'header', + title: 'Main items', + }, + { + slug: '/dashboard', + title: 'Dashboard', + icon: , + }, +]; + +const AUTHENTICATION = { + signIn, + signOut, +}; + +export default function AccountSignedOut() { + const session = {}; + const [pathname, setPathname] = React.useState('/page'); + + const router = React.useMemo(() => { + return { + pathname, + searchParams: new URLSearchParams(), + navigate: (path) => setPathname(String(path)), + }; + }, [pathname]); + + return ( + + + + Dashboard content for {pathname} + + + + ); +} diff --git a/docs/data/toolpad/core/components/account/account.md b/docs/data/toolpad/core/components/account/account.md new file mode 100644 index 00000000000..ec5e6e2e5a6 --- /dev/null +++ b/docs/data/toolpad/core/components/account/account.md @@ -0,0 +1,17 @@ +--- +productId: toolpad-core +title: Account +components: Account +--- + +# Account + +

A component that renders an account management dropdown for your application.

+ +When signed out, the component renders as an inline sign in button within the dashboard layout + +{{"demo": "AccountSignedOut.js", "iframe": "true", "height": 500}} + +Once signed in, the component is rendered as a dropdown containing the user's account details as well as an option to sign out. + +{{"demo": "AccountSignedIn.js", "iframe": "true", "height": 500}} diff --git a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md index 13f5b17dbdd..b6caba7bc73 100644 --- a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md +++ b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md @@ -1,7 +1,7 @@ --- productId: toolpad-core title: Dashboard Layout -components: AppProvider, DashboardLayout, User +components: AppProvider, DashboardLayout, Account --- # Dashboard Layout diff --git a/docs/data/toolpad/core/components/index.md b/docs/data/toolpad/core/components/index.md deleted file mode 100644 index 90b83666295..00000000000 --- a/docs/data/toolpad/core/components/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Components Index - -

This page contains an index to the component pages that come with Toolpad Core.

- -- [Dashboard Layout](/toolpad/core/components/dashboard-layout/) -- [Data Grid](/toolpad/core/components/data-grid/) -- [Line Chart](/toolpad/core/components/line-chart/) diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js index d2870134357..cc72c467e21 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js @@ -4,7 +4,6 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, - { id: 'facebook', name: 'Facebook' }, ]; export default function BasicSignInPage() { diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx index d2870134357..cc72c467e21 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx @@ -4,7 +4,6 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, - { id: 'facebook', name: 'Facebook' }, ]; export default function BasicSignInPage() { diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index 252a4145cfb..de20480bbeb 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -1,7 +1,7 @@ --- productId: toolpad-core title: Sign In Page -components: SignInPage +components: SignInPage, Account --- # Sign In Page @@ -9,3 +9,7 @@ components: SignInPage

A component that renders a sign in page for your application.

{{"demo": "BasicSignInPage.js"}} + +Once signed in, the [``](/toolpad/core/react-account/) component is rendered within the dashboard layout, containing the user's account details as well as an option to sign out. + +{{"demo": "../account/AccountSignedIn.js", "iframe": "true" }} diff --git a/docs/data/toolpad/core/pages.ts b/docs/data/toolpad/core/pages.ts index 441ce3d98da..8cc76718aa2 100644 --- a/docs/data/toolpad/core/pages.ts +++ b/docs/data/toolpad/core/pages.ts @@ -75,6 +75,10 @@ const pages: MuiPage[] = [ pathname: '/toolpad/core/react-sign-in-page', title: 'Sign In Page', }, + { + pathname: '/toolpad/core/react-account', + title: 'Account', + }, ], }, { diff --git a/docs/data/toolpad/core/pagesApi.js b/docs/data/toolpad/core/pagesApi.js index ced40ce604c..9bf68345990 100644 --- a/docs/data/toolpad/core/pagesApi.js +++ b/docs/data/toolpad/core/pagesApi.js @@ -1,4 +1,5 @@ module.exports = [ + { pathname: '/toolpad/core/api/account' }, { pathname: '/toolpad/core/api/app-provider' }, { pathname: '/toolpad/core/api/dashboard-layout' }, { pathname: '/toolpad/core/api/data-grid' }, @@ -6,5 +7,4 @@ module.exports = [ { pathname: '/toolpad/core/api/line-chart' }, { pathname: '/toolpad/core/api/notifications-provider' }, { pathname: '/toolpad/core/api/sign-in-page' }, - { pathname: '/toolpad/core/api/user' }, ]; diff --git a/docs/pages/toolpad/core/api/user.js b/docs/pages/toolpad/core/api/account.js similarity index 74% rename from docs/pages/toolpad/core/api/user.js rename to docs/pages/toolpad/core/api/account.js index 83910525d72..9571e0c36b0 100644 --- a/docs/pages/toolpad/core/api/user.js +++ b/docs/pages/toolpad/core/api/account.js @@ -1,7 +1,7 @@ import * as React from 'react'; import ApiPage from 'docs/src/modules/components/ApiPage'; import mapApiPageTranslations from 'docs/src/modules/utils/mapApiPageTranslations'; -import jsonPageContent from './user.json'; +import jsonPageContent from './account.json'; export default function Page(props) { const { descriptions, pageContent } = props; @@ -9,7 +9,11 @@ export default function Page(props) { } Page.getInitialProps = () => { - const req = require.context('docs-toolpad/translations/api-docs/user', false, /\.\/user.*.json$/); + const req = require.context( + 'docs-toolpad/translations/api-docs/account', + false, + /\.\/account.*.json$/, + ); const descriptions = mapApiPageTranslations(req); return { diff --git a/docs/pages/toolpad/core/api/account.json b/docs/pages/toolpad/core/api/account.json new file mode 100644 index 00000000000..3f4371dfb5d --- /dev/null +++ b/docs/pages/toolpad/core/api/account.json @@ -0,0 +1,16 @@ +{ + "props": {}, + "name": "Account", + "imports": [ + "import { Account } from '@toolpad/core/Account';", + "import { Account } from '@toolpad/core';" + ], + "classes": [], + "spread": true, + "themeDefaultProps": false, + "muiName": "Account", + "filename": "/packages/toolpad-core/src/Account/Account.tsx", + "inheritance": null, + "demos": "", + "cssComponent": false +} diff --git a/docs/pages/toolpad/core/api/app-provider.json b/docs/pages/toolpad/core/api/app-provider.json index b0ed06ac4d1..90d8d99af16 100644 --- a/docs/pages/toolpad/core/api/app-provider.json +++ b/docs/pages/toolpad/core/api/app-provider.json @@ -34,8 +34,8 @@ }, "name": "AppProvider", "imports": [ - "import { AppProvider } from '@toolpad-core/AppProvider';\nimport { AppProvider } from '@toolpad-core/nextjs/AppProvider'; // Next.js", - "import { AppProvider } from '@toolpad-core';\nimport { AppProvider } from '@toolpad-core/nextjs'; // Next.js" + "import { AppProvider } from '@toolpad/core/AppProvider';\nimport { AppProvider } from '@toolpad/core/nextjs/AppProvider'; // Next.js", + "import { AppProvider } from '@toolpad/core';\nimport { AppProvider } from '@toolpad/core/nextjs'; // Next.js" ], "classes": [], "spread": true, diff --git a/docs/pages/toolpad/core/api/dashboard-layout.json b/docs/pages/toolpad/core/api/dashboard-layout.json index af4c4e66fda..87b9dec9b3b 100644 --- a/docs/pages/toolpad/core/api/dashboard-layout.json +++ b/docs/pages/toolpad/core/api/dashboard-layout.json @@ -2,8 +2,8 @@ "props": { "children": { "type": { "name": "node" }, "required": true } }, "name": "DashboardLayout", "imports": [ - "import { DashboardLayout } from '@toolpad-core/DashboardLayout';", - "import { DashboardLayout } from '@toolpad-core';" + "import { DashboardLayout } from '@toolpad/core/DashboardLayout';", + "import { DashboardLayout } from '@toolpad/core';" ], "classes": [], "spread": true, diff --git a/docs/pages/toolpad/core/api/data-grid.json b/docs/pages/toolpad/core/api/data-grid.json index 724b85b8453..ab0109cce86 100644 --- a/docs/pages/toolpad/core/api/data-grid.json +++ b/docs/pages/toolpad/core/api/data-grid.json @@ -10,8 +10,8 @@ }, "name": "DataGrid", "imports": [ - "import { DataGrid } from '@toolpad-core/DataGrid';", - "import { DataGrid } from '@toolpad-core';" + "import { DataGrid } from '@toolpad/core/DataGrid';", + "import { DataGrid } from '@toolpad/core';" ], "classes": [ { diff --git a/docs/pages/toolpad/core/api/dialogs-provider.json b/docs/pages/toolpad/core/api/dialogs-provider.json index 2310fc48fe5..630a5d1726f 100644 --- a/docs/pages/toolpad/core/api/dialogs-provider.json +++ b/docs/pages/toolpad/core/api/dialogs-provider.json @@ -1,7 +1,7 @@ { "props": {}, "name": "DialogsProvider", - "imports": ["import { DialogsProvider } from '@toolpad-core/useDialogs';"], + "imports": ["import { DialogsProvider } from '@toolpad/core/useDialogs';"], "classes": [], "spread": true, "themeDefaultProps": false, diff --git a/docs/pages/toolpad/core/api/line-chart.json b/docs/pages/toolpad/core/api/line-chart.json index 8965eb537fc..c71b1d69366 100644 --- a/docs/pages/toolpad/core/api/line-chart.json +++ b/docs/pages/toolpad/core/api/line-chart.json @@ -9,8 +9,8 @@ }, "name": "LineChart", "imports": [ - "import { LineChart } from '@toolpad-core/LineChart';", - "import { LineChart } from '@toolpad-core';" + "import { LineChart } from '@toolpad/core/LineChart';", + "import { LineChart } from '@toolpad/core';" ], "classes": [], "spread": true, diff --git a/docs/pages/toolpad/core/api/notifications-provider.json b/docs/pages/toolpad/core/api/notifications-provider.json index 29c1fdff962..8e457070888 100644 --- a/docs/pages/toolpad/core/api/notifications-provider.json +++ b/docs/pages/toolpad/core/api/notifications-provider.json @@ -1,7 +1,7 @@ { "props": {}, "name": "NotificationsProvider", - "imports": ["import { NotificationsProvider } from '@toolpad-core/useNotifications';"], + "imports": ["import { NotificationsProvider } from '@toolpad/core/useNotifications';"], "slots": [ { "name": "snackbar", diff --git a/docs/pages/toolpad/core/api/sign-in-page.json b/docs/pages/toolpad/core/api/sign-in-page.json index c8a939c2e3e..484fde162f8 100644 --- a/docs/pages/toolpad/core/api/sign-in-page.json +++ b/docs/pages/toolpad/core/api/sign-in-page.json @@ -2,8 +2,8 @@ "props": {}, "name": "SignInPage", "imports": [ - "import { SignInPage } from '@toolpad-core/SignInPage';", - "import { SignInPage } from '@toolpad-core';" + "import { SignInPage } from '@toolpad/core/SignInPage';", + "import { SignInPage } from '@toolpad/core';" ], "classes": [], "spread": true, diff --git a/docs/pages/toolpad/core/api/user.json b/docs/pages/toolpad/core/api/user.json deleted file mode 100644 index 49356cb0d01..00000000000 --- a/docs/pages/toolpad/core/api/user.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "props": {}, - "name": "User", - "imports": [ - "import { User } from '@toolpad-core/User';", - "import { User } from '@toolpad-core';" - ], - "classes": [], - "spread": true, - "themeDefaultProps": false, - "muiName": "User", - "filename": "/packages/toolpad-core/src/User/User.tsx", - "inheritance": null, - "demos": "", - "cssComponent": false -} diff --git a/docs/pages/toolpad/core/react-account/index.js b/docs/pages/toolpad/core/react-account/index.js new file mode 100644 index 00000000000..78c3ae2a458 --- /dev/null +++ b/docs/pages/toolpad/core/react-account/index.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from '../../../../data/toolpad/core/components/account/account.md?muiMarkdown'; + +export default function Page() { + return ; +} diff --git a/docs/public/static/toolpad/docs/core/sign-in-1.png b/docs/public/static/toolpad/docs/core/sign-in-1.png new file mode 100644 index 0000000000000000000000000000000000000000..69b5d8301fe9969514647fc68f2cbc022def0c4b GIT binary patch literal 190330 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 { - describeConformance(, () => ({ + describeConformance(, () => ({ skip: ['themeDefaultProps'], })); test('renders nothing in button when no authentication', async () => { - render(); + render(); expect(screen.queryByRole('button')).not.toBeInTheDocument(); }); @@ -27,7 +27,7 @@ describe('AppProvider', () => { const auth = { signIn: vi.fn(), signOut: vi.fn() }; render( - + , ); @@ -43,7 +43,7 @@ describe('AppProvider', () => { const session = { user: { name: 'John Doe', email: 'john@example.com' } }; render( - + , ); diff --git a/packages/toolpad-core/src/User/User.tsx b/packages/toolpad-core/src/Account/Account.tsx similarity index 90% rename from packages/toolpad-core/src/User/User.tsx rename to packages/toolpad-core/src/Account/Account.tsx index 4f6e3ea160c..fefc8b11bf5 100644 --- a/packages/toolpad-core/src/User/User.tsx +++ b/packages/toolpad-core/src/Account/Account.tsx @@ -8,18 +8,21 @@ import LogoutIcon from '@mui/icons-material/Logout'; import { SessionContext, AuthenticationContext } from '../AppProvider/AppProvider'; import { SessionAvatar } from './SessionAvatar'; -export interface UserProps {} +export interface AccountProps {} /** * * Demos: * + * - [Account](https://mui.com/toolpad/core/react-account/) * - [Dashboard Layout](https://mui.com/toolpad/core/react-dashboard-layout/) + * - [Sign In Page](https://mui.com/toolpad/core/react-sign-in-page/) * * API: * - * - [User API](https://mui.com/toolpad/core/api/user) - */ function User() { + * - [Account API](https://mui.com/toolpad/core/api/account) + */ +function Account() { const session = React.useContext(SessionContext); const [anchorEl, setAnchorEl] = React.useState(null); @@ -96,4 +99,4 @@ export interface UserProps {} ); } -export { User }; +export { Account }; diff --git a/packages/toolpad-core/src/User/SessionAvatar.tsx b/packages/toolpad-core/src/Account/SessionAvatar.tsx similarity index 100% rename from packages/toolpad-core/src/User/SessionAvatar.tsx rename to packages/toolpad-core/src/Account/SessionAvatar.tsx diff --git a/packages/toolpad-core/src/Account/index.ts b/packages/toolpad-core/src/Account/index.ts new file mode 100644 index 00000000000..4c71833ffeb --- /dev/null +++ b/packages/toolpad-core/src/Account/index.ts @@ -0,0 +1 @@ +export * from './Account'; diff --git a/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx b/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx index 9819e16ca13..b4c6ab76267 100644 --- a/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx +++ b/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx @@ -18,7 +18,7 @@ import Toolbar from '@mui/material/Toolbar'; import Typography from '@mui/material/Typography'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; -import { User } from '../User'; +import { Account } from '../Account'; import { BrandingContext, Navigation, @@ -227,7 +227,7 @@ function DashboardLayout(props: DashboardLayoutProps) { - + void; } @@ -57,7 +67,8 @@ export interface SignInPageProps { * * - [SignInPage API](https://mui.com/toolpad/core/api/sign-in-page) */ -function SignInPage({ providers, signIn }: SignInPageProps) { +function SignInPage(props: SignInPageProps) { + const { providers, signIn } = props; const branding = React.useContext(BrandingContext); const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); diff --git a/packages/toolpad-core/src/User/index.ts b/packages/toolpad-core/src/User/index.ts deleted file mode 100644 index f6b9f36c6e1..00000000000 --- a/packages/toolpad-core/src/User/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './User'; diff --git a/packages/toolpad-core/src/index.ts b/packages/toolpad-core/src/index.ts index 22a38be9cb1..b441d72aafc 100644 --- a/packages/toolpad-core/src/index.ts +++ b/packages/toolpad-core/src/index.ts @@ -10,7 +10,7 @@ export * from './LineChart'; export * from './SignInPage'; -export * from './User'; +export * from './Account'; export * from './useDialogs'; diff --git a/scripts/docs/buildCoreApiDocs/config/getComponentImports.ts b/scripts/docs/buildCoreApiDocs/config/getComponentImports.ts index 6b9ec088a98..d04c743dde0 100644 --- a/scripts/docs/buildCoreApiDocs/config/getComponentImports.ts +++ b/scripts/docs/buildCoreApiDocs/config/getComponentImports.ts @@ -24,16 +24,16 @@ export function getComponentImports(name: string, filename: string) { const hasNextJsVersion = fs.existsSync(`${nextjsRelativePath}/${name}.tsx`); return [ - `import { ${name} } from '@toolpad-core/${name}';${ + `import { ${name} } from '@toolpad/core/${name}';${ hasNextJsVersion - ? `\nimport { ${name} } from '@toolpad-core/nextjs/${name}'; // Next.js` + ? `\nimport { ${name} } from '@toolpad/core/nextjs/${name}'; // Next.js` : '' }`, - `import { ${name} } from '@toolpad-core';${ - hasNextJsVersion ? `\nimport { ${name} } from '@toolpad-core/nextjs'; // Next.js` : '' + `import { ${name} } from '@toolpad/core';${ + hasNextJsVersion ? `\nimport { ${name} } from '@toolpad/core/nextjs'; // Next.js` : '' }`, ]; } - return [`import { ${name} } from '@toolpad-core/${componentDirectory}';`]; + return [`import { ${name} } from '@toolpad/core/${componentDirectory}';`]; } From d72fbec732c918823c41443d8ec66e02dbdf26ae Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Mon, 1 Jul 2024 12:41:46 -0700 Subject: [PATCH 025/109] fix: Proptypes --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index a5e59d1f909..742c2c86338 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -228,7 +228,8 @@ SignInPage.propTypes /* remove-proptypes */ = { // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ // └─────────────────────────────────────────────────────────────────────┘ /** - * @ignore + * The list of authentication providers to display. + * @default [] */ providers: PropTypes.arrayOf( PropTypes.shape({ @@ -237,7 +238,10 @@ SignInPage.propTypes /* remove-proptypes */ = { }), ), /** - * @ignore + * Callback fired when a user signs in. + * @param provider The authentication provider. + * @param formData The form data if the provider is 'credentials'. + * @default undefined */ signIn: PropTypes.func, } as any; From 63683e29da8c3da7e0bda136df5c59d8ca647230 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Mon, 1 Jul 2024 13:05:34 -0700 Subject: [PATCH 026/109] fix: CI --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 742c2c86338..2bfde96520f 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -228,6 +228,7 @@ SignInPage.propTypes /* remove-proptypes */ = { // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ // └─────────────────────────────────────────────────────────────────────┘ /** + * @ignore * The list of authentication providers to display. * @default [] */ @@ -238,6 +239,7 @@ SignInPage.propTypes /* remove-proptypes */ = { }), ), /** + * @ignore * Callback fired when a user signs in. * @param provider The authentication provider. * @param formData The form data if the provider is 'credentials'. From 9f6f67e90faabfaafe380808fcc6584a65069aa3 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 3 Jul 2024 14:08:08 -0700 Subject: [PATCH 027/109] fix: ci --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 2bfde96520f..742c2c86338 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -228,7 +228,6 @@ SignInPage.propTypes /* remove-proptypes */ = { // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ // └─────────────────────────────────────────────────────────────────────┘ /** - * @ignore * The list of authentication providers to display. * @default [] */ @@ -239,7 +238,6 @@ SignInPage.propTypes /* remove-proptypes */ = { }), ), /** - * @ignore * Callback fired when a user signs in. * @param provider The authentication provider. * @param formData The form data if the provider is 'credentials'. From 0054171d211d9b3b3bc66beb27d6295fb8210e51 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 3 Jul 2024 15:08:19 -0700 Subject: [PATCH 028/109] fix: CI, finally --- docs/pages/toolpad/core/api/sign-in-page.json | 15 +++++++++++- .../api-docs/sign-in-page/sign-in-page.json | 15 +++++++++++- .../src/SignInPage/SignInPage.tsx | 24 +++++++++++++++---- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/docs/pages/toolpad/core/api/sign-in-page.json b/docs/pages/toolpad/core/api/sign-in-page.json index 484fde162f8..e8c04dcbdf4 100644 --- a/docs/pages/toolpad/core/api/sign-in-page.json +++ b/docs/pages/toolpad/core/api/sign-in-page.json @@ -1,5 +1,18 @@ { - "props": {}, + "props": { + "providers": { + "type": { "name": "arrayOf", "description": "Array<{ id: string, name: string }>" }, + "default": "[]" + }, + "signIn": { + "type": { "name": "func" }, + "default": "undefined", + "signature": { + "type": "function(provider: AuthProvider, formData: FormData) => void", + "describedArgs": ["provider", "formData"] + } + } + }, "name": "SignInPage", "imports": [ "import { SignInPage } from '@toolpad/core/SignInPage';", diff --git a/docs/translations/api-docs/sign-in-page/sign-in-page.json b/docs/translations/api-docs/sign-in-page/sign-in-page.json index f93d4cbd8c7..1bc014cd737 100644 --- a/docs/translations/api-docs/sign-in-page/sign-in-page.json +++ b/docs/translations/api-docs/sign-in-page/sign-in-page.json @@ -1 +1,14 @@ -{ "componentDescription": "", "propDescriptions": {}, "classDescriptions": {} } +{ + "componentDescription": "", + "propDescriptions": { + "providers": { "description": "The list of authentication providers to display." }, + "signIn": { + "description": "Callback fired when a user signs in.", + "typeDescriptions": { + "provider": "The authentication provider.", + "formData": "The form data if the provider id is 'credentials'." + } + } + }, + "classDescriptions": {} +} diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 742c2c86338..c90c14afa3d 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -38,7 +38,19 @@ const IconProviderMap = new Map([ ]); export interface AuthProvider { + /** + * The unique identifier of the authentication provider. + * @default '' + * @example 'google' + * @example 'github' + */ id: string; + /** + * The name of the authentication provider. + * @default '' + * @example 'Google' + * @example 'GitHub' + */ name: string; } @@ -50,11 +62,12 @@ export interface SignInPageProps { providers?: AuthProvider[]; /** * Callback fired when a user signs in. - * @param provider The authentication provider. - * @param formData The form data if the provider is 'credentials'. + * @param {AuthProvider} provider The authentication provider. + * @param {FormData} formData The form data if the provider id is 'credentials'. + * @returns {void} * @default undefined */ - signIn?: (provider: AuthProvider, formData?: FormData) => void; + signIn?: (provider: AuthProvider, formData?: any) => void; } /** @@ -239,8 +252,9 @@ SignInPage.propTypes /* remove-proptypes */ = { ), /** * Callback fired when a user signs in. - * @param provider The authentication provider. - * @param formData The form data if the provider is 'credentials'. + * @param {AuthProvider} provider The authentication provider. + * @param {FormData} formData The form data if the provider id is 'credentials'. + * @returns {void} * @default undefined */ signIn: PropTypes.func, From 3afc720bb07de88584f0ad1cb1b89d29d6262222 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 3 Jul 2024 17:23:30 -0700 Subject: [PATCH 029/109] wip: Improve `credentialsProvider` support --- .../toolpad-core/src/SignInPage/SignInPage.tsx | 1 + playground/nextjs/src/auth.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index c90c14afa3d..0fda273b33b 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -170,6 +170,7 @@ function SignInPage(props: SignInPageProps) { id="email" label="Email Address" name="email" + type="email" autoComplete="email" autoFocus /> diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 814d15e61a7..789fb888fc0 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -1,5 +1,6 @@ import NextAuth from 'next-auth'; import GitHub from 'next-auth/providers/github'; +import Credentials from 'next-auth/providers/credentials'; import type { Provider } from 'next-auth/providers'; const providers: Provider[] = [ @@ -7,6 +8,22 @@ const providers: Provider[] = [ clientId: process.env.AUTH_GITHUB_ID, clientSecret: process.env.AUTH_GITHUB_SECRET, }), + Credentials({ + credentials: { + email: { label: 'Email Address', type: 'email' }, + password: { label: 'Password', type: 'password' }, + }, + authorize(c) { + if (c.password !== 'password') { + return null; + } + return { + id: 'test', + name: 'Test User', + email: 'test@example.com', + }; + }, + }), ]; export const providerMap = providers.map((provider) => { From 66144bb2137b29af65cc49aa9e7dc242db5fb308 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 4 Jul 2024 01:50:05 -0700 Subject: [PATCH 030/109] feat: CredentialsProvider improvements --- .../src/SignInPage/SignInPage.tsx | 56 ++++++++++++++++--- .../nextjs/src/app/(dashboard)/layout.tsx | 8 --- playground/nextjs/src/app/actions.ts | 28 ++++++++++ .../nextjs/src/app/auth/signin/page.tsx | 31 ++-------- playground/nextjs/src/auth.ts | 12 ++++ playground/nextjs/src/middleware.ts | 6 ++ 6 files changed, 98 insertions(+), 43 deletions(-) create mode 100644 playground/nextjs/src/app/actions.ts create mode 100644 playground/nextjs/src/middleware.ts diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 0fda273b33b..3401f7c88b3 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -4,7 +4,6 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import Avatar from '@mui/material/Avatar'; import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; import Checkbox from '@mui/material/Checkbox'; import Container from '@mui/material/Container'; import Divider from '@mui/material/Divider'; @@ -19,6 +18,7 @@ import GitHubIcon from '@mui/icons-material/GitHub'; import PasswordIcon from '@mui/icons-material/Password'; import Stack from '@mui/material/Stack'; import { BrandingContext } from '../AppProvider'; +import { useNotifications } from '../useNotifications'; const IconProviderMap = new Map([ ['github', ], @@ -63,11 +63,12 @@ export interface SignInPageProps { /** * Callback fired when a user signs in. * @param {AuthProvider} provider The authentication provider. - * @param {FormData} formData The form data if the provider id is 'credentials'. - * @returns {void} + * @param {FormData} formData The form data if the provider id is 'credentials'.\ + * @param {string} callbackUrl The URL to redirect to after signing in. + * @returns {void} | {string} * @default undefined */ - signIn?: (provider: AuthProvider, formData?: any) => void; + signIn?: (provider: AuthProvider, formData?: any, callbackUrl?: string) => void | Promise; } /** @@ -84,6 +85,20 @@ function SignInPage(props: SignInPageProps) { const { providers, signIn } = props; const branding = React.useContext(BrandingContext); const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); + const [{ loading, providerId }, setFormStatus] = React.useState<{ + loading: boolean; + providerId: string; + }>({ + providerId: '', + loading: false, + }); + + const callbackUrl = + typeof window !== 'undefined' + ? new URLSearchParams(window.location.search).get('callbackUrl') ?? '/' + : '/'; + + const notifications = useNotifications(); return ( @@ -115,6 +130,9 @@ function SignInPage(props: SignInPageProps) { key={provider.id} onSubmit={(event) => { event.preventDefault(); + setFormStatus((prev) => ({ ...prev, providerId: provider.id, loading: true })); + // OAuth providers will redirect to their own page + // so we don't need to set loading to false, or wait for a response signIn?.(provider); }} > @@ -126,6 +144,7 @@ function SignInPage(props: SignInPageProps) { size="large" disableElevation name={'provider'} + loading={loading && providerId === provider.id} value={provider.id} startIcon={IconProviderMap.get(provider.id)} color="inherit" @@ -150,10 +169,28 @@ function SignInPage(props: SignInPageProps) { or { + onSubmit={async (event) => { + setFormStatus({ + providerId: credentialsProvider.id, + loading: true, + }); event.preventDefault(); const formData = new FormData(event.currentTarget); - signIn?.(credentialsProvider, formData); + const credentialsResponse = await signIn?.( + credentialsProvider, + formData, + callbackUrl, + ); + setFormStatus((prev) => ({ + ...prev, + loading: false, + })); + if (credentialsResponse) { + notifications.show(credentialsResponse, { + severity: 'error', + autoHideDuration: 3000, + }); + } }} noValidate > @@ -195,13 +232,14 @@ function SignInPage(props: SignInPageProps) { label="Remember me" slotProps={{ typography: { color: 'textSecondary' } }} /> - + Sign in +
diff --git a/playground/nextjs/src/app/(dashboard)/layout.tsx b/playground/nextjs/src/app/(dashboard)/layout.tsx index 56135cddd61..94ecc97609f 100644 --- a/playground/nextjs/src/app/(dashboard)/layout.tsx +++ b/playground/nextjs/src/app/(dashboard)/layout.tsx @@ -1,14 +1,6 @@ import * as React from 'react'; import { DashboardLayout } from '@toolpad/core/DashboardLayout'; -import { redirect } from 'next/navigation'; -import { auth } from '../../auth'; export default async function DashboardPagesLayout(props: { children: React.ReactNode }) { - const session = await auth(); - - if (!session) { - redirect('/auth/signin'); - } - return {props.children}; } diff --git a/playground/nextjs/src/app/actions.ts b/playground/nextjs/src/app/actions.ts new file mode 100644 index 00000000000..b3a324bc676 --- /dev/null +++ b/playground/nextjs/src/app/actions.ts @@ -0,0 +1,28 @@ +'use server'; + +import { AuthError } from 'next-auth'; +import type { AuthProvider } from '@toolpad/core'; +import { signIn } from '../auth'; + +export async function authenticate( + provider: AuthProvider, + formData: FormData, + callbackUrl?: string, +) { + try { + return await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong'; + } + } + throw error; + } +} diff --git a/playground/nextjs/src/app/auth/signin/page.tsx b/playground/nextjs/src/app/auth/signin/page.tsx index db8170b8453..ada1a1d2e55 100644 --- a/playground/nextjs/src/app/auth/signin/page.tsx +++ b/playground/nextjs/src/app/auth/signin/page.tsx @@ -1,30 +1,9 @@ import * as React from 'react'; -import { redirect } from 'next/navigation'; -import { AuthError } from 'next-auth'; + import { SignInPage } from '@toolpad/core/SignInPage'; -import { providerMap, signIn } from '../../../auth'; +import { providerMap } from '../../../auth'; +import { authenticate } from '../../actions'; -export default async function SignIn() { - return ( - { - 'use server'; - try { - await signIn(provider.id, { redirectTo: '/' }); - } catch (error) { - // Signin can fail for a number of reasons, such as the user - // not existing, or the user not having the correct role. - if (error instanceof AuthError) { - redirect(`/auth/error?error=${error.type}`); - } - // Otherwise if a redirects happens NextJS can handle it - // so you can just re-throw the error and let NextJS handle it. - // Docs: - // https://nextjs.org/docs/app/api-reference/functions/redirect#server-component - throw error; - } - }} - /> - ); +export default function SignIn() { + return ; } diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 789fb888fc0..f5fd3d75751 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -40,4 +40,16 @@ export const { handlers, auth, signIn, signOut } = NextAuth({ pages: { signIn: '/auth/signin', }, + callbacks: { + authorized({ auth: session, request: { nextUrl } }) { + const isLoggedIn = !!session?.user; + const isPublicPage = nextUrl.pathname.startsWith('/public'); + + if (isPublicPage || isLoggedIn) { + return true; + } + + return false; // Redirect unauthenticated users to login page + }, + }, }); diff --git a/playground/nextjs/src/middleware.ts b/playground/nextjs/src/middleware.ts new file mode 100644 index 00000000000..02c48f4db60 --- /dev/null +++ b/playground/nextjs/src/middleware.ts @@ -0,0 +1,6 @@ +export { auth as middleware } from './auth'; + +export const config = { + // https://nextjs.org/docs/app/building-your-application/routing/middleware#matcher + matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)'], +}; From f6f9a8a3191a329b550d285d779a250b583e7fb8 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 4 Jul 2024 01:59:31 -0700 Subject: [PATCH 031/109] fix: Update proptypes --- .../toolpad/core/components/sign-in-page/BasicSignInPage.js | 1 + docs/pages/toolpad/core/api/sign-in-page.json | 5 +++-- docs/translations/api-docs/sign-in-page/sign-in-page.json | 4 +++- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 5 +++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js index cc72c467e21..c7b68e1d9f8 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js @@ -4,6 +4,7 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, + { id: 'credentials', name: 'Email and password' }, ]; export default function BasicSignInPage() { diff --git a/docs/pages/toolpad/core/api/sign-in-page.json b/docs/pages/toolpad/core/api/sign-in-page.json index e8c04dcbdf4..9456827492d 100644 --- a/docs/pages/toolpad/core/api/sign-in-page.json +++ b/docs/pages/toolpad/core/api/sign-in-page.json @@ -8,8 +8,9 @@ "type": { "name": "func" }, "default": "undefined", "signature": { - "type": "function(provider: AuthProvider, formData: FormData) => void", - "describedArgs": ["provider", "formData"] + "type": "function(provider: AuthProvider, formData: FormData, callbackUrl: string) => void", + "describedArgs": ["provider", "formData", "callbackUrl"], + "returned": "void" } } }, diff --git a/docs/translations/api-docs/sign-in-page/sign-in-page.json b/docs/translations/api-docs/sign-in-page/sign-in-page.json index 1bc014cd737..ef6a6bf5768 100644 --- a/docs/translations/api-docs/sign-in-page/sign-in-page.json +++ b/docs/translations/api-docs/sign-in-page/sign-in-page.json @@ -6,7 +6,9 @@ "description": "Callback fired when a user signs in.", "typeDescriptions": { "provider": "The authentication provider.", - "formData": "The form data if the provider id is 'credentials'." + "formData": "The form data if the provider id is 'credentials'.\\", + "callbackUrl": "The URL to redirect to after signing in.", + "void": "| {string}" } } }, diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 3401f7c88b3..44e2c724468 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -292,8 +292,9 @@ SignInPage.propTypes /* remove-proptypes */ = { /** * Callback fired when a user signs in. * @param {AuthProvider} provider The authentication provider. - * @param {FormData} formData The form data if the provider id is 'credentials'. - * @returns {void} + * @param {FormData} formData The form data if the provider id is 'credentials'.\ + * @param {string} callbackUrl The URL to redirect to after signing in. + * @returns {void} | {string} * @default undefined */ signIn: PropTypes.func, From c23bcf66725e385df57877e278ed1f230fa485b3 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 4 Jul 2024 02:08:14 -0700 Subject: [PATCH 032/109] fix: `docs:typescript` --- .../toolpad/core/components/sign-in-page/BasicSignInPage.js | 2 +- .../toolpad/core/components/sign-in-page/BasicSignInPage.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js index c7b68e1d9f8..990944cf242 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js @@ -4,7 +4,7 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, - { id: 'credentials', name: 'Email and password' }, + { id: 'credentials', name: 'Email and Password' }, ]; export default function BasicSignInPage() { diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx index cc72c467e21..990944cf242 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx @@ -4,6 +4,7 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, + { id: 'credentials', name: 'Email and Password' }, ]; export default function BasicSignInPage() { From 9a1f1c7715c68dd79c1d64ac90ef28cfd322acf1 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Fri, 5 Jul 2024 15:05:08 -0700 Subject: [PATCH 033/109] fix: Remove divider if no `OAuth` providers --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 44e2c724468..4d924371237 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -166,7 +166,9 @@ function SignInPage(props: SignInPageProps) { {credentialsProvider ? ( - or + {(providers ?? []).length === 1 ? null : ( + or + )} { From e5f20be86159f3f27b26697289f6f7d3601d078f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Sat, 6 Jul 2024 12:47:55 -0700 Subject: [PATCH 034/109] fix: Misc for demos --- .../src/SignInPage/SignInPage.tsx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 4d924371237..7bf1db4c184 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -35,6 +35,18 @@ const IconProviderMap = new Map([ style={{ marginLeft: '2px', marginRight: '2px' }} />, ], + [ + 'facebook', + Facebook logo, + ], ]); export interface AuthProvider { @@ -84,6 +96,7 @@ export interface SignInPageProps { function SignInPage(props: SignInPageProps) { const { providers, signIn } = props; const branding = React.useContext(BrandingContext); + const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); const [{ loading, providerId }, setFormStatus] = React.useState<{ loading: boolean; @@ -110,10 +123,12 @@ function SignInPage(props: SignInPageProps) { alignItems: 'center', }} > - - {branding?.logo ?? } - - + {branding?.logo ?? ( + + + + )} + Sign in {branding?.title ? `to ${branding.title}` : null} From dbaee51c053b7b4b151fc88bcae657c917962350 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Tue, 9 Jul 2024 17:36:45 -0700 Subject: [PATCH 035/109] fix: `credentials` provider for Next.js pages playground --- .../src/SignInPage/SignInPage.tsx | 1 - playground/nextjs-pages/src/auth.ts | 19 ++++++++++++ .../nextjs-pages/src/pages/auth/signin.tsx | 29 ++++++++++++++++++- .../nextjs/src/app/auth/signin/page.tsx | 1 - 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 7bf1db4c184..13a43751c86 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -96,7 +96,6 @@ export interface SignInPageProps { function SignInPage(props: SignInPageProps) { const { providers, signIn } = props; const branding = React.useContext(BrandingContext); - const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); const [{ loading, providerId }, setFormStatus] = React.useState<{ loading: boolean; diff --git a/playground/nextjs-pages/src/auth.ts b/playground/nextjs-pages/src/auth.ts index 1c4e50ca1c7..5850e91ca39 100644 --- a/playground/nextjs-pages/src/auth.ts +++ b/playground/nextjs-pages/src/auth.ts @@ -1,5 +1,6 @@ import NextAuth from 'next-auth'; import GitHub from 'next-auth/providers/github'; +import Credentials from 'next-auth/providers/credentials'; import type { Provider } from 'next-auth/providers'; const providers: Provider[] = [ @@ -7,6 +8,23 @@ const providers: Provider[] = [ clientId: process.env.AUTH_GITHUB_ID, clientSecret: process.env.AUTH_GITHUB_SECRET, }), + Credentials({ + credentials: { + email: { label: 'Email Address', type: 'email' }, + password: { label: 'Password', type: 'password' }, + }, + authorize(c) { + console.log('credentials', c); + if (c.password !== 'password') { + return null; + } + return { + id: 'test', + name: 'Test User', + email: 'test@example.com', + }; + }, + }), ]; export const providerMap = providers.map((provider) => { @@ -18,6 +36,7 @@ export const providerMap = providers.map((provider) => { }); export const { handlers, auth, signIn, signOut } = NextAuth({ + debug: true, providers, secret: process.env.AUTH_SECRET, pages: { diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index 8fb1242093d..8f9a5ac0017 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import type { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next'; +import { AuthError } from 'next-auth'; import { signIn } from 'next-auth/react'; import { SignInPage } from '@toolpad/core/SignInPage'; import { auth, providerMap } from '../../auth'; @@ -7,7 +8,33 @@ import { auth, providerMap } from '../../auth'; export default function SignIn({ providers, }: InferGetServerSidePropsType) { - return signIn(provider.id)} />; + return ( + { + // Strip the `error` query parameter from the URL + // This is useful when the user is redirected back to the page + // after a failed login attempt. + callbackUrl = callbackUrl?.replace(/\?error=.+$/, ''); + try { + return signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong'; + } + } + throw error; + } + }} + /> + ); } SignIn.getLayout = (page: React.ReactNode) => page; diff --git a/playground/nextjs/src/app/auth/signin/page.tsx b/playground/nextjs/src/app/auth/signin/page.tsx index ada1a1d2e55..f974286ffcc 100644 --- a/playground/nextjs/src/app/auth/signin/page.tsx +++ b/playground/nextjs/src/app/auth/signin/page.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; - import { SignInPage } from '@toolpad/core/SignInPage'; import { providerMap } from '../../../auth'; import { authenticate } from '../../actions'; From 2e35386ebab9fae1383b4c27be7c3ac0ca67e81e Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Tue, 9 Jul 2024 17:52:00 -0700 Subject: [PATCH 036/109] fix: Misc. on auth pages playground --- playground/nextjs-pages/src/pages/auth/signin.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index 8f9a5ac0017..d38490dcc0c 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -11,23 +11,25 @@ export default function SignIn({ return ( { + signIn={async (provider, formData, callbackUrl) => { // Strip the `error` query parameter from the URL // This is useful when the user is redirected back to the page // after a failed login attempt. callbackUrl = callbackUrl?.replace(/\?error=.+$/, ''); + try { - return signIn(provider.id, { + const signInResponse = await signIn(provider.id, { ...(formData && Object.fromEntries(formData)), redirectTo: callbackUrl ?? '/', }); + return signInResponse?.ok ? 'Authentication successful.' : 'Something went wrong.'; } catch (error) { if (error instanceof AuthError) { switch (error.type) { case 'CredentialsSignin': return 'Invalid credentials.'; default: - return 'Something went wrong'; + return 'Something went wrong.'; } } throw error; From 0211d27b6163a6b8392612f3d24fe23778f0ef0c Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 10:12:02 -0700 Subject: [PATCH 037/109] fix: Remove notifs on successful auth --- playground/nextjs-pages/src/pages/auth/signin.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index d38490dcc0c..2977aad7677 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -22,7 +22,7 @@ export default function SignIn({ ...(formData && Object.fromEntries(formData)), redirectTo: callbackUrl ?? '/', }); - return signInResponse?.ok ? 'Authentication successful.' : 'Something went wrong.'; + return signInResponse?.ok ? '' : 'Something went wrong.'; } catch (error) { if (error instanceof AuthError) { switch (error.type) { From 99f9b88af65f8c0f641d191bdc17020f4a82b2d8 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 12:36:11 -0700 Subject: [PATCH 038/109] fix: Needless exports --- playground/nextjs-pages/src/auth.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/playground/nextjs-pages/src/auth.ts b/playground/nextjs-pages/src/auth.ts index 5850e91ca39..f8e630a242e 100644 --- a/playground/nextjs-pages/src/auth.ts +++ b/playground/nextjs-pages/src/auth.ts @@ -35,8 +35,7 @@ export const providerMap = providers.map((provider) => { return { id: provider.id, name: provider.name }; }); -export const { handlers, auth, signIn, signOut } = NextAuth({ - debug: true, +export const { handlers, auth } = NextAuth({ providers, secret: process.env.AUTH_SECRET, pages: { From 0b2b6246758d8ecddb8c856fdcdde0cb44a2a755 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 13:06:28 -0700 Subject: [PATCH 039/109] fix: Major changes from reviews --- .../core/components/account/account.md | 10 + .../dashboard-layout/dashboard-layout.md | 6 + .../sign-in-page/AuthJsSignInApp.js | 8 + .../sign-in-page/AuthJsSignInApp.tsx | 8 + .../sign-in-page/AuthJsSignInApp.tsx.preview | 1 + .../sign-in-page/BasicSignInPage.tsx.preview | 5 +- .../sign-in-page/BrandingSignInPage.js | 46 ++++ .../sign-in-page/BrandingSignInPage.tsx | 46 ++++ .../BrandingSignInPage.tsx.preview | 6 + .../sign-in-page/CredentialsSignInPage.js | 13 + .../sign-in-page/CredentialsSignInPage.tsx | 13 + .../CredentialsSignInPage.tsx.preview | 4 + ...{BasicSignInPage.js => OAuthSignInPage.js} | 4 +- ...asicSignInPage.tsx => OAuthSignInPage.tsx} | 4 +- .../sign-in-page/OAuthSignInPage.tsx.preview | 4 + .../core/components/sign-in-page/actions.js | 24 ++ .../core/components/sign-in-page/actions.ts | 28 +++ .../core/components/sign-in-page/auth.js | 54 ++++ .../core/components/sign-in-page/auth.ts | 55 +++++ .../components/sign-in-page/brandingTheme.js | 230 +++++++++++++++++ .../components/sign-in-page/brandingTheme.ts | 231 ++++++++++++++++++ .../components/sign-in-page/sign-in-page.md | 44 +++- 22 files changed, 832 insertions(+), 12 deletions(-) create mode 100644 docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx create mode 100644 docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview create mode 100644 docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx create mode 100644 docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview create mode 100644 docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx create mode 100644 docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview rename docs/data/toolpad/core/components/sign-in-page/{BasicSignInPage.js => OAuthSignInPage.js} (76%) rename docs/data/toolpad/core/components/sign-in-page/{BasicSignInPage.tsx => OAuthSignInPage.tsx} (76%) create mode 100644 docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview create mode 100644 docs/data/toolpad/core/components/sign-in-page/actions.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/actions.ts create mode 100644 docs/data/toolpad/core/components/sign-in-page/auth.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/auth.ts create mode 100644 docs/data/toolpad/core/components/sign-in-page/brandingTheme.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts diff --git a/docs/data/toolpad/core/components/account/account.md b/docs/data/toolpad/core/components/account/account.md index ec5e6e2e5a6..4a56ce170bd 100644 --- a/docs/data/toolpad/core/components/account/account.md +++ b/docs/data/toolpad/core/components/account/account.md @@ -8,10 +8,20 @@ components: Account

A component that renders an account management dropdown for your application.

+The `Account` component is a quick and easy way to display an account management menu for authenticated users. It works deeply with the `SignInPage` and `DashboardLayout` components, meaning that it automatically appears to the top navigation bar inside `DashboardLayout` once your users have signed in through the `SignInPage`. + +## Unauthenticated + When signed out, the component renders as an inline sign in button within the dashboard layout {{"demo": "AccountSignedOut.js", "iframe": "true", "height": 500}} +## Authenticated + Once signed in, the component is rendered as a dropdown containing the user's account details as well as an option to sign out. {{"demo": "AccountSignedIn.js", "iframe": "true", "height": 500}} + +## 🚧 Customization + +The `Account` component will allow adding your own menu options, including deeply nested options, through `slots`. This is in progress. diff --git a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md index b6caba7bc73..ddb788de28e 100644 --- a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md +++ b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md @@ -27,3 +27,9 @@ The `branding` prop in the [AppProvider](https://mui.com/toolpad/core/react-app- The `navigation` prop in the [AppProvider](https://mui.com/toolpad/core/react-app-provider/) allows for setting any type of navigation structure in the sidebar, such as links, headings, nested collapsible lists and dividers, in any order. {{"demo": "DashboardLayoutNavigation.js", "height": 640, "iframe": true}} + +## Account + +The `DashboardLayout` comes integrated with the [``](/toolpad/core/react-account/) component. It renders as an account management menu when a user is signed in, and a text button when not. + +{{"demo": "../account/AccountSignedIn.js", "height": 320, "iframe": true}} diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js new file mode 100644 index 00000000000..4061486ecd4 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js @@ -0,0 +1,8 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; +import { providerMap } from './auth'; +import { authenticate } from './actions'; + +export default function AuthJsSignInApp() { + return ; +} diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx new file mode 100644 index 00000000000..4061486ecd4 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx @@ -0,0 +1,8 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; +import { providerMap } from './auth'; +import { authenticate } from './actions'; + +export default function AuthJsSignInApp() { + return ; +} diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview new file mode 100644 index 00000000000..d96a675813f --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview index 343cf4b4b00..d96a675813f 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx.preview @@ -1,4 +1 @@ - alert(`Signing in with "${provider.name}"`)} - providers={providers} -/> \ No newline at end of file + \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js new file mode 100644 index 00000000000..c00fd332808 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -0,0 +1,46 @@ +import * as React from 'react'; + +import { AppProvider, SignInPage } from '@toolpad/core'; +import { createTheme } from '@mui/material/styles'; +import { useColorSchemeShim } from 'docs/src/modules/components/ThemeContext'; +import { getDesignTokens } from './brandingTheme'; + +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'credentials', name: 'Email and Password' }, +]; + +const BRANDING = { + logo: ( + MUI logo + ), + title: 'MUI', +}; + +export default function BrandingSignInPage() { + const { mode } = useColorSchemeShim(); + const brandingDesignTokens = getDesignTokens(mode); + const THEME = createTheme({ + ...brandingDesignTokens, + palette: { + ...brandingDesignTokens.palette, + mode, + }, + }); + + return ( + // preview-start + + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + + // preview-end + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx new file mode 100644 index 00000000000..c00fd332808 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; + +import { AppProvider, SignInPage } from '@toolpad/core'; +import { createTheme } from '@mui/material/styles'; +import { useColorSchemeShim } from 'docs/src/modules/components/ThemeContext'; +import { getDesignTokens } from './brandingTheme'; + +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'credentials', name: 'Email and Password' }, +]; + +const BRANDING = { + logo: ( + MUI logo + ), + title: 'MUI', +}; + +export default function BrandingSignInPage() { + const { mode } = useColorSchemeShim(); + const brandingDesignTokens = getDesignTokens(mode); + const THEME = createTheme({ + ...brandingDesignTokens, + palette: { + ...brandingDesignTokens.palette, + mode, + }, + }); + + return ( + // preview-start + + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + + // preview-end + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview new file mode 100644 index 00000000000..53f80ab9b6a --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview @@ -0,0 +1,6 @@ + + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js new file mode 100644 index 00000000000..26e79f7cee4 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js @@ -0,0 +1,13 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; + +const providers = [{ id: 'credentials', name: 'Email and Password' }]; + +export default function CredentialsSignInPage() { + return ( + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx new file mode 100644 index 00000000000..26e79f7cee4 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx @@ -0,0 +1,13 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; + +const providers = [{ id: 'credentials', name: 'Email and Password' }]; + +export default function CredentialsSignInPage() { + return ( + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview new file mode 100644 index 00000000000..343cf4b4b00 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview @@ -0,0 +1,4 @@ + alert(`Signing in with "${provider.name}"`)} + providers={providers} +/> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js similarity index 76% rename from docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js rename to docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js index 990944cf242..6800b94b269 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js @@ -4,10 +4,10 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, - { id: 'credentials', name: 'Email and Password' }, + { id: 'facebook', name: 'Facebook' }, ]; -export default function BasicSignInPage() { +export default function OAuthSignInPage() { return ( alert(`Signing in with "${provider.name}"`)} diff --git a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx similarity index 76% rename from docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx rename to docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx index 990944cf242..6800b94b269 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BasicSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx @@ -4,10 +4,10 @@ import { SignInPage } from '@toolpad/core'; const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, - { id: 'credentials', name: 'Email and Password' }, + { id: 'facebook', name: 'Facebook' }, ]; -export default function BasicSignInPage() { +export default function OAuthSignInPage() { return ( alert(`Signing in with "${provider.name}"`)} diff --git a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview new file mode 100644 index 00000000000..343cf4b4b00 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview @@ -0,0 +1,4 @@ + alert(`Signing in with "${provider.name}"`)} + providers={providers} +/> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/actions.js b/docs/data/toolpad/core/components/sign-in-page/actions.js new file mode 100644 index 00000000000..d69b0769851 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/actions.js @@ -0,0 +1,24 @@ +'use server'; + +import { AuthError } from 'next-auth'; + +import { signIn } from './auth'; + +export async function authenticate(provider, formData, callbackUrl) { + try { + return await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong'; + } + } + throw error; + } +} diff --git a/docs/data/toolpad/core/components/sign-in-page/actions.ts b/docs/data/toolpad/core/components/sign-in-page/actions.ts new file mode 100644 index 00000000000..b1a2a201eef --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/actions.ts @@ -0,0 +1,28 @@ +'use server'; + +import { AuthError } from 'next-auth'; +import type { AuthProvider } from '@toolpad/core'; +import { signIn } from './auth'; + +export async function authenticate( + provider: AuthProvider, + formData: FormData, + callbackUrl?: string, +) { + try { + return await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong'; + } + } + throw error; + } +} diff --git a/docs/data/toolpad/core/components/sign-in-page/auth.js b/docs/data/toolpad/core/components/sign-in-page/auth.js new file mode 100644 index 00000000000..335850553d7 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/auth.js @@ -0,0 +1,54 @@ +import NextAuth from 'next-auth'; +import GitHub from 'next-auth/providers/github'; +import Credentials from 'next-auth/providers/credentials'; + +const providers = [ + GitHub({ + clientId: process.env.AUTH_GITHUB_ID, + clientSecret: process.env.AUTH_GITHUB_SECRET, + }), + Credentials({ + credentials: { + email: { label: 'Email Address', type: 'email' }, + password: { label: 'Password', type: 'password' }, + }, + authorize(c) { + if (c.password !== 'password') { + return null; + } + return { + id: 'test', + name: 'Test User', + email: 'test@example.com', + }; + }, + }), +]; + +export const providerMap = providers.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } + return { id: provider.id, name: provider.name }; +}); + +export const { handlers, auth, signIn, signOut } = NextAuth({ + providers, + secret: process.env.AUTH_SECRET, + pages: { + signIn: '/auth/signin', + }, + callbacks: { + authorized({ auth: session, request: { nextUrl } }) { + const isLoggedIn = !!session?.user; + const isPublicPage = nextUrl.pathname.startsWith('/public'); + + if (isPublicPage || isLoggedIn) { + return true; + } + + return false; // Redirect unauthenticated users to login page + }, + }, +}); diff --git a/docs/data/toolpad/core/components/sign-in-page/auth.ts b/docs/data/toolpad/core/components/sign-in-page/auth.ts new file mode 100644 index 00000000000..f5fd3d75751 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/auth.ts @@ -0,0 +1,55 @@ +import NextAuth from 'next-auth'; +import GitHub from 'next-auth/providers/github'; +import Credentials from 'next-auth/providers/credentials'; +import type { Provider } from 'next-auth/providers'; + +const providers: Provider[] = [ + GitHub({ + clientId: process.env.AUTH_GITHUB_ID, + clientSecret: process.env.AUTH_GITHUB_SECRET, + }), + Credentials({ + credentials: { + email: { label: 'Email Address', type: 'email' }, + password: { label: 'Password', type: 'password' }, + }, + authorize(c) { + if (c.password !== 'password') { + return null; + } + return { + id: 'test', + name: 'Test User', + email: 'test@example.com', + }; + }, + }), +]; + +export const providerMap = providers.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } + return { id: provider.id, name: provider.name }; +}); + +export const { handlers, auth, signIn, signOut } = NextAuth({ + providers, + secret: process.env.AUTH_SECRET, + pages: { + signIn: '/auth/signin', + }, + callbacks: { + authorized({ auth: session, request: { nextUrl } }) { + const isLoggedIn = !!session?.user; + const isPublicPage = nextUrl.pathname.startsWith('/public'); + + if (isPublicPage || isLoggedIn) { + return true; + } + + return false; // Redirect unauthenticated users to login page + }, + }, +}); diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js new file mode 100644 index 00000000000..f2623327a6d --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js @@ -0,0 +1,230 @@ +import { createTheme, alpha } from '@mui/material/styles'; + +const defaultTheme = createTheme(); + +const blue = { + 50: '#F0F7FF', + 100: '#C2E0FF', + 200: '#99CCF3', + 300: '#66B2FF', + 400: '#3399FF', + main: '#007FFF', + 500: '#007FFF', + 600: '#0072E5', // vs blueDark 900: WCAG 4.6 AAA (large), APCA 36 Not for reading text + 700: '#0059B2', + 800: '#004C99', + 900: '#003A75', +}; +const blueDark = { + 50: '#E2EDF8', + 100: '#CEE0F3', + 200: '#91B9E3', + 300: '#5090D3', + main: '#5090D3', + 400: '#265D97', + 500: '#1E4976', + 600: '#173A5E', + 700: '#132F4C', // contrast 13.64:1 + 800: '#001E3C', + 900: '#0A1929', +}; +const grey = { + 50: '#F3F6F9', + 100: '#E7EBF0', + 200: '#E0E3E7', + 300: '#CDD2D7', // vs blueDark 900: WCAG 11.6 AAA, APCA 78 Best for text + 400: '#B2BAC2', // vs blueDark 900: WCAG 9 AAA, APCA 63.3 Ok for text + 500: '#A0AAB4', // vs blueDark 900: WCAG 7.5 AAA, APCA 54.3 Only for large text + 600: '#6F7E8C', // vs white bg: WCAG 4.1 AA, APCA 68.7 Ok for text + 700: '#3E5060', // vs white bg: WCAG 8.3 AAA, APCA 88.7 Best for text + 800: '#2D3843', // vs white bg: WCAG 11.9 AAA, APCA 97.3 Best for text + 900: '#1A2027', +}; + +const systemFont = [ + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', +]; + +export const getDesignTokens = (mode) => ({ + palette: { + primary: { + ...blue, + ...(mode === 'dark' && { + main: blue[400], + }), + }, + divider: mode === 'dark' ? alpha(blue[100], 0.08) : grey[100], + primaryDark: blueDark, + mode, + ...(mode === 'dark' && { + background: { + default: blueDark[800], + paper: blueDark[900], + }, + }), + common: { + black: '#1D1D1D', + }, + text: { + ...(mode === 'light' && { + primary: grey[900], + secondary: grey[700], + }), + ...(mode === 'dark' && { + primary: '#fff', + secondary: grey[400], + }), + }, + grey: { + ...(mode === 'light' && { + main: grey[100], + contrastText: grey[600], + }), + ...(mode === 'dark' && { + main: blueDark[700], + contrastText: grey[600], + }), + }, + error: { + 50: '#FFF0F1', + 100: '#FFDBDE', + 200: '#FFBDC2', + 300: '#FF99A2', + 400: '#FF7A86', + 500: '#FF505F', + main: '#EB0014', // contrast 4.63:1 + 600: '#EB0014', + 700: '#C70011', + 800: '#94000D', + 900: '#570007', + }, + success: { + 50: '#E9FBF0', + 100: '#C6F6D9', + 200: '#9AEFBC', + 300: '#6AE79C', + 400: '#3EE07F', + 500: '#21CC66', + 600: '#1DB45A', + ...(mode === 'light' && { + main: '#1AA251', // contrast 3.31:1 + }), + ...(mode === 'dark' && { + main: '#1DB45A', // contrast 6.17:1 (blueDark.800) + }), + 700: '#1AA251', + 800: '#178D46', + 900: '#0F5C2E', + }, + warning: { + 50: '#FFF9EB', + 100: '#FFF3C1', + 200: '#FFECA1', + 300: '#FFDC48', // vs blueDark900: WCAG 10.4 AAA, APCA 72 Ok for text + 400: '#F4C000', // vs blueDark900: WCAG 6.4 AA normal, APCA 48 Only large text + 500: '#DEA500', // vs blueDark900: WCAG 8 AAA normal, APCA 58 Only large text + main: '#DEA500', + 600: '#D18E00', // vs blueDark900: WCAG 6.4 AA normal, APCA 48 Only large text + 700: '#AB6800', // vs white bg: WCAG 4.4 AA large, APCA 71 Ok for text + 800: '#8C5800', // vs white bg: WCAG 5.9 AAA large, APCA 80 Best for text + 900: '#5A3600', // vs white bg: WCAG 10.7 AAA, APCA 95 Best for text + }, + }, + shape: { + borderRadius: 10, + }, + spacing: 10, + typography: { + fontFamily: ['"IBM Plex Sans"', ...systemFont].join(','), + fontFamilyCode: [ + 'Consolas', + 'Menlo', + 'Monaco', + 'Andale Mono', + 'Ubuntu Mono', + 'monospace', + ].join(','), + fontFamilyTagline: ['"PlusJakartaSans-ExtraBold"', ...systemFont].join(','), + fontFamilySystem: systemFont.join(','), + fontWeightSemiBold: 600, + fontWeightExtraBold: 800, + h1: { + fontFamily: ['"PlusJakartaSans-ExtraBold"', ...systemFont].join(','), + fontSize: 'clamp(2.625rem, 1.2857rem + 3.5714vw, 4rem)', + fontWeight: 800, + lineHeight: 78 / 70, + ...(mode === 'light' && { + color: blueDark[900], + }), + }, + h2: { + fontFamily: ['"PlusJakartaSans-ExtraBold"', ...systemFont].join(','), + fontSize: 'clamp(1.5rem, 0.9643rem + 1.4286vw, 2.25rem)', + fontWeight: 800, + lineHeight: 44 / 36, + color: mode === 'dark' ? grey[100] : blueDark[700], + }, + h3: { + fontFamily: ['"PlusJakartaSans-Bold"', ...systemFont].join(','), + fontSize: defaultTheme.typography.pxToRem(36), + lineHeight: 44 / 36, + letterSpacing: 0.2, + }, + h4: { + fontFamily: ['"PlusJakartaSans-Bold"', ...systemFont].join(','), + fontSize: defaultTheme.typography.pxToRem(28), + lineHeight: 42 / 28, + letterSpacing: 0.2, + }, + h5: { + fontFamily: ['"PlusJakartaSans-Bold"', ...systemFont].join(','), + fontSize: defaultTheme.typography.pxToRem(24), + lineHeight: 36 / 24, + letterSpacing: 0.1, + color: mode === 'dark' ? blue[300] : blue.main, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(20), + lineHeight: 30 / 20, + }, + button: { + textTransform: 'initial', + fontWeight: 700, + letterSpacing: 0, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + lineHeight: 24 / 18, + letterSpacing: 0, + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(16), // 16px + lineHeight: 24 / 16, + letterSpacing: 0, + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), // 14px + lineHeight: 21 / 14, + letterSpacing: 0, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), // 12px + lineHeight: 18 / 12, + letterSpacing: 0, + fontWeight: 700, + }, + allVariants: { + scrollMarginTop: 'calc(var(--MuiDocs-header-height) + 32px)', + }, + }, +}); diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts new file mode 100644 index 00000000000..3db13aa41e4 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts @@ -0,0 +1,231 @@ +import { createTheme, ThemeOptions, alpha } from '@mui/material/styles'; + +const defaultTheme = createTheme(); + +const blue = { + 50: '#F0F7FF', + 100: '#C2E0FF', + 200: '#99CCF3', + 300: '#66B2FF', + 400: '#3399FF', + main: '#007FFF', + 500: '#007FFF', + 600: '#0072E5', // vs blueDark 900: WCAG 4.6 AAA (large), APCA 36 Not for reading text + 700: '#0059B2', + 800: '#004C99', + 900: '#003A75', +}; +const blueDark = { + 50: '#E2EDF8', + 100: '#CEE0F3', + 200: '#91B9E3', + 300: '#5090D3', + main: '#5090D3', + 400: '#265D97', + 500: '#1E4976', + 600: '#173A5E', + 700: '#132F4C', // contrast 13.64:1 + 800: '#001E3C', + 900: '#0A1929', +}; +const grey = { + 50: '#F3F6F9', + 100: '#E7EBF0', + 200: '#E0E3E7', + 300: '#CDD2D7', // vs blueDark 900: WCAG 11.6 AAA, APCA 78 Best for text + 400: '#B2BAC2', // vs blueDark 900: WCAG 9 AAA, APCA 63.3 Ok for text + 500: '#A0AAB4', // vs blueDark 900: WCAG 7.5 AAA, APCA 54.3 Only for large text + 600: '#6F7E8C', // vs white bg: WCAG 4.1 AA, APCA 68.7 Ok for text + 700: '#3E5060', // vs white bg: WCAG 8.3 AAA, APCA 88.7 Best for text + 800: '#2D3843', // vs white bg: WCAG 11.9 AAA, APCA 97.3 Best for text + 900: '#1A2027', +}; + +const systemFont = [ + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', +]; + +export const getDesignTokens = (mode: 'light' | 'dark') => + ({ + palette: { + primary: { + ...blue, + ...(mode === 'dark' && { + main: blue[400], + }), + }, + divider: mode === 'dark' ? alpha(blue[100], 0.08) : grey[100], + primaryDark: blueDark, + mode, + ...(mode === 'dark' && { + background: { + default: blueDark[800], + paper: blueDark[900], + }, + }), + common: { + black: '#1D1D1D', + }, + text: { + ...(mode === 'light' && { + primary: grey[900], + secondary: grey[700], + }), + ...(mode === 'dark' && { + primary: '#fff', + secondary: grey[400], + }), + }, + grey: { + ...(mode === 'light' && { + main: grey[100], + contrastText: grey[600], + }), + ...(mode === 'dark' && { + main: blueDark[700], + contrastText: grey[600], + }), + }, + error: { + 50: '#FFF0F1', + 100: '#FFDBDE', + 200: '#FFBDC2', + 300: '#FF99A2', + 400: '#FF7A86', + 500: '#FF505F', + main: '#EB0014', // contrast 4.63:1 + 600: '#EB0014', + 700: '#C70011', + 800: '#94000D', + 900: '#570007', + }, + success: { + 50: '#E9FBF0', + 100: '#C6F6D9', + 200: '#9AEFBC', + 300: '#6AE79C', + 400: '#3EE07F', + 500: '#21CC66', + 600: '#1DB45A', + ...(mode === 'light' && { + main: '#1AA251', // contrast 3.31:1 + }), + ...(mode === 'dark' && { + main: '#1DB45A', // contrast 6.17:1 (blueDark.800) + }), + 700: '#1AA251', + 800: '#178D46', + 900: '#0F5C2E', + }, + warning: { + 50: '#FFF9EB', + 100: '#FFF3C1', + 200: '#FFECA1', + 300: '#FFDC48', // vs blueDark900: WCAG 10.4 AAA, APCA 72 Ok for text + 400: '#F4C000', // vs blueDark900: WCAG 6.4 AA normal, APCA 48 Only large text + 500: '#DEA500', // vs blueDark900: WCAG 8 AAA normal, APCA 58 Only large text + main: '#DEA500', + 600: '#D18E00', // vs blueDark900: WCAG 6.4 AA normal, APCA 48 Only large text + 700: '#AB6800', // vs white bg: WCAG 4.4 AA large, APCA 71 Ok for text + 800: '#8C5800', // vs white bg: WCAG 5.9 AAA large, APCA 80 Best for text + 900: '#5A3600', // vs white bg: WCAG 10.7 AAA, APCA 95 Best for text + }, + }, + shape: { + borderRadius: 10, + }, + spacing: 10, + typography: { + fontFamily: ['"IBM Plex Sans"', ...systemFont].join(','), + fontFamilyCode: [ + 'Consolas', + 'Menlo', + 'Monaco', + 'Andale Mono', + 'Ubuntu Mono', + 'monospace', + ].join(','), + fontFamilyTagline: ['"PlusJakartaSans-ExtraBold"', ...systemFont].join(','), + fontFamilySystem: systemFont.join(','), + fontWeightSemiBold: 600, + fontWeightExtraBold: 800, + h1: { + fontFamily: ['"PlusJakartaSans-ExtraBold"', ...systemFont].join(','), + fontSize: 'clamp(2.625rem, 1.2857rem + 3.5714vw, 4rem)', + fontWeight: 800, + lineHeight: 78 / 70, + ...(mode === 'light' && { + color: blueDark[900], + }), + }, + h2: { + fontFamily: ['"PlusJakartaSans-ExtraBold"', ...systemFont].join(','), + fontSize: 'clamp(1.5rem, 0.9643rem + 1.4286vw, 2.25rem)', + fontWeight: 800, + lineHeight: 44 / 36, + color: mode === 'dark' ? grey[100] : blueDark[700], + }, + h3: { + fontFamily: ['"PlusJakartaSans-Bold"', ...systemFont].join(','), + fontSize: defaultTheme.typography.pxToRem(36), + lineHeight: 44 / 36, + letterSpacing: 0.2, + }, + h4: { + fontFamily: ['"PlusJakartaSans-Bold"', ...systemFont].join(','), + fontSize: defaultTheme.typography.pxToRem(28), + lineHeight: 42 / 28, + letterSpacing: 0.2, + }, + h5: { + fontFamily: ['"PlusJakartaSans-Bold"', ...systemFont].join(','), + fontSize: defaultTheme.typography.pxToRem(24), + lineHeight: 36 / 24, + letterSpacing: 0.1, + color: mode === 'dark' ? blue[300] : blue.main, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(20), + lineHeight: 30 / 20, + }, + button: { + textTransform: 'initial', + fontWeight: 700, + letterSpacing: 0, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + lineHeight: 24 / 18, + letterSpacing: 0, + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(16), // 16px + lineHeight: 24 / 16, + letterSpacing: 0, + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), // 14px + lineHeight: 21 / 14, + letterSpacing: 0, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), // 12px + lineHeight: 18 / 12, + letterSpacing: 0, + fontWeight: 700, + }, + allVariants: { + scrollMarginTop: 'calc(var(--MuiDocs-header-height) + 32px)', + }, + }, + }) as ThemeOptions; diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index de20480bbeb..4d9d736f6da 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -6,10 +6,46 @@ components: SignInPage, Account # Sign In Page -

A component that renders a sign in page for your application.

+

A component that renders a functional authentication page for your application.

-{{"demo": "BasicSignInPage.js"}} +The `SignInPage` component is a quick way to generate a ready-to-use authentication page with multiple OAuth providers, or a credentials form. -Once signed in, the [``](/toolpad/core/react-account/) component is rendered within the dashboard layout, containing the user's account details as well as an option to sign out. +## OAuth -{{"demo": "../account/AccountSignedIn.js", "iframe": "true" }} +The `SignInPage` component can be set up with an OAuth provider by passing in a list of providers in the `providers` prop, along with a `signIn` function that accepts the `provider` as a parameter. + +{{"demo": "OAuthSignInPage.js"}} + +## Credentials + +To render a username password form, pass in a provider with `credentials` as the `id` property. The `signIn` function will accept a `formData` parameter in this case. + +{{"demo": "CredentialsSignInPage.js"}} + +## Usage with authentication libraries + +### Auth.js + +#### Next.js App Directory + +The component is composable with any authentication library you might want to use. The following is a functional `SignInPage` with [auth.js](https://authjs.dev/) using the Next.js App router and Server actions: + +{{"demo": "AuthJsSignInApp.js"}} + +Use our detailed examples with both the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/playground/nextjs) and [pages directory](https://github.com/mui/mui-toolpad/tree/master/playground/nextjs-pages) to get started using Auth.js with Toolpad Core. + +## Customization + +### Theme and Branding + +Through the `branding` and `theme` props in the [AppProvider](https://mui.com/toolpad/core/react-app-provider/), the `SignInPage` can be customized to match your own branding. + +{{"demo": "BrandingSignInPage.js", "iframe": true }} + +### 🚧 Slots + +The `SignInPage` component will allow passing in custom forms when using the `credentials` provider. This is in progress. + +### 🚧 Layouts + +The `SignInPage` component will have versions with different layouts for authentication - one column, two column and others such. The APIs of these components will be identical. This is in progress. From 739aca85ebd74a89cdee4cd3747ac0fc9f2a1d29 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 13:21:25 -0700 Subject: [PATCH 040/109] fix: Problems with `beta-19` --- playground/nextjs/package.json | 2 +- playground/nextjs/src/auth.ts | 2 ++ pnpm-lock.yaml | 26 ++++++++++++++++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index 115273c28fe..9ab96295893 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -18,7 +18,7 @@ "@types/react-dom": "18.3.0", "eslint-config-next": "14.2.4", "next": "14.2.4", - "next-auth": "5.0.0-beta.19", + "next-auth": "5.0.0-beta.18", "react": "18.3.1", "react-dom": "18.3.1" } diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index f5fd3d75751..1b576e12053 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -15,6 +15,8 @@ const providers: Provider[] = [ }, authorize(c) { if (c.password !== 'password') { + // TODO: Set next-auth version to latest when + // https://github.com/nextauthjs/next-auth/issues/11074 is resolved return null; } return { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f158595c4a4..70611e377be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1209,8 +1209,8 @@ importers: specifier: 14.2.4 version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: - specifier: 5.0.0-beta.19 - version: 5.0.0-beta.19(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: 5.0.0-beta.18 + version: 5.0.0-beta.18(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -7656,6 +7656,22 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} + next-auth@5.0.0-beta.18: + resolution: {integrity: sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + next: ^14 + nodemailer: ^6.6.5 + react: ^18.2.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + next-auth@5.0.0-beta.19: resolution: {integrity: sha512-YHu1igcAxZPh8ZB7GIM93dqgY6gcAzq66FOhQFheAdOx1raxNcApt05nNyNCSB6NegSiyJ4XOPsaNow4pfDmsg==} peerDependencies: @@ -17751,6 +17767,12 @@ snapshots: nested-error-stacks@2.1.1: {} + next-auth@5.0.0-beta.18(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + dependencies: + '@auth/core': 0.31.0 + next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + next-auth@5.0.0-beta.19(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.32.0 From cb15e87a83d6ce123dc4011ebaadae616694a353 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 15:32:00 -0700 Subject: [PATCH 041/109] fix: Drop `required: true` for pages app --- playground/nextjs-pages/src/auth.ts | 15 +++++- playground/nextjs-pages/src/middleware.ts | 6 +++ playground/nextjs-pages/src/pages/_app.tsx | 2 +- .../nextjs-pages/src/pages/auth/signin.tsx | 50 ++++++++++++------- 4 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 playground/nextjs-pages/src/middleware.ts diff --git a/playground/nextjs-pages/src/auth.ts b/playground/nextjs-pages/src/auth.ts index f8e630a242e..a41e94a49b8 100644 --- a/playground/nextjs-pages/src/auth.ts +++ b/playground/nextjs-pages/src/auth.ts @@ -14,9 +14,8 @@ const providers: Provider[] = [ password: { label: 'Password', type: 'password' }, }, authorize(c) { - console.log('credentials', c); if (c.password !== 'password') { - return null; + throw new Error('Invalid password'); } return { id: 'test', @@ -42,4 +41,16 @@ export const { handlers, auth } = NextAuth({ signIn: '/auth/signin', signOut: '/auth/signout', }, + callbacks: { + authorized({ auth: session, request: { nextUrl } }) { + const isLoggedIn = !!session?.user; + const isPublicPage = nextUrl.pathname.startsWith('/public'); + + if (isPublicPage || isLoggedIn) { + return true; + } + + return false; // Redirect unauthenticated users to login page + }, + }, }); diff --git a/playground/nextjs-pages/src/middleware.ts b/playground/nextjs-pages/src/middleware.ts new file mode 100644 index 00000000000..02c48f4db60 --- /dev/null +++ b/playground/nextjs-pages/src/middleware.ts @@ -0,0 +1,6 @@ +export { auth as middleware } from './auth'; + +export const config = { + // https://nextjs.org/docs/app/building-your-application/routing/middleware#matcher + matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)'], +}; diff --git a/playground/nextjs-pages/src/pages/_app.tsx b/playground/nextjs-pages/src/pages/_app.tsx index c2312eb8d85..c2aac60cbb8 100644 --- a/playground/nextjs-pages/src/pages/_app.tsx +++ b/playground/nextjs-pages/src/pages/_app.tsx @@ -51,7 +51,7 @@ function getDefaultLayout(page: React.ReactElement) { } function RequireAuth({ children }: { children: React.ReactNode }) { - const { status } = useSession({ required: true }); + const { status } = useSession(); if (status === 'loading') { return ; diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index 2977aad7677..40bdb7b74fe 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -12,27 +12,43 @@ export default function SignIn({ { - // Strip the `error` query parameter from the URL - // This is useful when the user is redirected back to the page - // after a failed login attempt. - callbackUrl = callbackUrl?.replace(/\?error=.+$/, ''); - - try { + if (provider.id === 'credentials') { const signInResponse = await signIn(provider.id, { - ...(formData && Object.fromEntries(formData)), - redirectTo: callbackUrl ?? '/', + ...Object.fromEntries(formData), + redirect: false, }); - return signInResponse?.ok ? '' : 'Something went wrong.'; - } catch (error) { - if (error instanceof AuthError) { - switch (error.type) { - case 'CredentialsSignin': - return 'Invalid credentials.'; - default: - return 'Something went wrong.'; + if (signInResponse && signInResponse.error) { + // Return the error message if the sign-in failed + if ( + signInResponse.error === 'CredentialsSignin' || + signInResponse.error === 'Configuration' + ) { + return 'Invalid credentials.'; + } + return 'Something went wrong.'; + } else { + // Redirect to the callback URL if the sign-in was successful + window.location.href = callbackUrl ?? '/'; + return ''; + } + } else { + try { + const signInResponse = await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + return signInResponse?.ok ? '' : 'Something went wrong.'; + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong.'; + } } + throw error; } - throw error; } }} /> From 6705a180b1b07743db761564fea0e9aca9be2828 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 15:35:09 -0700 Subject: [PATCH 042/109] fix: Match test with minor UI change --- packages/toolpad-core/src/SignInPage/SignInPage.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx index 7480ee1f0a7..f0962f859ba 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.test.tsx @@ -34,7 +34,7 @@ describe('SignInPage', () => { const emailField = screen.getByRole('textbox', { name: 'Email Address' }); const passwordField = screen.getByLabelText(/Password/); - const signInButton = screen.getByRole('button', { name: 'Sign in with username and password' }); + const signInButton = screen.getByRole('button', { name: 'Sign in' }); await userEvent.type(emailField, 'john@example.com'); await userEvent.type(passwordField, 'thepassword'); From 4d52271ce62eab4ae6d7b2f376d8fea71732f266 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 16:43:39 -0700 Subject: [PATCH 043/109] test: Setup tests for playground Next.js app --- .../src/SignInPage/SignInPage.tsx | 2 +- playground/nextjs/.gitignore | 5 ++ playground/nextjs/package.json | 5 ++ playground/nextjs/playwright.config.ts | 68 +++++++++++++++++++ playground/nextjs/tests/auth.spec.ts | 51 ++++++++++++++ pnpm-lock.yaml | 10 +++ 6 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 playground/nextjs/.gitignore create mode 100644 playground/nextjs/playwright.config.ts create mode 100644 playground/nextjs/tests/auth.spec.ts diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 13a43751c86..6f39541fe46 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -204,7 +204,7 @@ function SignInPage(props: SignInPageProps) { if (credentialsResponse) { notifications.show(credentialsResponse, { severity: 'error', - autoHideDuration: 3000, + autoHideDuration: 30000, }); } }} diff --git a/playground/nextjs/.gitignore b/playground/nextjs/.gitignore new file mode 100644 index 00000000000..68c5d18f00d --- /dev/null +++ b/playground/nextjs/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index 9ab96295893..bddfedd5673 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -13,7 +13,9 @@ "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.16.0", "@mui/material-nextjs": "5.15.11", + "@playwright/test": "1.45.1", "@toolpad/core": "workspace:*", + "@types/node": "20.14.10", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "eslint-config-next": "14.2.4", @@ -21,5 +23,8 @@ "next-auth": "5.0.0-beta.18", "react": "18.3.1", "react-dom": "18.3.1" + }, + "dependencies": { + "playwright": "^1.45.1" } } diff --git a/playground/nextjs/playwright.config.ts b/playground/nextjs/playwright.config.ts new file mode 100644 index 00000000000..3110989dda5 --- /dev/null +++ b/playground/nextjs/playwright.config.ts @@ -0,0 +1,68 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'pnpm dev', + url: 'http:/localhost:3000', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/playground/nextjs/tests/auth.spec.ts b/playground/nextjs/tests/auth.spec.ts new file mode 100644 index 00000000000..782ecbf0c8b --- /dev/null +++ b/playground/nextjs/tests/auth.spec.ts @@ -0,0 +1,51 @@ +import { test, expect, Page } from '@playwright/test'; + +const BASE_URL = process.env.BASE_URL || 'http://localhost:3000'; + +test.describe('Sign In', () => { + let page: Page; + + test.beforeEach(async ({ browser }) => { + page = await browser.newPage(); + }); + + test('credentials successful sign in', async () => { + await page.goto(`${BASE_URL}/auth/signin`); + + await page.fill('input[name="email"]', 'test@example.com'); + await page.fill('input[name="password"]', 'password'); + + const credentialsSignIn = await page.getByRole('button', { + name: 'Sign in', + exact: true, + }); + + await credentialsSignIn.click(); + + await page.waitForNavigation(); + + expect(page.url()).toBe(`${BASE_URL}/`); + }); + + test('failed sign in with incorrect credentials', async () => { + await page.goto(`${BASE_URL}/auth/signin`); + + await page.fill('input[name="email"]', 'wrong@example.com'); + await page.fill('input[name="password"]', 'wrongpassword'); + + const credentialsSignIn = await page.getByRole('button', { + name: 'Sign in', + exact: true, + }); + + await credentialsSignIn.click(); + + await page.waitForSelector('text=Invalid credentials.'); + + expect(page.url()).toBe(`${BASE_URL}/auth/signin`); + }); + + test.afterEach(async () => { + await page.close(); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 70611e377be..6e4e441c722 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1174,6 +1174,10 @@ importers: version: 3.4.3 playground/nextjs: + dependencies: + playwright: + specifier: ^1.45.1 + version: 1.45.1 devDependencies: '@emotion/react': specifier: 11.11.4 @@ -1193,9 +1197,15 @@ importers: '@mui/material-nextjs': specifier: 5.15.11 version: 5.15.11(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@playwright/test': + specifier: 1.45.1 + version: 1.45.1 '@toolpad/core': specifier: workspace:* version: link:../../packages/toolpad-core + '@types/node': + specifier: 20.14.10 + version: 20.14.10 '@types/react': specifier: 18.3.3 version: 18.3.3 From 88ccdd8da3725dc21206c1edb7b735021f339ea8 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 10 Jul 2024 23:57:02 -0700 Subject: [PATCH 044/109] feat: Add playwright tests to playground app --- playground/nextjs/tests/auth.spec.ts | 49 +++++++++++++++++++++------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/playground/nextjs/tests/auth.spec.ts b/playground/nextjs/tests/auth.spec.ts index 782ecbf0c8b..dd3bd311770 100644 --- a/playground/nextjs/tests/auth.spec.ts +++ b/playground/nextjs/tests/auth.spec.ts @@ -2,18 +2,18 @@ import { test, expect, Page } from '@playwright/test'; const BASE_URL = process.env.BASE_URL || 'http://localhost:3000'; -test.describe('Sign In', () => { +test.describe('Credentials Sign In', () => { let page: Page; test.beforeEach(async ({ browser }) => { page = await browser.newPage(); }); - test('credentials successful sign in', async () => { + test('sign in with incorrect credentials displays error notification', async () => { await page.goto(`${BASE_URL}/auth/signin`); - await page.fill('input[name="email"]', 'test@example.com'); - await page.fill('input[name="password"]', 'password'); + await page.fill('input[name="email"]', 'wrong@example.com'); + await page.fill('input[name="password"]', 'wrongpassword'); const credentialsSignIn = await page.getByRole('button', { name: 'Sign in', @@ -22,16 +22,16 @@ test.describe('Sign In', () => { await credentialsSignIn.click(); - await page.waitForNavigation(); + await page.waitForSelector('text=Invalid credentials.'); - expect(page.url()).toBe(`${BASE_URL}/`); + expect(page.url()).toBe(`${BASE_URL}/auth/signin`); }); - test('failed sign in with incorrect credentials', async () => { + test('sign in with correct credentials redirects to home page', async () => { await page.goto(`${BASE_URL}/auth/signin`); - await page.fill('input[name="email"]', 'wrong@example.com'); - await page.fill('input[name="password"]', 'wrongpassword'); + await page.fill('input[name="email"]', 'test@example.com'); + await page.fill('input[name="password"]', 'password'); const credentialsSignIn = await page.getByRole('button', { name: 'Sign in', @@ -40,9 +40,36 @@ test.describe('Sign In', () => { await credentialsSignIn.click(); - await page.waitForSelector('text=Invalid credentials.'); + await page.waitForSelector('text=Welcome to Toolpad, Test User!'); - expect(page.url()).toBe(`${BASE_URL}/auth/signin`); + expect(page.url()).toBe(`${BASE_URL}/`); + }); + + test.afterEach(async () => { + await page.close(); + }); +}); + +test.describe('GitHub Sign In', () => { + let page: Page; + + test.beforeEach(async ({ browser }) => { + page = await browser.newPage(); + }); + + test('OAuth sign in flow is initiated successfully', async () => { + await page.goto(`${BASE_URL}/auth/signin`); + + const githubSignIn = await page.getByRole('button', { + name: 'Sign in with GitHub', + exact: true, + }); + + await githubSignIn.click(); + + await page.waitForSelector( + 'text=Sign in to GitHub to continue to Toolpad Core Next.js Playground', + ); }); test.afterEach(async () => { From 299ef52cc19134eb9df17ad2c42701b07a946468 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 00:21:12 -0700 Subject: [PATCH 045/109] fix: Add playground playwright tests --- package.json | 1 + playground/nextjs/package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 70a045593a1..c9214dc13dc 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "test:integration": "rimraf ./node_modules/.vite && playwright test --config ./test/playwright.config.ts", "test:browser": "FORCE_COLOR=1 pnpm run -r test:browser", "test:argos": "node ./scripts/pushArgos.mjs", + "test:playground:nextjs": "pnpm --filter playground-nextjs test", "test": "lerna run test --stream", "check-types": "lerna run check-types", "toolpad-studio": "node --enable-source-maps packages/toolpad-studio/cli.mjs", diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index bddfedd5673..043a4cde424 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -4,7 +4,8 @@ "private": true, "scripts": { "dev": "next dev", - "lint": "next lint" + "lint": "next lint", + "test": "npx playwright test" }, "devDependencies": { "@emotion/react": "11.11.4", From e9ce8771f3e4ac40769560d59a542d7bd8b27776 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 00:22:47 -0700 Subject: [PATCH 046/109] fix: `proptypes` --- packages/toolpad-core/src/SignInPage/SignInPage.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 6f39541fe46..2299f6bed5e 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -127,6 +127,7 @@ function SignInPage(props: SignInPageProps) { )} + Sign in {branding?.title ? `to ${branding.title}` : null} @@ -183,6 +184,7 @@ function SignInPage(props: SignInPageProps) { {(providers ?? []).length === 1 ? null : ( or )} + { From a34546bae3fc251198ec3e1a24f123cdf9783b5a Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 00:36:23 -0700 Subject: [PATCH 047/109] fix: unnecessary else --- .../nextjs-pages/src/pages/auth/signin.tsx | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/playground/nextjs-pages/src/pages/auth/signin.tsx b/playground/nextjs-pages/src/pages/auth/signin.tsx index 40bdb7b74fe..f4f217fa605 100644 --- a/playground/nextjs-pages/src/pages/auth/signin.tsx +++ b/playground/nextjs-pages/src/pages/auth/signin.tsx @@ -26,29 +26,27 @@ export default function SignIn({ return 'Invalid credentials.'; } return 'Something went wrong.'; - } else { - // Redirect to the callback URL if the sign-in was successful - window.location.href = callbackUrl ?? '/'; - return ''; } - } else { - try { - const signInResponse = await signIn(provider.id, { - ...(formData && Object.fromEntries(formData)), - redirectTo: callbackUrl ?? '/', - }); - return signInResponse?.ok ? '' : 'Something went wrong.'; - } catch (error) { - if (error instanceof AuthError) { - switch (error.type) { - case 'CredentialsSignin': - return 'Invalid credentials.'; - default: - return 'Something went wrong.'; - } + // Redirect to the callback URL if the sign-in was successful + window.location.href = callbackUrl ?? '/'; + return ''; + } + try { + const signInResponse = await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + return signInResponse?.ok ? '' : 'Something went wrong.'; + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong.'; } - throw error; } + throw error; } }} /> From eb544a6f6948d34445f80630e9e1d4a4eaaa0abb Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 00:41:04 -0700 Subject: [PATCH 048/109] fix: lint, ignore unresolved in demos --- docs/data/toolpad/core/components/sign-in-page/actions.js | 2 +- docs/data/toolpad/core/components/sign-in-page/actions.ts | 2 +- docs/data/toolpad/core/components/sign-in-page/auth.js | 1 + docs/data/toolpad/core/components/sign-in-page/auth.ts | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/actions.js b/docs/data/toolpad/core/components/sign-in-page/actions.js index d69b0769851..6742d948031 100644 --- a/docs/data/toolpad/core/components/sign-in-page/actions.js +++ b/docs/data/toolpad/core/components/sign-in-page/actions.js @@ -1,5 +1,5 @@ +/* eslint-disable import/no-unresolved */ 'use server'; - import { AuthError } from 'next-auth'; import { signIn } from './auth'; diff --git a/docs/data/toolpad/core/components/sign-in-page/actions.ts b/docs/data/toolpad/core/components/sign-in-page/actions.ts index b1a2a201eef..16c9260b317 100644 --- a/docs/data/toolpad/core/components/sign-in-page/actions.ts +++ b/docs/data/toolpad/core/components/sign-in-page/actions.ts @@ -1,5 +1,5 @@ +/* eslint-disable import/no-unresolved */ 'use server'; - import { AuthError } from 'next-auth'; import type { AuthProvider } from '@toolpad/core'; import { signIn } from './auth'; diff --git a/docs/data/toolpad/core/components/sign-in-page/auth.js b/docs/data/toolpad/core/components/sign-in-page/auth.js index 335850553d7..a6ce1b9d228 100644 --- a/docs/data/toolpad/core/components/sign-in-page/auth.js +++ b/docs/data/toolpad/core/components/sign-in-page/auth.js @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unresolved */ import NextAuth from 'next-auth'; import GitHub from 'next-auth/providers/github'; import Credentials from 'next-auth/providers/credentials'; diff --git a/docs/data/toolpad/core/components/sign-in-page/auth.ts b/docs/data/toolpad/core/components/sign-in-page/auth.ts index f5fd3d75751..fb6619433e9 100644 --- a/docs/data/toolpad/core/components/sign-in-page/auth.ts +++ b/docs/data/toolpad/core/components/sign-in-page/auth.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unresolved */ import NextAuth from 'next-auth'; import GitHub from 'next-auth/providers/github'; import Credentials from 'next-auth/providers/credentials'; From 1b938cdbd775b49613edd0f99da0979b2fa12f12 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 09:51:24 -0700 Subject: [PATCH 049/109] fix: CI --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9214dc13dc..c3ac651bfb7 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "test:integration": "rimraf ./node_modules/.vite && playwright test --config ./test/playwright.config.ts", "test:browser": "FORCE_COLOR=1 pnpm run -r test:browser", "test:argos": "node ./scripts/pushArgos.mjs", - "test:playground:nextjs": "pnpm --filter playground-nextjs test", + "test:playground:nextjs": "pmpm exec playwright install && pnpm --filter playground-nextjs test", "test": "lerna run test --stream", "check-types": "lerna run check-types", "toolpad-studio": "node --enable-source-maps packages/toolpad-studio/cli.mjs", From 6decf848f4c9ef7ae9f59c2f2646916ce016ae2f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 10:18:29 -0700 Subject: [PATCH 050/109] fix: CI --- .../components/sign-in-page/brandingTheme.ts | 8 ++ pnpm-lock.yaml | 135 +++++++++--------- 2 files changed, 77 insertions(+), 66 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts index 3db13aa41e4..1d2cda41291 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts @@ -65,6 +65,10 @@ export const getDesignTokens = (mode: 'light' | 'dark') => }, divider: mode === 'dark' ? alpha(blue[100], 0.08) : grey[100], primaryDark: blueDark, + background: { + default: mode === 'light' ? grey[50] : blueDark[800], + paper: mode === 'light' ? '#fff' : blueDark[900], + }, mode, ...(mode === 'dark' && { background: { @@ -139,6 +143,10 @@ export const getDesignTokens = (mode: 'light' | 'dark') => 800: '#8C5800', // vs white bg: WCAG 5.9 AAA large, APCA 80 Best for text 900: '#5A3600', // vs white bg: WCAG 10.7 AAA, APCA 95 Best for text }, + action: { + hoverOpacity: 0.08, + disabled: alpha(grey[700], 0.26), + }, }, shape: { borderRadius: 10, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e4e441c722..1310381464c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,7 +101,7 @@ importers: version: https://codeload.github.com/mui/material-ui/tar.gz/987bb036905fdd4474ae5aaee7b2b5a3dc6b9315(@opentelemetry/api@1.9.0)(encoding@0.1.13) '@mui/x-charts': specifier: 7.9.0 - version: 7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@next/eslint-plugin-next': specifier: 14.2.4 version: 14.2.4 @@ -290,10 +290,10 @@ importers: version: 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/docs': specifier: 6.0.0-dev.240424162023-9968b4889d - version: 6.0.0-dev.240424162023-9968b4889d(2gqnrhtignfrrzncodxyqropsm) + version: 6.0.0-dev.240424162023-9968b4889d(vkeimf6pnn6fit3u6ic45qxiyi) '@mui/icons-material': specifier: next - version: 6.0.0-alpha.14(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.0(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/internal-markdown': specifier: ^1.0.1 version: 1.0.7 @@ -302,25 +302,25 @@ importers: version: 5.0.0-beta.46(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/lab': specifier: next - version: 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': specifier: next - version: 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: next - version: 6.0.0-alpha.13(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 6.0.0-alpha.13(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@mui/styles': specifier: next - version: 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) '@mui/system': specifier: next - version: 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': specifier: next - version: 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) '@mui/x-date-pickers': specifier: 7.9.0 - version: 7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-license': specifier: 7.9.0 version: 7.9.0(@types/react@18.3.3)(react@18.3.1) @@ -2634,8 +2634,8 @@ packages: '@types/react': optional: true - '@mui/base@5.0.0-beta.52': - resolution: {integrity: sha512-/oQdkb7EEaPr1qRTyUsqRWGJoJ6FqRB+7qyrlueWr5mCK02qOrgPHJd3WreT4TsF655ZVc840TUBpS+5M6FPyg==} + '@mui/base@5.0.0-beta.53': + resolution: {integrity: sha512-WeLTX9zMQPxZ7w9oitDjxOZeQYDVx8JC/I81NUTdboyI7zp+K0ktpJ79gciruKf5Z9qD01+DfwzEisY05mk3QQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2677,11 +2677,11 @@ packages: '@types/react': optional: true - '@mui/icons-material@6.0.0-alpha.14': - resolution: {integrity: sha512-5PPwxY8DNNnhDBTRxHVgxBi0YrYphhOzcmn04R0OGK5kSHHzAEslEAOLiUtEeJrjBRWyT87KnsZ3IvF/A5rNtw==} + '@mui/icons-material@6.0.0-beta.0': + resolution: {integrity: sha512-eKwh48zOVnfuT5dIifDkPrwiaotHTd/vIvFAxIA7rzQSTRlJLIByUCu5PYdmMS0pbtko7kIER8DLe5nqAXnZHw==} engines: {node: '>=12.0.0'} peerDependencies: - '@mui/material': 6.0.0-alpha.14 + '@mui/material': 6.0.0-beta.0 '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: @@ -2750,13 +2750,14 @@ packages: '@types/react': optional: true - '@mui/lab@6.0.0-alpha.14': - resolution: {integrity: sha512-jIlDAbu5T+NiiPZAlhCrV2wkRKPBUY7TRC/BtMWFvdjjrBmlWldLE0BIFEjoXOZd8Ir/FRsM42WWt4kMz/CsKg==} + '@mui/lab@6.0.0-beta.0': + resolution: {integrity: sha512-WI3EEMFYfFyHox1QdkzOBACKu4DfUNX40klpeHlkbfaJjytdlmc4ZDoJI/aKUjDu/UsG6RulexiMnmomPNunCw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material': ^6.0.0-alpha.14 + '@mui/material': ^6.0.0-beta.0 + '@mui/material-pigment-css': ^6.0.0-alpha.13 '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -2765,6 +2766,8 @@ packages: optional: true '@emotion/styled': optional: true + '@mui/material-pigment-css': + optional: true '@types/react': optional: true @@ -2821,13 +2824,13 @@ packages: '@types/react': optional: true - '@mui/material@6.0.0-alpha.14': - resolution: {integrity: sha512-LlM8pPWyOilUPARWRbQQzzjl+q/0IhO6rteRUrox0FWRaviDciBxUjhLaXV28Vx4/Xy4+bjj0B0H2Uk3pUz1sA==} + '@mui/material@6.0.0-beta.0': + resolution: {integrity: sha512-nWsg+GPaYRFCJ4fcMT1jSklwZRYE9nceM8zsrT/i8M+pMhQNVoPh8cFlUXIiwdEhs1pfQVVtSyqMBHwHZ3Pjgg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@pigment-css/react': ^0.0.16 + '@mui/material-pigment-css': ^6.0.0-alpha.13 '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -2836,7 +2839,7 @@ packages: optional: true '@emotion/styled': optional: true - '@pigment-css/react': + '@mui/material-pigment-css': optional: true '@types/react': optional: true @@ -2866,8 +2869,8 @@ packages: '@types/react': optional: true - '@mui/private-theming@6.0.0-alpha.14': - resolution: {integrity: sha512-CcuIV30FgZOcglQwml49nSANg/e5TIBAttSQDnFJN8AjKtBJ3IjQpS1nqQpaMOq4GZf7VUK5+BtgFPio/6w/Wg==} + '@mui/private-theming@6.0.0-beta.0': + resolution: {integrity: sha512-zBWo9vzsR+GMU6+rMJRJglUV4doghMk9sprfFcsKXlAEKil4EIPSoLJIQAjH4nYlPqqenkiR1YISUUltIsdfdw==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2902,8 +2905,8 @@ packages: '@emotion/styled': optional: true - '@mui/styled-engine@6.0.0-alpha.14': - resolution: {integrity: sha512-0OS1CrHDbfZrhQuXCqNVm7b+ZF4FkBG/w6/emEf865ACHC5k4EqIk31nThuchBZLUtntwvGfD2b+JFDFW3XWlg==} + '@mui/styled-engine@6.0.0-beta.0': + resolution: {integrity: sha512-IehSACg1jxxbrunNbWCMr5Av+dWTrogT4afao5+idhZ6lydbxyIeeta8Gq6ZaF4jLqfwLKRKCy8XMRJ7XifD2A==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -2915,8 +2918,8 @@ packages: '@emotion/styled': optional: true - '@mui/styles@6.0.0-alpha.14': - resolution: {integrity: sha512-wFgBAtekEp3iAi+tnPjpEgqzUkxoQtgYeo6/53qw7J499gIz1rHFup2sqCMZ8xNkZdSsf6a5AK0c2i8mHTgkEA==} + '@mui/styles@6.0.0-beta.0': + resolution: {integrity: sha512-hiWgf0aTwp0FSS2jcbVoPQHk6WeweioCLh9qWGBf53tuCPcOt8r7d6l+OGnQdWcs7kEAGdfuKAD6a5MFdMFDiA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2957,8 +2960,8 @@ packages: '@types/react': optional: true - '@mui/system@6.0.0-alpha.14': - resolution: {integrity: sha512-Ig4h+4PPnv12bTU3EnhYB6strzPGub+g+UgDFmzMQESMEfeU1uasNJuvY4FG4q6UgnQYgB8ZGWYms88c5lPeNg==} + '@mui/system@6.0.0-beta.0': + resolution: {integrity: sha512-QoQ6Mz/iJ9/CVLqmKZYPOk2DzGu1Qm5lk3vp/2CbVM84BdeQkEv+l/GLpF7Ck+G+9ku7YTWeQpi/B7OoMkqHVQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -3001,8 +3004,8 @@ packages: '@types/react': optional: true - '@mui/utils@6.0.0-alpha.14': - resolution: {integrity: sha512-9henSOHSAu+dYDiimxadABzJjiPx6EqzfTdYYldnH+FWWmVieguqrtOfkxo5dHqx9GY++rAOlliM4Xz3PoqVxA==} + '@mui/utils@6.0.0-beta.0': + resolution: {integrity: sha512-Slu5BBN7laJI5hZSQsksNz5DGJrftaDxuJx902Utu+W6Y8mv4dawc1lpYH13PXJHdO3Jw0JjQZwmYYTqMEqN5Q==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -11780,12 +11783,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/base@5.0.0-beta.52(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/base@5.0.0-beta.53(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 @@ -11798,14 +11801,14 @@ snapshots: '@mui/core-downloads-tracker@6.0.0-dev.240424162023-9968b4889d': {} - '@mui/docs@6.0.0-dev.240424162023-9968b4889d(2gqnrhtignfrrzncodxyqropsm)': + '@mui/docs@6.0.0-dev.240424162023-9968b4889d(vkeimf6pnn6fit3u6ic45qxiyi)': dependencies: '@babel/runtime': 7.24.7 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/icons-material': 6.0.0-alpha.14(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/icons-material': 6.0.0-beta.0(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/internal-markdown': 1.0.7 - '@mui/material': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/material': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) clipboard-copy: 4.0.1 clsx: 2.1.1 next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11823,10 +11826,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/icons-material@6.0.0-alpha.14(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/icons-material@6.0.0-beta.0(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@mui/material': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.3 @@ -11909,14 +11912,14 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/lab@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/lab@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@mui/base': 5.0.0-beta.52(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/base': 5.0.0-beta.53(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 @@ -11937,10 +11940,10 @@ snapshots: '@emotion/server': 11.11.0 '@types/react': 18.3.3 - '@mui/material-nextjs@6.0.0-alpha.13(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@6.0.0-alpha.13(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@mui/material': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: @@ -11969,14 +11972,14 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@mui/base': 5.0.0-beta.52(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/base': 5.0.0-beta.53(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/core-downloads-tracker': 6.0.0-dev.240424162023-9968b4889d - '@mui/system': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/system': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 @@ -12023,10 +12026,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/private-theming@6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1)': + '@mui/private-theming@6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@mui/utils': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: @@ -12054,7 +12057,7 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@emotion/cache': 11.11.0 @@ -12065,13 +12068,13 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/styles@6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1)': + '@mui/styles@6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@emotion/hash': 0.9.1 - '@mui/private-theming': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/private-theming': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -12120,13 +12123,13 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/system@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/system@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@mui/private-theming': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) + '@mui/private-theming': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) + '@mui/styled-engine': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.14(@types/react@18.3.3) - '@mui/utils': 6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -12160,7 +12163,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/utils@6.0.0-alpha.14(@types/react@18.3.3)(react@18.3.1)': + '@mui/utils@6.0.0-beta.0(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@types/prop-types': 15.7.12 @@ -12194,11 +12197,11 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mui/x-charts@7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-charts@7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1) '@react-spring/rafz': 9.7.3 @@ -12320,11 +12323,11 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers@7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers@7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-alpha.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1) '@types/react-transition-group': 4.4.10 From c8d611f632d0f776afad665a033bab735fd65b9f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 11:38:55 -0700 Subject: [PATCH 051/109] fix: Add `componentProps` for customization, fix for `autofocus` --- .../sign-in-page/BrandingSignInPage.js | 3 ++ .../sign-in-page/BrandingSignInPage.tsx | 3 ++ .../BrandingSignInPage.tsx.preview | 3 ++ .../sign-in-page/ComponentsPropsSignIn.js | 18 ++++++++++++ .../sign-in-page/ComponentsPropsSignIn.tsx | 18 ++++++++++++ .../ComponentsPropsSignIn.tsx.preview | 9 ++++++ .../components/sign-in-page/brandingTheme.js | 8 +++++ .../components/sign-in-page/sign-in-page.md | 10 +++++-- .../src/SignInPage/SignInPage.tsx | 29 +++++++++++++++++-- 9 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js create mode 100644 docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx create mode 100644 docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js index c00fd332808..2e21c2d419d 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -39,6 +39,9 @@ export default function BrandingSignInPage() { alert(`Signing in with "${provider.name}"`)} providers={providers} + componentProps={{ + email: { autoFocus: false }, + }} /> // preview-end diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx index c00fd332808..2e21c2d419d 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -39,6 +39,9 @@ export default function BrandingSignInPage() { alert(`Signing in with "${provider.name}"`)} providers={providers} + componentProps={{ + email: { autoFocus: false }, + }} /> // preview-end diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview index 53f80ab9b6a..2cb0f13cd8f 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview @@ -2,5 +2,8 @@ alert(`Signing in with "${provider.name}"`)} providers={providers} + componentProps={{ + email: { autoFocus: false }, + }} /> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js new file mode 100644 index 00000000000..12a299c824e --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js @@ -0,0 +1,18 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; + +const providers = [{ id: 'credentials', name: 'Email and Password' }]; + +export default function ComponentsPropsSignIn() { + return ( + alert(`Signing in with "${provider.name}"`)} + componentProps={{ + email: { autoFocus: false, variant: 'standard' }, + password: { variant: 'standard' }, + button: { variant: 'outlined' }, + }} + providers={providers} + /> + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx new file mode 100644 index 00000000000..12a299c824e --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx @@ -0,0 +1,18 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core'; + +const providers = [{ id: 'credentials', name: 'Email and Password' }]; + +export default function ComponentsPropsSignIn() { + return ( + alert(`Signing in with "${provider.name}"`)} + componentProps={{ + email: { autoFocus: false, variant: 'standard' }, + password: { variant: 'standard' }, + button: { variant: 'outlined' }, + }} + providers={providers} + /> + ); +} diff --git a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview new file mode 100644 index 00000000000..c8e1f9cd158 --- /dev/null +++ b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview @@ -0,0 +1,9 @@ + alert(`Signing in with "${provider.name}"`)} + componentProps={{ + email: { autoFocus: false, variant: 'standard' }, + password: { variant: 'standard' }, + button: { variant: 'outlined' }, + }} + providers={providers} +/> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js index f2623327a6d..bec375fdbe3 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js @@ -64,6 +64,10 @@ export const getDesignTokens = (mode) => ({ }, divider: mode === 'dark' ? alpha(blue[100], 0.08) : grey[100], primaryDark: blueDark, + background: { + default: mode === 'light' ? grey[50] : blueDark[800], + paper: mode === 'light' ? '#fff' : blueDark[900], + }, mode, ...(mode === 'dark' && { background: { @@ -138,6 +142,10 @@ export const getDesignTokens = (mode) => ({ 800: '#8C5800', // vs white bg: WCAG 5.9 AAA large, APCA 80 Best for text 900: '#5A3600', // vs white bg: WCAG 10.7 AAA, APCA 95 Best for text }, + action: { + hoverOpacity: 0.08, + disabled: alpha(grey[700], 0.26), + }, }, shape: { borderRadius: 10, diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index 4d9d736f6da..69490f740a8 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -36,15 +36,21 @@ Use our detailed examples with both the [Next.js app directory](https://github.c ## Customization +### Component Props + +`SignInPage` can be customized by passing in `componentProps` to the underlying components of the credentials form. + +{{"demo": "ComponentsPropsSignIn.js"}} + ### Theme and Branding -Through the `branding` and `theme` props in the [AppProvider](https://mui.com/toolpad/core/react-app-provider/), the `SignInPage` can be customized to match your own branding. +Through the `branding` and `theme` props in the [AppProvider](https://mui.com/toolpad/core/react-app-provider/), the `SignInPage` can be customized to match your own styles. {{"demo": "BrandingSignInPage.js", "iframe": true }} ### 🚧 Slots -The `SignInPage` component will allow passing in custom forms when using the `credentials` provider. This is in progress. +To enable deep customization beyond what is possible with custom props, the `SignInPage` component will allow passing in your own forms when using the `credentials` provider. This is in progress. ### 🚧 Layouts diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 2299f6bed5e..b57f7945530 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -10,9 +10,9 @@ import Divider from '@mui/material/Divider'; import FormControlLabel from '@mui/material/FormControlLabel'; import Grid from '@mui/material/Grid'; import Link from '@mui/material/Link'; -import TextField from '@mui/material/TextField'; +import TextField, { TextFieldProps } from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; -import LoadingButton from '@mui/lab/LoadingButton'; +import LoadingButton, { LoadingButtonProps } from '@mui/lab/LoadingButton'; import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; import GitHubIcon from '@mui/icons-material/GitHub'; import PasswordIcon from '@mui/icons-material/Password'; @@ -81,6 +81,18 @@ export interface SignInPageProps { * @default undefined */ signIn?: (provider: AuthProvider, formData?: any, callbackUrl?: string) => void | Promise; + /** + * Props to pass to the constituent components in the credentials form + * @default {} + * @example { email: { autoFocus: false } } + * @example { password: { variant: 'outlined' } } + * @example { email: { autoFocus: false }, password: { variant: 'outlined' } } + */ + componentProps?: { + email?: TextFieldProps; + password?: TextFieldProps; + button?: LoadingButtonProps; + }; } /** @@ -94,7 +106,7 @@ export interface SignInPageProps { * - [SignInPage API](https://mui.com/toolpad/core/api/sign-in-page) */ function SignInPage(props: SignInPageProps) { - const { providers, signIn } = props; + const { providers, signIn, componentProps } = props; const branding = React.useContext(BrandingContext); const credentialsProvider = providers?.find((provider) => provider.id === 'credentials'); const [{ loading, providerId }, setFormStatus] = React.useState<{ @@ -228,6 +240,7 @@ function SignInPage(props: SignInPageProps) { type="email" autoComplete="email" autoFocus + {...componentProps?.email} /> } @@ -268,6 +282,7 @@ function SignInPage(props: SignInPageProps) { filter: 'opacity(1)', }, }} + {...componentProps?.button} > Sign in
@@ -297,6 +312,14 @@ SignInPage.propTypes /* remove-proptypes */ = { // │ These PropTypes are generated from the TypeScript type definitions. │ // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ // └─────────────────────────────────────────────────────────────────────┘ + /** + * Props to pass to the constituent components in the credentials form + * @default {} + * @example { email: { autoFocus: false } } + * @example { password: { variant: 'outlined' } } + * @example { email: { autoFocus: false }, password: { variant: 'outlined' } } + */ + componentProps: PropTypes.object, /** * The list of authentication providers to display. * @default [] From e3b33736e24cc530e0ca11c8c65511cd19c82731 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 11:46:38 -0700 Subject: [PATCH 052/109] fix: Add to API --- docs/pages/toolpad/core/api/sign-in-page.json | 1 + docs/translations/api-docs/sign-in-page/sign-in-page.json | 3 +++ 2 files changed, 4 insertions(+) diff --git a/docs/pages/toolpad/core/api/sign-in-page.json b/docs/pages/toolpad/core/api/sign-in-page.json index 9456827492d..9bc68fbcaad 100644 --- a/docs/pages/toolpad/core/api/sign-in-page.json +++ b/docs/pages/toolpad/core/api/sign-in-page.json @@ -1,5 +1,6 @@ { "props": { + "componentProps": { "type": { "name": "object" }, "default": "{}" }, "providers": { "type": { "name": "arrayOf", "description": "Array<{ id: string, name: string }>" }, "default": "[]" diff --git a/docs/translations/api-docs/sign-in-page/sign-in-page.json b/docs/translations/api-docs/sign-in-page/sign-in-page.json index ef6a6bf5768..cedefd349a7 100644 --- a/docs/translations/api-docs/sign-in-page/sign-in-page.json +++ b/docs/translations/api-docs/sign-in-page/sign-in-page.json @@ -1,6 +1,9 @@ { "componentDescription": "", "propDescriptions": { + "componentProps": { + "description": "Props to pass to the constituent components in the credentials form" + }, "providers": { "description": "The list of authentication providers to display." }, "signIn": { "description": "Callback fired when a user signs in.", From 2976e7ad45a6b4549899cb72e0342da314982cef Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 12:27:40 -0700 Subject: [PATCH 053/109] fix: Runtime error on themed demo --- docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts index 1d2cda41291..ebc28d66336 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts @@ -145,6 +145,7 @@ export const getDesignTokens = (mode: 'light' | 'dark') => }, action: { hoverOpacity: 0.08, + active: grey[700], disabled: alpha(grey[700], 0.26), }, }, From d715b2fe4c55660db9cbb52e52aa8753e4884403 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 12:35:30 -0700 Subject: [PATCH 054/109] fix: Local tests, not for CI --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index c3ac651bfb7..70a045593a1 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "test:integration": "rimraf ./node_modules/.vite && playwright test --config ./test/playwright.config.ts", "test:browser": "FORCE_COLOR=1 pnpm run -r test:browser", "test:argos": "node ./scripts/pushArgos.mjs", - "test:playground:nextjs": "pmpm exec playwright install && pnpm --filter playground-nextjs test", "test": "lerna run test --stream", "check-types": "lerna run check-types", "toolpad-studio": "node --enable-source-maps packages/toolpad-studio/cli.mjs", From 9e9cde5e66c5cd4358efbe537ad1c738b405b2c9 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 12:41:56 -0700 Subject: [PATCH 055/109] fix: `docs:typescript` --- docs/data/toolpad/core/components/sign-in-page/brandingTheme.js | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js index bec375fdbe3..516f05a44a0 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js @@ -144,6 +144,7 @@ export const getDesignTokens = (mode) => ({ }, action: { hoverOpacity: 0.08, + active: grey[700], disabled: alpha(grey[700], 0.26), }, }, From cdb20b541a3fec24e48ee50e703b114f6aa429d6 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 12:43:13 -0700 Subject: [PATCH 056/109] fix: Remove from `CI` --- playground/nextjs/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index 043a4cde424..bddfedd5673 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -4,8 +4,7 @@ "private": true, "scripts": { "dev": "next dev", - "lint": "next lint", - "test": "npx playwright test" + "lint": "next lint" }, "devDependencies": { "@emotion/react": "11.11.4", From a0316569b6e803208e8db72d8881390274097be8 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 13:36:50 -0700 Subject: [PATCH 057/109] fix: `mode` === "system" causing `palette` mal-formed --- .../core/components/sign-in-page/BrandingSignInPage.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx index 2e21c2d419d..955b5c76c95 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -23,8 +23,9 @@ const BRANDING = { }; export default function BrandingSignInPage() { - const { mode } = useColorSchemeShim(); - const brandingDesignTokens = getDesignTokens(mode); + const { mode, systemMode } = useColorSchemeShim(); + const calculatedMode = mode === 'system' ? systemMode : mode; + const brandingDesignTokens = getDesignTokens(calculatedMode); const THEME = createTheme({ ...brandingDesignTokens, palette: { From 5dc229f1559c22e87bfe68ad5d86ec58038be6ff Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 13:37:09 -0700 Subject: [PATCH 058/109] fix: Don't make page scroll by default --- .../core/components/sign-in-page/CredentialsSignInPage.js | 3 +++ .../core/components/sign-in-page/CredentialsSignInPage.tsx | 3 +++ .../components/sign-in-page/CredentialsSignInPage.tsx.preview | 3 +++ 3 files changed, 9 insertions(+) diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js index 26e79f7cee4..f4949b517f5 100644 --- a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js @@ -8,6 +8,9 @@ export default function CredentialsSignInPage() { alert(`Signing in with "${provider.name}"`)} providers={providers} + componentProps={{ + email: { autoFocus: false }, + }} /> ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx index 26e79f7cee4..f4949b517f5 100644 --- a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx @@ -8,6 +8,9 @@ export default function CredentialsSignInPage() { alert(`Signing in with "${provider.name}"`)} providers={providers} + componentProps={{ + email: { autoFocus: false }, + }} /> ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview index 343cf4b4b00..07b7053c7be 100644 --- a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview @@ -1,4 +1,7 @@ alert(`Signing in with "${provider.name}"`)} providers={providers} + componentProps={{ + email: { autoFocus: false }, + }} /> \ No newline at end of file From 93f91d6ac2d44fb62992d68cef9ad752d8a07d60 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 13:44:08 -0700 Subject: [PATCH 059/109] fix: This should be a pre-commit hook --- .../core/components/sign-in-page/BrandingSignInPage.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js index 2e21c2d419d..955b5c76c95 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -23,8 +23,9 @@ const BRANDING = { }; export default function BrandingSignInPage() { - const { mode } = useColorSchemeShim(); - const brandingDesignTokens = getDesignTokens(mode); + const { mode, systemMode } = useColorSchemeShim(); + const calculatedMode = mode === 'system' ? systemMode : mode; + const brandingDesignTokens = getDesignTokens(calculatedMode); const THEME = createTheme({ ...brandingDesignTokens, palette: { From f3cc43f763db416f94e600fe40b767f5e9259ae4 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 14:34:38 -0700 Subject: [PATCH 060/109] fix: Use Icon components --- .../src/SignInPage/SignInPage.tsx | 28 +++---------------- 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index b57f7945530..195e832f62e 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -16,6 +16,8 @@ import LoadingButton, { LoadingButtonProps } from '@mui/lab/LoadingButton'; import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; import GitHubIcon from '@mui/icons-material/GitHub'; import PasswordIcon from '@mui/icons-material/Password'; +import GoogleIcon from '@mui/icons-material/Google'; +import FacebookIcon from '@mui/icons-material/Facebook'; import Stack from '@mui/material/Stack'; import { BrandingContext } from '../AppProvider'; import { useNotifications } from '../useNotifications'; @@ -23,30 +25,8 @@ import { useNotifications } from '../useNotifications'; const IconProviderMap = new Map([ ['github', ], ['credentials', ], - [ - 'google', - Google logo, - ], - [ - 'facebook', - Facebook logo, - ], + ['google', ], + ['facebook', ], ]); export interface AuthProvider { From 5255d078d830bacd20daf69d720fc7826016250c Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 14:34:51 -0700 Subject: [PATCH 061/109] fix: More fixes to the branding demo --- .../core/components/sign-in-page/AuthJsSignInApp.js | 12 +++++++++++- .../components/sign-in-page/AuthJsSignInApp.tsx | 12 +++++++++++- .../sign-in-page/AuthJsSignInApp.tsx.preview | 10 +++++++++- .../components/sign-in-page/BrandingSignInPage.js | 1 + .../components/sign-in-page/BrandingSignInPage.tsx | 2 +- .../core/components/sign-in-page/brandingTheme.js | 13 ++++++++++--- .../core/components/sign-in-page/brandingTheme.ts | 13 ++++++++++--- .../core/components/sign-in-page/sign-in-page.md | 2 +- 8 files changed, 54 insertions(+), 11 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js index 4061486ecd4..6bc04bb3e66 100644 --- a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js @@ -4,5 +4,15 @@ import { providerMap } from './auth'; import { authenticate } from './actions'; export default function AuthJsSignInApp() { - return ; + return ( + + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx index 4061486ecd4..6bc04bb3e66 100644 --- a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx @@ -4,5 +4,15 @@ import { providerMap } from './auth'; import { authenticate } from './actions'; export default function AuthJsSignInApp() { - return ; + return ( + + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview index d96a675813f..62528ee877d 100644 --- a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview @@ -1 +1,9 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js index 955b5c76c95..7da8facffde 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -25,6 +25,7 @@ const BRANDING = { export default function BrandingSignInPage() { const { mode, systemMode } = useColorSchemeShim(); const calculatedMode = mode === 'system' ? systemMode : mode; + console.log('calcMode', calculatedMode); const brandingDesignTokens = getDesignTokens(calculatedMode); const THEME = createTheme({ ...brandingDesignTokens, diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx index 955b5c76c95..7bbb3fcd0aa 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -30,7 +30,7 @@ export default function BrandingSignInPage() { ...brandingDesignTokens, palette: { ...brandingDesignTokens.palette, - mode, + mode: calculatedMode, }, }); diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js index 516f05a44a0..e8cead0dc3d 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js @@ -143,9 +143,16 @@ export const getDesignTokens = (mode) => ({ 900: '#5A3600', // vs white bg: WCAG 10.7 AAA, APCA 95 Best for text }, action: { - hoverOpacity: 0.08, - active: grey[700], - disabled: alpha(grey[700], 0.26), + ...(mode === 'dark' && { + hoverOpacity: 0.08, + active: grey[700], + disabled: grey[200], + }), + ...(mode === 'light' && { + hoverOpacity: 0.9, + active: grey[700], + disabled: alpha(grey[700], 0.3), + }), }, }, shape: { diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts index ebc28d66336..781e1064181 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts @@ -144,9 +144,16 @@ export const getDesignTokens = (mode: 'light' | 'dark') => 900: '#5A3600', // vs white bg: WCAG 10.7 AAA, APCA 95 Best for text }, action: { - hoverOpacity: 0.08, - active: grey[700], - disabled: alpha(grey[700], 0.26), + ...(mode === 'dark' && { + hoverOpacity: 0.08, + active: grey[700], + disabled: grey[200], + }), + ...(mode === 'light' && { + hoverOpacity: 0.04, + active: grey[700], + disabled: alpha(grey[700], 0.3), + }), }, }, shape: { diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index 69490f740a8..37fc26f06f5 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -46,7 +46,7 @@ Use our detailed examples with both the [Next.js app directory](https://github.c Through the `branding` and `theme` props in the [AppProvider](https://mui.com/toolpad/core/react-app-provider/), the `SignInPage` can be customized to match your own styles. -{{"demo": "BrandingSignInPage.js", "iframe": true }} +{{"demo": "BrandingSignInPage.js"}} ### 🚧 Slots From 1c0c15dc6e69691adb6833d81e224c6c03f64964 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 15:07:08 -0700 Subject: [PATCH 062/109] fix: `mode` should never be `null` --- .../core/components/sign-in-page/BrandingSignInPage.js | 5 ++--- .../core/components/sign-in-page/BrandingSignInPage.tsx | 2 +- .../toolpad/core/components/sign-in-page/brandingTheme.js | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js index 7da8facffde..b8afb2ddab6 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -24,14 +24,13 @@ const BRANDING = { export default function BrandingSignInPage() { const { mode, systemMode } = useColorSchemeShim(); - const calculatedMode = mode === 'system' ? systemMode : mode; - console.log('calcMode', calculatedMode); + const calculatedMode = (mode === 'system' ? systemMode : mode) ?? 'light'; const brandingDesignTokens = getDesignTokens(calculatedMode); const THEME = createTheme({ ...brandingDesignTokens, palette: { ...brandingDesignTokens.palette, - mode, + mode: calculatedMode, }, }); diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx index 7bbb3fcd0aa..b8afb2ddab6 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -24,7 +24,7 @@ const BRANDING = { export default function BrandingSignInPage() { const { mode, systemMode } = useColorSchemeShim(); - const calculatedMode = mode === 'system' ? systemMode : mode; + const calculatedMode = (mode === 'system' ? systemMode : mode) ?? 'light'; const brandingDesignTokens = getDesignTokens(calculatedMode); const THEME = createTheme({ ...brandingDesignTokens, diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js index e8cead0dc3d..3acb8dee83d 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js @@ -149,7 +149,7 @@ export const getDesignTokens = (mode) => ({ disabled: grey[200], }), ...(mode === 'light' && { - hoverOpacity: 0.9, + hoverOpacity: 0.04, active: grey[700], disabled: alpha(grey[700], 0.3), }), From 54f26d305e65ea889471ae8605b7bcf103396d49 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 16:51:05 -0700 Subject: [PATCH 063/109] feat: Add latest version to core docs --- docs/pages/_app.js | 5 +++-- packages/toolpad-core/src/index.ts | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/pages/_app.js b/docs/pages/_app.js index 2073dcfa55e..92b5b4cf176 100644 --- a/docs/pages/_app.js +++ b/docs/pages/_app.js @@ -19,6 +19,7 @@ import findActivePage from 'docs/src/modules/utils/findActivePage'; import { pathnameToLanguage } from 'docs/src/modules/utils/helpers'; import getProductInfoFromUrl from 'docs/src/modules/utils/getProductInfoFromUrl'; import toolpadPkgJson from '@toolpad/studio/package.json'; +import { version as toolpadCoreVersion } from '@toolpad/core'; import { DocsProvider } from '@mui/docs/DocsProvider'; import toolpadStudioPages from '../data/toolpad/studio/pages'; import toolpadCorePages from '../data/toolpad/core/pages'; @@ -216,7 +217,7 @@ function AppWrapper(props) { productIdentifier = { metadata: '', name: 'Toolpad Core', - versions: [{ text: `v0.0.1`, current: true }], + versions: [{ text: `v${toolpadCoreVersion}`, current: true }], }; pages = toolpadCorePages; } @@ -225,7 +226,7 @@ function AppWrapper(props) { productIdentifier = { metadata: '', name: 'Toolpad Core', - versions: [{ text: `v0.0.1`, current: true }], + versions: [{ text: `v${toolpadCoreVersion}`, current: true }], }; pages = toolpadCorePages; } else if (productId === 'toolpad-studio') { diff --git a/packages/toolpad-core/src/index.ts b/packages/toolpad-core/src/index.ts index adda8bde1bc..7d1d7047abd 100644 --- a/packages/toolpad-core/src/index.ts +++ b/packages/toolpad-core/src/index.ts @@ -1,3 +1,9 @@ +import * as packageJson from '../package.json'; + +const version = packageJson.version; + +export { version }; + export * from './AppProvider'; export * from './DashboardLayout'; From 361e2b2084a6d1ccf22c30f57f742af828be153f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 16:55:53 -0700 Subject: [PATCH 064/109] fix: Add auth examples and update docs --- .../components/sign-in-page/sign-in-page.md | 2 +- .../static/toolpad/docs/core/auth-next.png | Bin 0 -> 162799 bytes .../components/ExamplesGrid/ExamplesGrid.tsx | 2 +- .../components/ExamplesGrid/core-examples.ts | 14 +++ .../core-auth-nextjs-pages/.eslintrc.json | 3 + examples/core-auth-nextjs-pages/README.md | 58 ++++++++++ examples/core-auth-nextjs-pages/next-env.d.ts | 6 ++ .../core-auth-nextjs-pages/next.config.mjs | 6 ++ examples/core-auth-nextjs-pages/package.json | 24 +++++ .../src/app/api/auth/[...nextauth]/route.ts | 3 + examples/core-auth-nextjs-pages/src/auth.ts | 56 ++++++++++ .../core-auth-nextjs-pages/src/middleware.ts | 6 ++ .../core-auth-nextjs-pages/src/pages/_app.tsx | 102 ++++++++++++++++++ .../src/pages/_document.tsx | 27 +++++ .../src/pages/auth/signin.tsx | 75 +++++++++++++ .../src/pages/index.tsx | 21 ++++ .../src/pages/orders/index.tsx | 21 ++++ examples/core-auth-nextjs-pages/tsconfig.json | 23 ++++ examples/core-auth-nextjs/.eslintrc.json | 3 + examples/core-auth-nextjs/.gitignore | 3 + examples/core-auth-nextjs/README.md | 58 ++++++++++ examples/core-auth-nextjs/next-env.d.ts | 5 + examples/core-auth-nextjs/next.config.mjs | 4 + examples/core-auth-nextjs/package.json | 26 +++++ .../src/app/(dashboard)/layout.tsx | 6 ++ .../src/app/(dashboard)/orders/page.tsx | 21 ++++ .../src/app/(dashboard)/page.tsx | 24 +++++ examples/core-auth-nextjs/src/app/actions.ts | 28 +++++ .../src/app/api/auth/[...nextauth]/route.ts | 3 + .../src/app/auth/signin/page.tsx | 8 ++ examples/core-auth-nextjs/src/app/layout.tsx | 57 ++++++++++ .../src/app/public/layout.tsx | 6 ++ .../core-auth-nextjs/src/app/public/page.tsx | 21 ++++ examples/core-auth-nextjs/src/auth.ts | 57 ++++++++++ examples/core-auth-nextjs/src/middleware.ts | 6 ++ examples/core-auth-nextjs/tsconfig.json | 23 ++++ 36 files changed, 806 insertions(+), 2 deletions(-) create mode 100644 docs/public/static/toolpad/docs/core/auth-next.png create mode 100644 examples/core-auth-nextjs-pages/.eslintrc.json create mode 100644 examples/core-auth-nextjs-pages/README.md create mode 100644 examples/core-auth-nextjs-pages/next-env.d.ts create mode 100644 examples/core-auth-nextjs-pages/next.config.mjs create mode 100644 examples/core-auth-nextjs-pages/package.json create mode 100644 examples/core-auth-nextjs-pages/src/app/api/auth/[...nextauth]/route.ts create mode 100644 examples/core-auth-nextjs-pages/src/auth.ts create mode 100644 examples/core-auth-nextjs-pages/src/middleware.ts create mode 100644 examples/core-auth-nextjs-pages/src/pages/_app.tsx create mode 100644 examples/core-auth-nextjs-pages/src/pages/_document.tsx create mode 100644 examples/core-auth-nextjs-pages/src/pages/auth/signin.tsx create mode 100644 examples/core-auth-nextjs-pages/src/pages/index.tsx create mode 100644 examples/core-auth-nextjs-pages/src/pages/orders/index.tsx create mode 100644 examples/core-auth-nextjs-pages/tsconfig.json create mode 100644 examples/core-auth-nextjs/.eslintrc.json create mode 100644 examples/core-auth-nextjs/.gitignore create mode 100644 examples/core-auth-nextjs/README.md create mode 100644 examples/core-auth-nextjs/next-env.d.ts create mode 100644 examples/core-auth-nextjs/next.config.mjs create mode 100644 examples/core-auth-nextjs/package.json create mode 100644 examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx create mode 100644 examples/core-auth-nextjs/src/app/(dashboard)/orders/page.tsx create mode 100644 examples/core-auth-nextjs/src/app/(dashboard)/page.tsx create mode 100644 examples/core-auth-nextjs/src/app/actions.ts create mode 100644 examples/core-auth-nextjs/src/app/api/auth/[...nextauth]/route.ts create mode 100644 examples/core-auth-nextjs/src/app/auth/signin/page.tsx create mode 100644 examples/core-auth-nextjs/src/app/layout.tsx create mode 100644 examples/core-auth-nextjs/src/app/public/layout.tsx create mode 100644 examples/core-auth-nextjs/src/app/public/page.tsx create mode 100644 examples/core-auth-nextjs/src/auth.ts create mode 100644 examples/core-auth-nextjs/src/middleware.ts create mode 100644 examples/core-auth-nextjs/tsconfig.json diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index 37fc26f06f5..e84a8e6c0c5 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -32,7 +32,7 @@ The component is composable with any authentication library you might want to us {{"demo": "AuthJsSignInApp.js"}} -Use our detailed examples with both the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/playground/nextjs) and [pages directory](https://github.com/mui/mui-toolpad/tree/master/playground/nextjs-pages) to get started using Auth.js with Toolpad Core. +Use our detailed examples with both the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) and [pages directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs-pages/) to get started using Auth.js with Toolpad Core. ## Customization diff --git a/docs/public/static/toolpad/docs/core/auth-next.png b/docs/public/static/toolpad/docs/core/auth-next.png new file mode 100644 index 0000000000000000000000000000000000000000..57238099e1b27278bad0be907621b7bb048e0ce3 GIT binary patch literal 162799 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%0DEMs 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 P&!(qiv_D(>*oA)r4Vbr5 literal 0 HcmV?d00001 diff --git a/docs/src/modules/components/ExamplesGrid/ExamplesGrid.tsx b/docs/src/modules/components/ExamplesGrid/ExamplesGrid.tsx index 9026b6ebd12..2267030526e 100644 --- a/docs/src/modules/components/ExamplesGrid/ExamplesGrid.tsx +++ b/docs/src/modules/components/ExamplesGrid/ExamplesGrid.tsx @@ -58,7 +58,7 @@ function Templates({ examplesFile }: TemplatesProps) { component="a" image={example.src} title={example.description} - href={example.href} + href={example.href || example.source} rel="nofollow" sx={(theme) => ({ height: 0, diff --git a/docs/src/modules/components/ExamplesGrid/core-examples.ts b/docs/src/modules/components/ExamplesGrid/core-examples.ts index 72b0d3df63e..b9123590bf2 100644 --- a/docs/src/modules/components/ExamplesGrid/core-examples.ts +++ b/docs/src/modules/components/ExamplesGrid/core-examples.ts @@ -8,5 +8,19 @@ export default function examples() { href: 'https://mui.com/toolpad/core/introduction/tutorial/', source: 'https://github.com/mui/mui-toolpad/tree/master/examples/core-tutorial', }, + { + title: 'Auth.js with Next.js App router', + description: + 'This app shows you to how to get started using Toolpad Core with Auth.js and the Next.js App router', + src: '/static/toolpad/docs/core/auth-next.png', + source: 'https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs', + }, + { + title: 'Auth.js with Next.js Pages router', + description: + 'This app shows you to how to get started using Toolpad Core with Auth.js and the Next.js Pages router', + src: '/static/toolpad/docs/core/auth-next.png', + source: 'https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs-pages', + }, ]; } diff --git a/examples/core-auth-nextjs-pages/.eslintrc.json b/examples/core-auth-nextjs-pages/.eslintrc.json new file mode 100644 index 00000000000..bffb357a712 --- /dev/null +++ b/examples/core-auth-nextjs-pages/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/examples/core-auth-nextjs-pages/README.md b/examples/core-auth-nextjs-pages/README.md new file mode 100644 index 00000000000..5579436a130 --- /dev/null +++ b/examples/core-auth-nextjs-pages/README.md @@ -0,0 +1,58 @@ +# Toolpad Core Playground - Next.js Pages Router + +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Setting up + +The project contains an `.env.local` with the following variables: + +``` +AUTH_SECRET= +AUTH_GITHUB_ID= +AUTH_GITHUB_SECRET= +``` + +You must pass values to them before running this project. + +### AUTH_SECRET + +`AUTH_SECRET` is a random value used by the Auth.js to encrypt tokens and email verification hashes. (See [Deployment](https://authjs.dev/getting-started/deployment) to learn more). You can generate one via running: + +```bash +npx auth secret +``` + +### GitHub configuration + +To get the required credentials from GitHub, we need to create an application in their developer settings. Read this [detailed guide on Auth.js](https://authjs.dev/guides/configuring-github) on how to obtain those. + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/examples/core-auth-nextjs-pages/next-env.d.ts b/examples/core-auth-nextjs-pages/next-env.d.ts new file mode 100644 index 00000000000..fd36f9494e2 --- /dev/null +++ b/examples/core-auth-nextjs-pages/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/core-auth-nextjs-pages/next.config.mjs b/examples/core-auth-nextjs-pages/next.config.mjs new file mode 100644 index 00000000000..d5456a15d4a --- /dev/null +++ b/examples/core-auth-nextjs-pages/next.config.mjs @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +}; + +export default nextConfig; diff --git a/examples/core-auth-nextjs-pages/package.json b/examples/core-auth-nextjs-pages/package.json new file mode 100644 index 00000000000..61c20014bea --- /dev/null +++ b/examples/core-auth-nextjs-pages/package.json @@ -0,0 +1,24 @@ +{ + "name": "playground-nextjs-pages", + "version": "0.3.0", + "private": true, + "scripts": { + "dev": "next dev", + "lint": "next lint" + }, + "devDependencies": { + "@emotion/react": "11.11.4", + "@emotion/styled": "11.11.5", + "@mui/icons-material": "5.16.0", + "@mui/material": "5.16.0", + "@mui/material-nextjs": "5.15.11", + "next-auth": "5.0.0-beta.19", + "@toolpad/core": "0.3.0", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "eslint-config-next": "14.2.4", + "next": "14.2.4", + "react": "18.3.1", + "react-dom": "18.3.1" + } +} diff --git a/examples/core-auth-nextjs-pages/src/app/api/auth/[...nextauth]/route.ts b/examples/core-auth-nextjs-pages/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 00000000000..ca225652075 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,3 @@ +import { handlers } from '../../../../auth'; + +export const { GET, POST } = handlers; diff --git a/examples/core-auth-nextjs-pages/src/auth.ts b/examples/core-auth-nextjs-pages/src/auth.ts new file mode 100644 index 00000000000..a41e94a49b8 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/auth.ts @@ -0,0 +1,56 @@ +import NextAuth from 'next-auth'; +import GitHub from 'next-auth/providers/github'; +import Credentials from 'next-auth/providers/credentials'; +import type { Provider } from 'next-auth/providers'; + +const providers: Provider[] = [ + GitHub({ + clientId: process.env.AUTH_GITHUB_ID, + clientSecret: process.env.AUTH_GITHUB_SECRET, + }), + Credentials({ + credentials: { + email: { label: 'Email Address', type: 'email' }, + password: { label: 'Password', type: 'password' }, + }, + authorize(c) { + if (c.password !== 'password') { + throw new Error('Invalid password'); + } + return { + id: 'test', + name: 'Test User', + email: 'test@example.com', + }; + }, + }), +]; + +export const providerMap = providers.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } + return { id: provider.id, name: provider.name }; +}); + +export const { handlers, auth } = NextAuth({ + providers, + secret: process.env.AUTH_SECRET, + pages: { + signIn: '/auth/signin', + signOut: '/auth/signout', + }, + callbacks: { + authorized({ auth: session, request: { nextUrl } }) { + const isLoggedIn = !!session?.user; + const isPublicPage = nextUrl.pathname.startsWith('/public'); + + if (isPublicPage || isLoggedIn) { + return true; + } + + return false; // Redirect unauthenticated users to login page + }, + }, +}); diff --git a/examples/core-auth-nextjs-pages/src/middleware.ts b/examples/core-auth-nextjs-pages/src/middleware.ts new file mode 100644 index 00000000000..02c48f4db60 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/middleware.ts @@ -0,0 +1,6 @@ +export { auth as middleware } from './auth'; + +export const config = { + // https://nextjs.org/docs/app/building-your-application/routing/middleware#matcher + matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)'], +}; diff --git a/examples/core-auth-nextjs-pages/src/pages/_app.tsx b/examples/core-auth-nextjs-pages/src/pages/_app.tsx new file mode 100644 index 00000000000..c2aac60cbb8 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/pages/_app.tsx @@ -0,0 +1,102 @@ +import * as React from 'react'; +import { AppProvider } from '@toolpad/core/nextjs'; +import { DashboardLayout } from '@toolpad/core/DashboardLayout'; +import Head from 'next/head'; +import { AppCacheProvider } from '@mui/material-nextjs/v14-pagesRouter'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; +import type { NextPage } from 'next'; +import type { AppProps } from 'next/app'; +import type { Navigation } from '@toolpad/core'; +import { SessionProvider, signIn, signOut, useSession } from 'next-auth/react'; +import LinearProgress from '@mui/material/LinearProgress'; + +export type NextPageWithLayout

= NextPage & { + getLayout?: (page: React.ReactElement) => React.ReactNode; + requireAuth?: boolean; +}; + +type AppPropsWithLayout = AppProps & { + Component: NextPageWithLayout; +}; + +const NAVIGATION: Navigation = [ + { + kind: 'header', + title: 'Main items', + }, + { + slug: '/', + title: 'Dashboard', + icon: , + }, + { + slug: '/orders', + title: 'Orders', + icon: , + }, +]; + +const BRANDING = { + title: 'My Toolpad Core App', +}; + +const AUTHENTICATION = { + signIn, + signOut, +}; + +function getDefaultLayout(page: React.ReactElement) { + return {page}; +} + +function RequireAuth({ children }: { children: React.ReactNode }) { + const { status } = useSession(); + + if (status === 'loading') { + return ; + } + + return children; +} + +function AppLayout({ children }: { children: React.ReactNode }) { + const { data: session } = useSession(); + return ( + + + + + + {children} + + + ); +} + +export default function App(props: AppPropsWithLayout) { + const { + Component, + pageProps: { session, ...pageProps }, + } = props; + + const getLayout = Component.getLayout ?? getDefaultLayout; + const requireAuth = Component.requireAuth ?? true; + + let pageContent = getLayout(); + if (requireAuth) { + pageContent = {pageContent}; + } + pageContent = {pageContent}; + + return ( + + {pageContent} + + ); +} diff --git a/examples/core-auth-nextjs-pages/src/pages/_document.tsx b/examples/core-auth-nextjs-pages/src/pages/_document.tsx new file mode 100644 index 00000000000..be16e742177 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/pages/_document.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import { Html, Head, Main, NextScript, DocumentProps, DocumentContext } from 'next/document'; +import { + DocumentHeadTags, + DocumentHeadTagsProps, + documentGetInitialProps, +} from '@mui/material-nextjs/v14-pagesRouter'; + +export default function Document(props: DocumentProps & DocumentHeadTagsProps) { + return ( + + + + + + +

+ + + + ); +} + +Document.getInitialProps = async (ctx: DocumentContext) => { + const finalProps = await documentGetInitialProps(ctx); + return finalProps; +}; diff --git a/examples/core-auth-nextjs-pages/src/pages/auth/signin.tsx b/examples/core-auth-nextjs-pages/src/pages/auth/signin.tsx new file mode 100644 index 00000000000..f4f217fa605 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/pages/auth/signin.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; +import type { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next'; +import { AuthError } from 'next-auth'; +import { signIn } from 'next-auth/react'; +import { SignInPage } from '@toolpad/core/SignInPage'; +import { auth, providerMap } from '../../auth'; + +export default function SignIn({ + providers, +}: InferGetServerSidePropsType) { + return ( + { + if (provider.id === 'credentials') { + const signInResponse = await signIn(provider.id, { + ...Object.fromEntries(formData), + redirect: false, + }); + if (signInResponse && signInResponse.error) { + // Return the error message if the sign-in failed + if ( + signInResponse.error === 'CredentialsSignin' || + signInResponse.error === 'Configuration' + ) { + return 'Invalid credentials.'; + } + return 'Something went wrong.'; + } + // Redirect to the callback URL if the sign-in was successful + window.location.href = callbackUrl ?? '/'; + return ''; + } + try { + const signInResponse = await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + return signInResponse?.ok ? '' : 'Something went wrong.'; + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong.'; + } + } + throw error; + } + }} + /> + ); +} + +SignIn.getLayout = (page: React.ReactNode) => page; + +SignIn.requireAuth = false; + +export async function getServerSideProps(context: GetServerSidePropsContext) { + const session = await auth(context); + + // If the user is already logged in, redirect. + // Note: Make sure not to redirect to the same page + // To avoid an infinite loop! + if (session) { + return { redirect: { destination: '/' } }; + } + + return { + props: { + providers: providerMap, + }, + }; +} diff --git a/examples/core-auth-nextjs-pages/src/pages/index.tsx b/examples/core-auth-nextjs-pages/src/pages/index.tsx new file mode 100644 index 00000000000..761eebce518 --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/pages/index.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; + +export default function HomePage() { + return ( + + + Welcome to Toolpad! + + + ); +} diff --git a/examples/core-auth-nextjs-pages/src/pages/orders/index.tsx b/examples/core-auth-nextjs-pages/src/pages/orders/index.tsx new file mode 100644 index 00000000000..9cb3b092c9b --- /dev/null +++ b/examples/core-auth-nextjs-pages/src/pages/orders/index.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; + +export default function OrdersPage() { + return ( + + + Welcome to the Toolpad orders! + + + ); +} diff --git a/examples/core-auth-nextjs-pages/tsconfig.json b/examples/core-auth-nextjs-pages/tsconfig.json new file mode 100644 index 00000000000..bb5584ed1a4 --- /dev/null +++ b/examples/core-auth-nextjs-pages/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/core-auth-nextjs/.eslintrc.json b/examples/core-auth-nextjs/.eslintrc.json new file mode 100644 index 00000000000..bffb357a712 --- /dev/null +++ b/examples/core-auth-nextjs/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/examples/core-auth-nextjs/.gitignore b/examples/core-auth-nextjs/.gitignore new file mode 100644 index 00000000000..b95cfcec49a --- /dev/null +++ b/examples/core-auth-nextjs/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +/blob-report/ + diff --git a/examples/core-auth-nextjs/README.md b/examples/core-auth-nextjs/README.md new file mode 100644 index 00000000000..55c421bed7b --- /dev/null +++ b/examples/core-auth-nextjs/README.md @@ -0,0 +1,58 @@ +# Toolpad Core Playground - Next.js App Router + +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Setting up + +The project contains an `.env.local` with the following variables: + +``` +AUTH_SECRET= +AUTH_GITHUB_ID= +AUTH_GITHUB_SECRET= +``` + +You must pass values to them before running this project. + +### AUTH_SECRET + +`AUTH_SECRET` is a random value used by the Auth.js to encrypt tokens and email verification hashes. (See [Deployment](https://authjs.dev/getting-started/deployment) to learn more). You can generate one via running: + +```bash +npx auth secret +``` + +### GitHub configuration + +To get the required credentials from GitHub, we need to create an application in their developer settings. Read this [detailed guide on Auth.js](https://authjs.dev/guides/configuring-github) on how to obtain those. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/examples/core-auth-nextjs/next-env.d.ts b/examples/core-auth-nextjs/next-env.d.ts new file mode 100644 index 00000000000..4f11a03dc6c --- /dev/null +++ b/examples/core-auth-nextjs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/core-auth-nextjs/next.config.mjs b/examples/core-auth-nextjs/next.config.mjs new file mode 100644 index 00000000000..4678774e6d6 --- /dev/null +++ b/examples/core-auth-nextjs/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/examples/core-auth-nextjs/package.json b/examples/core-auth-nextjs/package.json new file mode 100644 index 00000000000..bd1f1f19c6d --- /dev/null +++ b/examples/core-auth-nextjs/package.json @@ -0,0 +1,26 @@ +{ + "name": "playground-nextjs", + "version": "0.3.0", + "private": true, + "scripts": { + "dev": "next dev", + "lint": "next lint" + }, + "devDependencies": { + "@emotion/react": "11.11.4", + "@emotion/styled": "11.11.5", + "@mui/icons-material": "5.16.0", + "@mui/lab": "5.0.0-alpha.170", + "@mui/material": "5.16.0", + "@mui/material-nextjs": "5.15.11", + "@toolpad/core": "0.3.0", + "@types/node": "20.14.10", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "eslint-config-next": "14.2.4", + "next": "14.2.4", + "next-auth": "5.0.0-beta.18", + "react": "18.3.1", + "react-dom": "18.3.1" + } +} diff --git a/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx b/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx new file mode 100644 index 00000000000..94ecc97609f --- /dev/null +++ b/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import { DashboardLayout } from '@toolpad/core/DashboardLayout'; + +export default async function DashboardPagesLayout(props: { children: React.ReactNode }) { + return {props.children}; +} diff --git a/examples/core-auth-nextjs/src/app/(dashboard)/orders/page.tsx b/examples/core-auth-nextjs/src/app/(dashboard)/orders/page.tsx new file mode 100644 index 00000000000..9cb3b092c9b --- /dev/null +++ b/examples/core-auth-nextjs/src/app/(dashboard)/orders/page.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; + +export default function OrdersPage() { + return ( + + + Welcome to the Toolpad orders! + + + ); +} diff --git a/examples/core-auth-nextjs/src/app/(dashboard)/page.tsx b/examples/core-auth-nextjs/src/app/(dashboard)/page.tsx new file mode 100644 index 00000000000..90c19cf0844 --- /dev/null +++ b/examples/core-auth-nextjs/src/app/(dashboard)/page.tsx @@ -0,0 +1,24 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import { auth } from '../../auth'; + +export default async function HomePage() { + const session = await auth(); + + return ( + + + Welcome to Toolpad, {session?.user?.name || 'User'}! + + + ); +} diff --git a/examples/core-auth-nextjs/src/app/actions.ts b/examples/core-auth-nextjs/src/app/actions.ts new file mode 100644 index 00000000000..b3a324bc676 --- /dev/null +++ b/examples/core-auth-nextjs/src/app/actions.ts @@ -0,0 +1,28 @@ +'use server'; + +import { AuthError } from 'next-auth'; +import type { AuthProvider } from '@toolpad/core'; +import { signIn } from '../auth'; + +export async function authenticate( + provider: AuthProvider, + formData: FormData, + callbackUrl?: string, +) { + try { + return await signIn(provider.id, { + ...(formData && Object.fromEntries(formData)), + redirectTo: callbackUrl ?? '/', + }); + } catch (error) { + if (error instanceof AuthError) { + switch (error.type) { + case 'CredentialsSignin': + return 'Invalid credentials.'; + default: + return 'Something went wrong'; + } + } + throw error; + } +} diff --git a/examples/core-auth-nextjs/src/app/api/auth/[...nextauth]/route.ts b/examples/core-auth-nextjs/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 00000000000..ca225652075 --- /dev/null +++ b/examples/core-auth-nextjs/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,3 @@ +import { handlers } from '../../../../auth'; + +export const { GET, POST } = handlers; diff --git a/examples/core-auth-nextjs/src/app/auth/signin/page.tsx b/examples/core-auth-nextjs/src/app/auth/signin/page.tsx new file mode 100644 index 00000000000..f974286ffcc --- /dev/null +++ b/examples/core-auth-nextjs/src/app/auth/signin/page.tsx @@ -0,0 +1,8 @@ +import * as React from 'react'; +import { SignInPage } from '@toolpad/core/SignInPage'; +import { providerMap } from '../../../auth'; +import { authenticate } from '../../actions'; + +export default function SignIn() { + return ; +} diff --git a/examples/core-auth-nextjs/src/app/layout.tsx b/examples/core-auth-nextjs/src/app/layout.tsx new file mode 100644 index 00000000000..b3697d10a80 --- /dev/null +++ b/examples/core-auth-nextjs/src/app/layout.tsx @@ -0,0 +1,57 @@ +import * as React from 'react'; +import { AppProvider } from '@toolpad/core/nextjs'; +import { AppRouterCacheProvider } from '@mui/material-nextjs/v14-appRouter'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'; +import type { Navigation } from '@toolpad/core'; +import { SessionProvider, signIn, signOut } from 'next-auth/react'; +import { auth } from '../auth'; + +const NAVIGATION: Navigation = [ + { + kind: 'header', + title: 'Main items', + }, + { + slug: '/', + title: 'Dashboard', + icon: , + }, + { + slug: '/orders', + title: 'Orders', + icon: , + }, +]; + +const BRANDING = { + title: 'My Toolpad Core App', +}; + +const AUTHENTICATION = { + signIn, + signOut, +}; + +export default async function RootLayout(props: { children: React.ReactNode }) { + const session = await auth(); + + return ( + + + + + + {props.children} + + + + + + ); +} diff --git a/examples/core-auth-nextjs/src/app/public/layout.tsx b/examples/core-auth-nextjs/src/app/public/layout.tsx new file mode 100644 index 00000000000..94ecc97609f --- /dev/null +++ b/examples/core-auth-nextjs/src/app/public/layout.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import { DashboardLayout } from '@toolpad/core/DashboardLayout'; + +export default async function DashboardPagesLayout(props: { children: React.ReactNode }) { + return {props.children}; +} diff --git a/examples/core-auth-nextjs/src/app/public/page.tsx b/examples/core-auth-nextjs/src/app/public/page.tsx new file mode 100644 index 00000000000..800d6b2d3f2 --- /dev/null +++ b/examples/core-auth-nextjs/src/app/public/page.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; + +export default async function HomePage() { + return ( + + + Public page + + + ); +} diff --git a/examples/core-auth-nextjs/src/auth.ts b/examples/core-auth-nextjs/src/auth.ts new file mode 100644 index 00000000000..1b576e12053 --- /dev/null +++ b/examples/core-auth-nextjs/src/auth.ts @@ -0,0 +1,57 @@ +import NextAuth from 'next-auth'; +import GitHub from 'next-auth/providers/github'; +import Credentials from 'next-auth/providers/credentials'; +import type { Provider } from 'next-auth/providers'; + +const providers: Provider[] = [ + GitHub({ + clientId: process.env.AUTH_GITHUB_ID, + clientSecret: process.env.AUTH_GITHUB_SECRET, + }), + Credentials({ + credentials: { + email: { label: 'Email Address', type: 'email' }, + password: { label: 'Password', type: 'password' }, + }, + authorize(c) { + if (c.password !== 'password') { + // TODO: Set next-auth version to latest when + // https://github.com/nextauthjs/next-auth/issues/11074 is resolved + return null; + } + return { + id: 'test', + name: 'Test User', + email: 'test@example.com', + }; + }, + }), +]; + +export const providerMap = providers.map((provider) => { + if (typeof provider === 'function') { + const providerData = provider(); + return { id: providerData.id, name: providerData.name }; + } + return { id: provider.id, name: provider.name }; +}); + +export const { handlers, auth, signIn, signOut } = NextAuth({ + providers, + secret: process.env.AUTH_SECRET, + pages: { + signIn: '/auth/signin', + }, + callbacks: { + authorized({ auth: session, request: { nextUrl } }) { + const isLoggedIn = !!session?.user; + const isPublicPage = nextUrl.pathname.startsWith('/public'); + + if (isPublicPage || isLoggedIn) { + return true; + } + + return false; // Redirect unauthenticated users to login page + }, + }, +}); diff --git a/examples/core-auth-nextjs/src/middleware.ts b/examples/core-auth-nextjs/src/middleware.ts new file mode 100644 index 00000000000..02c48f4db60 --- /dev/null +++ b/examples/core-auth-nextjs/src/middleware.ts @@ -0,0 +1,6 @@ +export { auth as middleware } from './auth'; + +export const config = { + // https://nextjs.org/docs/app/building-your-application/routing/middleware#matcher + matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)'], +}; diff --git a/examples/core-auth-nextjs/tsconfig.json b/examples/core-auth-nextjs/tsconfig.json new file mode 100644 index 00000000000..bb5584ed1a4 --- /dev/null +++ b/examples/core-auth-nextjs/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From e96fb7ca2cb021fc8f75d6e4fd5bd158303970b2 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 17:02:48 -0700 Subject: [PATCH 065/109] fix: Example apps --- examples/core-auth-nextjs-pages/package.json | 5 ++--- examples/core-auth-nextjs/package.json | 5 ++--- examples/core-tutorial/package.json | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/core-auth-nextjs-pages/package.json b/examples/core-auth-nextjs-pages/package.json index 61c20014bea..17ae499e7bf 100644 --- a/examples/core-auth-nextjs-pages/package.json +++ b/examples/core-auth-nextjs-pages/package.json @@ -1,7 +1,6 @@ { - "name": "playground-nextjs-pages", + "name": "core-auth-nextjs-pages", "version": "0.3.0", - "private": true, "scripts": { "dev": "next dev", "lint": "next lint" @@ -13,7 +12,7 @@ "@mui/material": "5.16.0", "@mui/material-nextjs": "5.15.11", "next-auth": "5.0.0-beta.19", - "@toolpad/core": "0.3.0", + "@toolpad/core": "latest", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "eslint-config-next": "14.2.4", diff --git a/examples/core-auth-nextjs/package.json b/examples/core-auth-nextjs/package.json index bd1f1f19c6d..2200daa91dd 100644 --- a/examples/core-auth-nextjs/package.json +++ b/examples/core-auth-nextjs/package.json @@ -1,7 +1,6 @@ { - "name": "playground-nextjs", + "name": "core-auth-nextjs", "version": "0.3.0", - "private": true, "scripts": { "dev": "next dev", "lint": "next lint" @@ -13,7 +12,7 @@ "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.16.0", "@mui/material-nextjs": "5.15.11", - "@toolpad/core": "0.3.0", + "@toolpad/core": "latest", "@types/node": "20.14.10", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", diff --git a/examples/core-tutorial/package.json b/examples/core-tutorial/package.json index 4bc46204142..438006c3713 100644 --- a/examples/core-tutorial/package.json +++ b/examples/core-tutorial/package.json @@ -1,5 +1,5 @@ { - "name": "core-test", + "name": "core-tutorial", "version": "0.1.0", "scripts": { "dev": "next dev", From 877cc25f7d78b250deb4d7dd1dae4ffc1ed5bf85 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 11 Jul 2024 17:04:00 -0700 Subject: [PATCH 066/109] fix: `markdownlint` --- examples/core-auth-nextjs-pages/README.md | 2 +- examples/core-auth-nextjs/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/core-auth-nextjs-pages/README.md b/examples/core-auth-nextjs-pages/README.md index 5579436a130..dde9f5823d1 100644 --- a/examples/core-auth-nextjs-pages/README.md +++ b/examples/core-auth-nextjs-pages/README.md @@ -6,7 +6,7 @@ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next The project contains an `.env.local` with the following variables: -``` +```bash AUTH_SECRET= AUTH_GITHUB_ID= AUTH_GITHUB_SECRET= diff --git a/examples/core-auth-nextjs/README.md b/examples/core-auth-nextjs/README.md index 55c421bed7b..2c199771449 100644 --- a/examples/core-auth-nextjs/README.md +++ b/examples/core-auth-nextjs/README.md @@ -22,7 +22,7 @@ Open [http://localhost:3000](http://localhost:3000) with your browser to see the The project contains an `.env.local` with the following variables: -``` +```bash AUTH_SECRET= AUTH_GITHUB_ID= AUTH_GITHUB_SECRET= From 13f3ebebac2e7a5ef59bf77461ec18f1811e4e4b Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Fri, 12 Jul 2024 10:56:49 -0700 Subject: [PATCH 067/109] fix: Not needed --- docs/pages/_app.js | 5 ++--- packages/toolpad-core/src/index.ts | 6 ------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/docs/pages/_app.js b/docs/pages/_app.js index 92b5b4cf176..2a5ce86b1aa 100644 --- a/docs/pages/_app.js +++ b/docs/pages/_app.js @@ -19,7 +19,6 @@ import findActivePage from 'docs/src/modules/utils/findActivePage'; import { pathnameToLanguage } from 'docs/src/modules/utils/helpers'; import getProductInfoFromUrl from 'docs/src/modules/utils/getProductInfoFromUrl'; import toolpadPkgJson from '@toolpad/studio/package.json'; -import { version as toolpadCoreVersion } from '@toolpad/core'; import { DocsProvider } from '@mui/docs/DocsProvider'; import toolpadStudioPages from '../data/toolpad/studio/pages'; import toolpadCorePages from '../data/toolpad/core/pages'; @@ -217,7 +216,7 @@ function AppWrapper(props) { productIdentifier = { metadata: '', name: 'Toolpad Core', - versions: [{ text: `v${toolpadCoreVersion}`, current: true }], + versions: [{ text: `v${toolpadPkgJson.version}`, current: true }], }; pages = toolpadCorePages; } @@ -226,7 +225,7 @@ function AppWrapper(props) { productIdentifier = { metadata: '', name: 'Toolpad Core', - versions: [{ text: `v${toolpadCoreVersion}`, current: true }], + versions: [{ text: `v${toolpadPkgJson.version}`, current: true }], }; pages = toolpadCorePages; } else if (productId === 'toolpad-studio') { diff --git a/packages/toolpad-core/src/index.ts b/packages/toolpad-core/src/index.ts index 7d1d7047abd..adda8bde1bc 100644 --- a/packages/toolpad-core/src/index.ts +++ b/packages/toolpad-core/src/index.ts @@ -1,9 +1,3 @@ -import * as packageJson from '../package.json'; - -const version = packageJson.version; - -export { version }; - export * from './AppProvider'; export * from './DashboardLayout'; From ac733488371417a7b21c6d8b238c0695d39f43d0 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Fri, 12 Jul 2024 17:05:40 -0700 Subject: [PATCH 068/109] fix: Address feedback --- .../sign-in-page/AuthJsSignInApp.js | 22 +- .../sign-in-page/AuthJsSignInApp.tsx | 22 +- .../sign-in-page/AuthJsSignInApp.tsx.preview | 2 +- .../sign-in-page/BrandingSignInPage.js | 2 +- .../sign-in-page/BrandingSignInPage.tsx | 2 +- .../BrandingSignInPage.tsx.preview | 2 +- .../sign-in-page/ComponentsPropsSignIn.js | 26 +- .../sign-in-page/ComponentsPropsSignIn.tsx | 26 +- .../ComponentsPropsSignIn.tsx.preview | 12 +- .../sign-in-page/CredentialsSignInPage.js | 22 +- .../sign-in-page/CredentialsSignInPage.tsx | 22 +- .../CredentialsSignInPage.tsx.preview | 8 +- .../sign-in-page/OAuthSignInPage.js | 17 +- .../sign-in-page/OAuthSignInPage.tsx | 16 +- .../sign-in-page/OAuthSignInPage.tsx.preview | 18 +- .../core/components/sign-in-page/actions.js | 1 - .../core/components/sign-in-page/actions.ts | 1 - .../core/components/sign-in-page/auth.js | 2 +- .../core/components/sign-in-page/auth.ts | 2 +- .../components/sign-in-page/brandingTheme.js | 4 - .../components/sign-in-page/brandingTheme.ts | 4 - .../components/sign-in-page/sign-in-page.md | 41 +- package.json | 2 +- .../toolpad-core/src/Account/Account.test.tsx | 2 +- packages/toolpad-core/src/Account/Account.tsx | 27 +- .../src/DashboardLayout/DashboardLayout.tsx | 1 + .../src/SignInPage/SignInPage.tsx | 17 +- .../src/pages/auth/authenticate.ts | 52 ++ .../nextjs-pages/src/pages/auth/signin.tsx | 41 +- pnpm-lock.yaml | 453 +----------------- 30 files changed, 284 insertions(+), 585 deletions(-) create mode 100644 playground/nextjs-pages/src/pages/auth/authenticate.ts diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js index 6bc04bb3e66..9654d962f28 100644 --- a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.js @@ -1,18 +1,20 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; import { providerMap } from './auth'; import { authenticate } from './actions'; export default function AuthJsSignInApp() { return ( - + + + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx index 6bc04bb3e66..9654d962f28 100644 --- a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx @@ -1,18 +1,20 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; import { providerMap } from './auth'; import { authenticate } from './actions'; export default function AuthJsSignInApp() { return ( - + + + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview index 62528ee877d..32fdeffe34b 100644 --- a/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/AuthJsSignInApp.tsx.preview @@ -2,7 +2,7 @@ signIn={authenticate} providers={providerMap} componentProps={{ - email: { + emailField: { autoFocus: false, }, }} diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js index b8afb2ddab6..b18ea4a93b8 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -41,7 +41,7 @@ export default function BrandingSignInPage() { signIn={(provider) => alert(`Signing in with "${provider.name}"`)} providers={providers} componentProps={{ - email: { autoFocus: false }, + emailField: { autoFocus: false }, }} /> diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx index b8afb2ddab6..b18ea4a93b8 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -41,7 +41,7 @@ export default function BrandingSignInPage() { signIn={(provider) => alert(`Signing in with "${provider.name}"`)} providers={providers} componentProps={{ - email: { autoFocus: false }, + emailField: { autoFocus: false }, }} /> diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview index 2cb0f13cd8f..70f8c1d00ca 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview @@ -3,7 +3,7 @@ signIn={(provider) => alert(`Signing in with "${provider.name}"`)} providers={providers} componentProps={{ - email: { autoFocus: false }, + emailField: { autoFocus: false }, }} /> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js index 12a299c824e..32c002e2d2e 100644 --- a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js +++ b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.js @@ -1,18 +1,24 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; const providers = [{ id: 'credentials', name: 'Email and Password' }]; export default function ComponentsPropsSignIn() { return ( - alert(`Signing in with "${provider.name}"`)} - componentProps={{ - email: { autoFocus: false, variant: 'standard' }, - password: { variant: 'standard' }, - button: { variant: 'outlined' }, - }} - providers={providers} - /> + + + alert( + `Signing in with "${provider.name}" and credentials: ${formData.get('email')}, ${formData.get('password')}`, + ) + } + componentProps={{ + emailField: { autoFocus: false, variant: 'standard' }, + passwordField: { variant: 'standard' }, + submitButton: { variant: 'outlined' }, + }} + providers={providers} + /> + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx index 12a299c824e..32c002e2d2e 100644 --- a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx @@ -1,18 +1,24 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; const providers = [{ id: 'credentials', name: 'Email and Password' }]; export default function ComponentsPropsSignIn() { return ( - alert(`Signing in with "${provider.name}"`)} - componentProps={{ - email: { autoFocus: false, variant: 'standard' }, - password: { variant: 'standard' }, - button: { variant: 'outlined' }, - }} - providers={providers} - /> + + + alert( + `Signing in with "${provider.name}" and credentials: ${formData.get('email')}, ${formData.get('password')}`, + ) + } + componentProps={{ + emailField: { autoFocus: false, variant: 'standard' }, + passwordField: { variant: 'standard' }, + submitButton: { variant: 'outlined' }, + }} + providers={providers} + /> + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview index c8e1f9cd158..1883e4e718f 100644 --- a/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/ComponentsPropsSignIn.tsx.preview @@ -1,9 +1,13 @@ alert(`Signing in with "${provider.name}"`)} + signIn={(provider, formData) => + alert( + `Signing in with "${provider.name}" and credentials: ${formData.get('email')}, ${formData.get('password')}`, + ) + } componentProps={{ - email: { autoFocus: false, variant: 'standard' }, - password: { variant: 'standard' }, - button: { variant: 'outlined' }, + emailField: { autoFocus: false, variant: 'standard' }, + passwordField: { variant: 'standard' }, + submitButton: { variant: 'outlined' }, }} providers={providers} /> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js index f4949b517f5..c95b77a1e22 100644 --- a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.js @@ -1,16 +1,22 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; const providers = [{ id: 'credentials', name: 'Email and Password' }]; export default function CredentialsSignInPage() { return ( - alert(`Signing in with "${provider.name}"`)} - providers={providers} - componentProps={{ - email: { autoFocus: false }, - }} - /> + + + alert( + `Signing in with "${provider.name}" and credentials: ${formData.get('email')}, ${formData.get('password')}`, + ) + } + providers={providers} + componentProps={{ + emailField: { autoFocus: false }, + }} + /> + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx index f4949b517f5..c95b77a1e22 100644 --- a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx @@ -1,16 +1,22 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; const providers = [{ id: 'credentials', name: 'Email and Password' }]; export default function CredentialsSignInPage() { return ( - alert(`Signing in with "${provider.name}"`)} - providers={providers} - componentProps={{ - email: { autoFocus: false }, - }} - /> + + + alert( + `Signing in with "${provider.name}" and credentials: ${formData.get('email')}, ${formData.get('password')}`, + ) + } + providers={providers} + componentProps={{ + emailField: { autoFocus: false }, + }} + /> + ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview index 07b7053c7be..8f954e85ce5 100644 --- a/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/CredentialsSignInPage.tsx.preview @@ -1,7 +1,11 @@ alert(`Signing in with "${provider.name}"`)} + signIn={(provider, formData) => + alert( + `Signing in with "${provider.name}" and credentials: ${formData.get('email')}, ${formData.get('password')}`, + ) + } providers={providers} componentProps={{ - email: { autoFocus: false }, + emailField: { autoFocus: false }, }} /> \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js index 6800b94b269..e2ce43bd701 100644 --- a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js @@ -1,17 +1,24 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; +// preview-start const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, { id: 'facebook', name: 'Facebook' }, ]; +// preview-end + export default function OAuthSignInPage() { return ( - alert(`Signing in with "${provider.name}"`)} - providers={providers} - /> + // preview-start + + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + + // preview-end ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx index 6800b94b269..c58bf3af8d6 100644 --- a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx @@ -1,17 +1,23 @@ import * as React from 'react'; -import { SignInPage } from '@toolpad/core'; +import { AppProvider, SignInPage } from '@toolpad/core'; +// preview-start const providers = [ { id: 'github', name: 'GitHub' }, { id: 'google', name: 'Google' }, { id: 'facebook', name: 'Facebook' }, ]; +// preview-end export default function OAuthSignInPage() { return ( - alert(`Signing in with "${provider.name}"`)} - providers={providers} - /> + // preview-start + + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + + // preview-end ); } diff --git a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview index 343cf4b4b00..08fd35b668c 100644 --- a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx.preview @@ -1,4 +1,14 @@ - alert(`Signing in with "${provider.name}"`)} - providers={providers} -/> \ No newline at end of file +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'facebook', name: 'Facebook' }, +]; + +// ... + + + alert(`Signing in with "${provider.name}"`)} + providers={providers} + /> + \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/actions.js b/docs/data/toolpad/core/components/sign-in-page/actions.js index 6742d948031..8142ed61861 100644 --- a/docs/data/toolpad/core/components/sign-in-page/actions.js +++ b/docs/data/toolpad/core/components/sign-in-page/actions.js @@ -19,6 +19,5 @@ export async function authenticate(provider, formData, callbackUrl) { return 'Something went wrong'; } } - throw error; } } diff --git a/docs/data/toolpad/core/components/sign-in-page/actions.ts b/docs/data/toolpad/core/components/sign-in-page/actions.ts index 16c9260b317..9ece07993ff 100644 --- a/docs/data/toolpad/core/components/sign-in-page/actions.ts +++ b/docs/data/toolpad/core/components/sign-in-page/actions.ts @@ -23,6 +23,5 @@ export async function authenticate( return 'Something went wrong'; } } - throw error; } } diff --git a/docs/data/toolpad/core/components/sign-in-page/auth.js b/docs/data/toolpad/core/components/sign-in-page/auth.js index a6ce1b9d228..efe0a740308 100644 --- a/docs/data/toolpad/core/components/sign-in-page/auth.js +++ b/docs/data/toolpad/core/components/sign-in-page/auth.js @@ -10,7 +10,7 @@ const providers = [ }), Credentials({ credentials: { - email: { label: 'Email Address', type: 'email' }, + email: { label: 'Email', type: 'email' }, password: { label: 'Password', type: 'password' }, }, authorize(c) { diff --git a/docs/data/toolpad/core/components/sign-in-page/auth.ts b/docs/data/toolpad/core/components/sign-in-page/auth.ts index fb6619433e9..8137562292c 100644 --- a/docs/data/toolpad/core/components/sign-in-page/auth.ts +++ b/docs/data/toolpad/core/components/sign-in-page/auth.ts @@ -11,7 +11,7 @@ const providers: Provider[] = [ }), Credentials({ credentials: { - email: { label: 'Email Address', type: 'email' }, + email: { label: 'Email', type: 'email' }, password: { label: 'Password', type: 'password' }, }, authorize(c) { diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js index 3acb8dee83d..3c4e67a9552 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.js @@ -64,10 +64,6 @@ export const getDesignTokens = (mode) => ({ }, divider: mode === 'dark' ? alpha(blue[100], 0.08) : grey[100], primaryDark: blueDark, - background: { - default: mode === 'light' ? grey[50] : blueDark[800], - paper: mode === 'light' ? '#fff' : blueDark[900], - }, mode, ...(mode === 'dark' && { background: { diff --git a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts index 781e1064181..4fffbe86298 100644 --- a/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts +++ b/docs/data/toolpad/core/components/sign-in-page/brandingTheme.ts @@ -65,10 +65,6 @@ export const getDesignTokens = (mode: 'light' | 'dark') => }, divider: mode === 'dark' ? alpha(blue[100], 0.08) : grey[100], primaryDark: blueDark, - background: { - default: mode === 'light' ? grey[50] : blueDark[800], - paper: mode === 'light' ? '#fff' : blueDark[900], - }, mode, ...(mode === 'dark' && { background: { diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index e84a8e6c0c5..b5f8427d1ea 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -14,23 +14,52 @@ The `SignInPage` component is a quick way to generate a ready-to-use authenticat The `SignInPage` component can be set up with an OAuth provider by passing in a list of providers in the `providers` prop, along with a `signIn` function that accepts the `provider` as a parameter. -{{"demo": "OAuthSignInPage.js"}} +{{"demo": "OAuthSignInPage.js", "iframe": true}} ## Credentials To render a username password form, pass in a provider with `credentials` as the `id` property. The `signIn` function will accept a `formData` parameter in this case. -{{"demo": "CredentialsSignInPage.js"}} +{{"demo": "CredentialsSignInPage.js", "iframe": true, "height": 500}} ## Usage with authentication libraries ### Auth.js -#### Next.js App Directory +#### Next.js App Directory and GitHub -The component is composable with any authentication library you might want to use. The following is a functional `SignInPage` with [auth.js](https://authjs.dev/) using the Next.js App router and Server actions: +The component is composable with any authentication library you might want to use. The following is a functional `SignInPage` with [auth.js](https://authjs.dev/) using GitHub, Next.js App router and server actions: -{{"demo": "AuthJsSignInApp.js"}} +{{"demo": "AuthJsSignInApp.js", "iframe": true, "height": 600 }} + +##### Setting up + +The project contains an `.env.local` with the following variables: + +```bash +AUTH_SECRET= +AUTH_GITHUB_ID= +AUTH_GITHUB_SECRET= +``` + +You must pass values to them before running this project. + +##### AUTH_SECRET + +`AUTH_SECRET` is a random value used by the Auth.js to encrypt tokens and email verification hashes. (See [Auth.js Deployment documentation](https://authjs.dev/getting-started/deployment) to learn more). You can generate one via running: + +```bash +npx auth secret +``` + +##### GitHub configuration + +| environment variable name                       | description | +| :------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | +| `AUTH_GITHUB_ID` | GitHub OAuth app client ID. | +| `AUTH_GITHUB_SECRET` | GitHub OAuth app client secret. | + +To get the required credentials from GitHub, we need to create an application in their developer settings. Read this [guide on Auth.js](https://authjs.dev/guides/configuring-github) on how to obtain those. Use our detailed examples with both the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) and [pages directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs-pages/) to get started using Auth.js with Toolpad Core. @@ -40,7 +69,7 @@ Use our detailed examples with both the [Next.js app directory](https://github.c `SignInPage` can be customized by passing in `componentProps` to the underlying components of the credentials form. -{{"demo": "ComponentsPropsSignIn.js"}} +{{"demo": "ComponentsPropsSignIn.js", "iframe": true, "height": 540 }} ### Theme and Branding diff --git a/package.json b/package.json index d8d15246d3e..1f42aa74a54 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@mui/internal-docs-utils": "1.0.8", "@mui/internal-markdown": "1.0.8", "@mui/internal-scripts": "1.0.13", - "@mui/monorepo": "github:mui/material-ui#987bb036905fdd4474ae5aaee7b2b5a3dc6b9315", + "@mui/monorepo": "github:mui/material-ui#a070a894fbe21c52df446438ca1bb5a891d5e1b5", "@mui/x-charts": "7.9.0", "@next/eslint-plugin-next": "14.2.4", "@playwright/test": "1.45.1", diff --git a/packages/toolpad-core/src/Account/Account.test.tsx b/packages/toolpad-core/src/Account/Account.test.tsx index a288381ee10..ab7df9e0b0a 100644 --- a/packages/toolpad-core/src/Account/Account.test.tsx +++ b/packages/toolpad-core/src/Account/Account.test.tsx @@ -38,7 +38,7 @@ describe('AppProvider', () => { expect(auth.signIn).toHaveBeenCalled(); }); - test('renders content correctly when tehre is a session', async () => { + test('renders content correctly when there is a session', async () => { const auth = { signIn: vi.fn(), signOut: vi.fn() }; const session = { user: { name: 'John Doe', email: 'john@example.com' } }; render( diff --git a/packages/toolpad-core/src/Account/Account.tsx b/packages/toolpad-core/src/Account/Account.tsx index fefc8b11bf5..e8bacec0219 100644 --- a/packages/toolpad-core/src/Account/Account.tsx +++ b/packages/toolpad-core/src/Account/Account.tsx @@ -47,7 +47,21 @@ function Account() { if (!session?.user) { return ( - ); @@ -84,8 +98,17 @@ function Account() { ); } return ( - - + + } + {...slotProps?.signOutButton} + onClick={authentication?.signOut} sx={{ + ...slotProps?.signOutButton?.sx, textTransform: 'capitalize', filter: 'opacity(0.9)', transition: 'filter 0.2s ease-in', @@ -108,12 +145,8 @@ function Account() { filter: 'opacity(1)', }, }} - disableElevation - color="inherit" - startIcon={} - onClick={authentication?.signOut} > - Sign Out + {signOutLabel || 'Sign Out'} @@ -122,4 +155,31 @@ function Account() { ); } +Account.propTypes /* remove-proptypes */ = { + // ┌────────────────────────────── Warning ──────────────────────────────┐ + // │ These PropTypes are generated from the TypeScript type definitions. │ + // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │ + // └─────────────────────────────────────────────────────────────────────┘ + /** + * The label for the sign in button. + * @default 'Sign In' + */ + signInLabel: PropTypes.string, + /** + * The label for the sign out button. + * @default 'Sign Out' + */ + signOutLabel: PropTypes.string, + /** + * Props to pass to the constituent components in the Account component. + * @default {} + * @example { signInButton: { color: 'primary' }, signOutButton: { color: 'secondary' } } + */ + slotProps: PropTypes.shape({ + iconButton: PropTypes.object, + signInButton: PropTypes.object, + signOutButton: PropTypes.object, + }), +} as any; + export { Account }; diff --git a/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx b/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx index 0f7a44e3527..0721273e3b8 100644 --- a/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx +++ b/packages/toolpad-core/src/DashboardLayout/DashboardLayout.tsx @@ -105,6 +105,7 @@ function ThemeSwitcher() { sx={{ color: (theme.vars ?? theme).palette.primary.dark, padding: 1, + marginRight: 1, }} > {theme.getColorSchemeSelector ? ( @@ -418,8 +419,8 @@ function DashboardLayout(props: DashboardLayoutProps) { - + (false); From d21db58d736737ad19d32a6d10ed6d7f1de73853 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Sat, 20 Jul 2024 01:17:44 -0700 Subject: [PATCH 085/109] fix: Add `` API changes --- .../core/components/account/AccountCustom.js | 14 +++++++++++--- .../components/account/AccountCustom.tsx.preview | 13 +++++++++++-- .../toolpad/core/components/account/AccountDemo.js | 8 +------- .../components/account/AccountDemo.tsx.preview | 8 +------- docs/pages/toolpad/core/api/account.json | 2 +- packages/toolpad-core/src/Account/Account.tsx | 1 + 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/docs/data/toolpad/core/components/account/AccountCustom.js b/docs/data/toolpad/core/components/account/AccountCustom.js index e35176a0a0c..8a31175e1b2 100644 --- a/docs/data/toolpad/core/components/account/AccountCustom.js +++ b/docs/data/toolpad/core/components/account/AccountCustom.js @@ -6,7 +6,6 @@ export default function AccountCustom() { const authentication = React.useMemo(() => { return { signIn: () => { - alert('Signing in!'); setSession({ user: { name: 'Bharat Kashyap', @@ -27,9 +26,18 @@ export default function AccountCustom() { diff --git a/docs/data/toolpad/core/components/account/AccountCustom.tsx.preview b/docs/data/toolpad/core/components/account/AccountCustom.tsx.preview index 77b96e5ad87..c5d5f4550b2 100644 --- a/docs/data/toolpad/core/components/account/AccountCustom.tsx.preview +++ b/docs/data/toolpad/core/components/account/AccountCustom.tsx.preview @@ -2,9 +2,18 @@ diff --git a/docs/data/toolpad/core/components/account/AccountDemo.js b/docs/data/toolpad/core/components/account/AccountDemo.js index 50911c82505..488c059fb29 100644 --- a/docs/data/toolpad/core/components/account/AccountDemo.js +++ b/docs/data/toolpad/core/components/account/AccountDemo.js @@ -24,13 +24,7 @@ export default function AccountDemo() { return ( - + ); diff --git a/docs/data/toolpad/core/components/account/AccountDemo.tsx.preview b/docs/data/toolpad/core/components/account/AccountDemo.tsx.preview index 77b96e5ad87..b0489ce20ca 100644 --- a/docs/data/toolpad/core/components/account/AccountDemo.tsx.preview +++ b/docs/data/toolpad/core/components/account/AccountDemo.tsx.preview @@ -1,11 +1,5 @@ - + \ No newline at end of file diff --git a/docs/pages/toolpad/core/api/account.json b/docs/pages/toolpad/core/api/account.json index d38bda21f4d..82dc61ebcef 100644 --- a/docs/pages/toolpad/core/api/account.json +++ b/docs/pages/toolpad/core/api/account.json @@ -5,7 +5,7 @@ "slotProps": { "type": { "name": "shape", - "description": "{ iconButton?: object, signInButton?: object, signOutButton?: object }" + "description": "{ avatar?: object, iconButton?: object, signInButton?: object, signOutButton?: object }" }, "default": "{}" } diff --git a/packages/toolpad-core/src/Account/Account.tsx b/packages/toolpad-core/src/Account/Account.tsx index 5d8c74729b8..a95220a1639 100644 --- a/packages/toolpad-core/src/Account/Account.tsx +++ b/packages/toolpad-core/src/Account/Account.tsx @@ -176,6 +176,7 @@ Account.propTypes /* remove-proptypes */ = { * @example { signInButton: { color: 'primary' }, signOutButton: { color: 'secondary' } } */ slotProps: PropTypes.shape({ + avatar: PropTypes.object, iconButton: PropTypes.object, signInButton: PropTypes.object, signOutButton: PropTypes.object, From cc7aca3f262e04557a8e4d4b99c8841618f4a8c0 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Sat, 20 Jul 2024 10:53:10 -0700 Subject: [PATCH 086/109] fix: Change `` demo on `DashboardLayout` page --- .../account/AccountWithDashboard.js | 37 +++++++++++++++++++ .../account/AccountWithDashboard.tsx | 37 +++++++++++++++++++ .../account/AccountWithDashboard.tsx.preview | 3 ++ .../dashboard-layout/dashboard-layout.md | 8 +++- 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 docs/data/toolpad/core/components/account/AccountWithDashboard.js create mode 100644 docs/data/toolpad/core/components/account/AccountWithDashboard.tsx create mode 100644 docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.js b/docs/data/toolpad/core/components/account/AccountWithDashboard.js new file mode 100644 index 00000000000..6bf11a83817 --- /dev/null +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.js @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { AppProvider, DashboardLayout } from '@toolpad/core'; + +export default function AccountWithDashboard() { + const [session, setSession] = React.useState({ + user: { + name: 'Bharat Kashyap', + email: 'bharatkashyap@outlook.com', + image: 'https://avatars.githubusercontent.com/u/19550456', + }, + }); + const authentication = React.useMemo(() => { + return { + signIn: () => { + alert('Signing in!'); + setSession({ + user: { + name: 'Bharat Kashyap', + email: 'bharatkashyap@outlook.com', + image: 'https://avatars.githubusercontent.com/u/19550456', + }, + }); + }, + signOut: () => { + setSession(null); + }, + }; + }, []); + + return ( + + +

Content

+
+
+ ); +} diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx new file mode 100644 index 00000000000..45ba8443f90 --- /dev/null +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { Session, AppProvider, DashboardLayout } from '@toolpad/core'; + +export default function AccountWithDashboard() { + const [session, setSession] = React.useState({ + user: { + name: 'Bharat Kashyap', + email: 'bharatkashyap@outlook.com', + image: 'https://avatars.githubusercontent.com/u/19550456', + }, + }); + const authentication = React.useMemo(() => { + return { + signIn: () => { + alert('Signing in!'); + setSession({ + user: { + name: 'Bharat Kashyap', + email: 'bharatkashyap@outlook.com', + image: 'https://avatars.githubusercontent.com/u/19550456', + }, + }); + }, + signOut: () => { + setSession(null); + }, + }; + }, []); + + return ( + + +

Content

+
+
+ ); +} diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview new file mode 100644 index 00000000000..a8aa4df3e09 --- /dev/null +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview @@ -0,0 +1,3 @@ + +

Content

+
\ No newline at end of file diff --git a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md index e798cc716d9..c3294295000 100644 --- a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md +++ b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md @@ -43,6 +43,10 @@ The flexibility in composing and ordering these different elements allows for a ## Account -The `DashboardLayout` comes integrated with the [``](/toolpad/core/react-account/) component. It renders as an account management menu when a user is signed in, and a text button when not. +The `DashboardLayout` comes integrated with the [``](/toolpad/core/react-account/) component. It renders as an account management menu when a user is signed in, i.e. a `session` object is present, and a button when not. -{{"demo": "../account/AccountSignedIn.js", "height": 320, "iframe": true}} +:::warning +The use of an `iframe` may cause some spacing issues in the following demo. +::: + +{{"demo": "../account/AccountWithDashboard.js", "iframe": true, "height": 320 }} From 1aa62e8cb7649c614f9c3b88be576eb2e9ec9d5f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Sat, 20 Jul 2024 11:02:36 -0700 Subject: [PATCH 087/109] fix: Vale --- .../core/components/dashboard-layout/dashboard-layout.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md index c3294295000..046f4ed6f1e 100644 --- a/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md +++ b/docs/data/toolpad/core/components/dashboard-layout/dashboard-layout.md @@ -43,7 +43,7 @@ The flexibility in composing and ordering these different elements allows for a ## Account -The `DashboardLayout` comes integrated with the [``](/toolpad/core/react-account/) component. It renders as an account management menu when a user is signed in, i.e. a `session` object is present, and a button when not. +The `DashboardLayout` comes integrated with the [``](/toolpad/core/react-account/) component. It renders as an account management menu when a user is signed in – a `session` object is present – and a button when not. :::warning The use of an `iframe` may cause some spacing issues in the following demo. From faabae3825d8d881a10512684cb60218f8b6f283 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Sun, 21 Jul 2024 18:03:34 -0700 Subject: [PATCH 088/109] fix: not needed --- playground/nextjs/package.json | 5 +- pnpm-lock.yaml | 112 +++++++++++++++++++++++++++------ 2 files changed, 94 insertions(+), 23 deletions(-) diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index 607099f9612..a4e696cb89f 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -9,11 +9,11 @@ "devDependencies": { "@emotion/react": "11.11.4", "@emotion/styled": "11.11.5", - "@playwright/test": "1.45.1", "@mui/icons-material": "5.16.4", "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.16.4", "@mui/material-nextjs": "5.16.4", + "@playwright/test": "1.45.1", "@toolpad/core": "workspace:*", "@types/node": "20.14.10", "@types/react": "18.3.3", @@ -23,8 +23,5 @@ "next-auth": "5.0.0-beta.18", "react": "18.3.1", "react-dom": "18.3.1" - }, - "dependencies": { - "playwright": "^1.45.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9b28b50051..19160d9cc72 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1177,10 +1177,6 @@ importers: version: 3.4.3 playground/nextjs: - dependencies: - playwright: - specifier: ^1.45.1 - version: 1.45.2 devDependencies: '@emotion/react': specifier: 11.11.4 @@ -1199,7 +1195,7 @@ importers: version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: 5.16.4 - version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@playwright/test': specifier: 1.45.1 version: 1.45.1 @@ -1217,13 +1213,13 @@ importers: version: 18.3.0 eslint-config-next: specifier: 14.2.4 - version: 14.2.4(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)))(eslint@8.57.0)(typescript@5.5.3) + version: 14.2.4(eslint@8.57.0)(typescript@5.5.3) next: specifier: 14.2.5 - version: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: 5.0.0-beta.18 - version: 5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -11825,22 +11821,22 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@emotion/cache': 11.11.0 '@emotion/server': 11.11.0 '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@emotion/cache': 11.11.0 @@ -15207,6 +15203,24 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.5.3): + dependencies: + '@next/eslint-plugin-next': 14.2.4 + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.34.3(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15242,6 +15256,23 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + dependencies: + debug: 4.3.5 + enhanced-resolve: 5.17.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.5 + is-core-module: 2.14.0 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)): dependencies: array.prototype.find: 2.2.3 @@ -15283,6 +15314,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-plugin-filenames@1.3.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15318,6 +15360,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.14.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -17514,10 +17583,10 @@ snapshots: nested-error-stacks@2.1.1: {} - next-auth@5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.31.0 - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): @@ -17531,7 +17600,7 @@ snapshots: next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -17553,12 +17622,12 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.1 + '@playwright/test': 1.45.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -17568,7 +17637,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.9)(babel-plugin-macros@3.1.0)(react@18.3.1) + styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.5 '@next/swc-darwin-x64': 14.2.5 @@ -17580,7 +17649,7 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.2 + '@playwright/test': 1.45.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -19391,6 +19460,11 @@ snapshots: '@babel/core': 7.24.9 babel-plugin-macros: 3.1.0 + styled-jsx@5.1.1(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + stylis-plugin-rtl@2.1.1(stylis@4.3.2): dependencies: cssjanus: 2.1.0 From a6bfb002b482a2effa701a762856061858415046 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Sun, 21 Jul 2024 18:10:25 -0700 Subject: [PATCH 089/109] fix: pnpm dedupe --- pnpm-lock.yaml | 108 +++++++------------------------------------------ 1 file changed, 15 insertions(+), 93 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19160d9cc72..18a3663284e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1195,7 +1195,7 @@ importers: version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: 5.16.4 - version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@playwright/test': specifier: 1.45.1 version: 1.45.1 @@ -1213,13 +1213,13 @@ importers: version: 18.3.0 eslint-config-next: specifier: 14.2.4 - version: 14.2.4(eslint@8.57.0)(typescript@5.5.3) + version: 14.2.4(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)))(eslint@8.57.0)(typescript@5.5.3) next: specifier: 14.2.5 - version: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: 5.0.0-beta.18 - version: 5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -11821,22 +11821,22 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@emotion/cache': 11.11.0 '@emotion/server': 11.11.0 '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@emotion/cache': 11.11.0 @@ -15203,24 +15203,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@next/eslint-plugin-next': 14.2.4 - '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.34.3(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15256,23 +15238,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - dependencies: - debug: 4.3.5 - enhanced-resolve: 5.17.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.5 - is-core-module: 2.14.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)): dependencies: array.prototype.find: 2.2.3 @@ -15314,17 +15279,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-plugin-filenames@1.3.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15360,33 +15314,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -17583,10 +17510,10 @@ snapshots: nested-error-stacks@2.1.1: {} - next-auth@5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.31.0 - next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): @@ -17600,7 +17527,7 @@ snapshots: next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -17622,12 +17549,12 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.2 + '@playwright/test': 1.45.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -17637,7 +17564,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.9)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.5 '@next/swc-darwin-x64': 14.2.5 @@ -17649,7 +17576,7 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.1 + '@playwright/test': 1.45.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -19460,11 +19387,6 @@ snapshots: '@babel/core': 7.24.9 babel-plugin-macros: 3.1.0 - styled-jsx@5.1.1(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - stylis-plugin-rtl@2.1.1(stylis@4.3.2): dependencies: cssjanus: 2.1.0 From 6c9e3f3883f74a2b45741c3b5fa1e2c7cea99758 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Tue, 23 Jul 2024 13:30:35 +0530 Subject: [PATCH 090/109] fix: remove playwright --- playground/nextjs/package.json | 1 - playground/nextjs/playwright.config.ts | 68 ------------ playground/nextjs/tests/auth.spec.ts | 140 ------------------------- pnpm-lock.yaml | 136 ++++++++++++++++-------- 4 files changed, 92 insertions(+), 253 deletions(-) delete mode 100644 playground/nextjs/playwright.config.ts delete mode 100644 playground/nextjs/tests/auth.spec.ts diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index a4e696cb89f..e62970005e1 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -13,7 +13,6 @@ "@mui/lab": "5.0.0-alpha.170", "@mui/material": "5.16.4", "@mui/material-nextjs": "5.16.4", - "@playwright/test": "1.45.1", "@toolpad/core": "workspace:*", "@types/node": "20.14.10", "@types/react": "18.3.3", diff --git a/playground/nextjs/playwright.config.ts b/playground/nextjs/playwright.config.ts deleted file mode 100644 index 3110989dda5..00000000000 --- a/playground/nextjs/playwright.config.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { defineConfig, devices } from '@playwright/test'; - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// import dotenv from 'dotenv'; -// dotenv.config({ path: path.resolve(__dirname, '.env') }); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'pnpm dev', - url: 'http:/localhost:3000', - reuseExistingServer: !process.env.CI, - }, -}); diff --git a/playground/nextjs/tests/auth.spec.ts b/playground/nextjs/tests/auth.spec.ts deleted file mode 100644 index 19353c708ad..00000000000 --- a/playground/nextjs/tests/auth.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { test, expect, Page } from '@playwright/test'; - -const BASE_URL = process.env.BASE_URL || 'http://localhost:3000'; - -test.describe('Credentials Sign In', () => { - let page: Page; - - test.beforeEach(async ({ browser }) => { - page = await browser.newPage(); - }); - - test('orders page is not accessible without authentication', async () => { - await page.goto(`${BASE_URL}/orders`); - - await page.waitForSelector('text=Welcome user, please sign in to continue'); - - expect(page.url()).toBe( - `${BASE_URL}/auth/signin?callbackUrl=http%3A%2F%2Flocalhost%3A3000%2Forders`, - ); - }); - - test('sign in with incorrect credentials displays error notification', async () => { - await page.goto(`${BASE_URL}/auth/signin`); - - await page.fill('input[name="email"]', 'wrong@example.com'); - await page.fill('input[name="password"]', 'wrongpassword'); - - const credentialsSignIn = await page.getByRole('button', { - name: 'Sign in', - exact: true, - }); - - await credentialsSignIn.click(); - - await page.waitForSelector('text=Invalid credentials.'); - - expect(page.url()).toBe(`${BASE_URL}/auth/signin`); - }); - - test('sign in with correct credentials redirects to home page', async () => { - await page.goto(`${BASE_URL}/auth/signin`); - - await page.fill('input[name="email"]', 'test@example.com'); - await page.fill('input[name="password"]', 'password'); - - const credentialsSignIn = await page.getByRole('button', { - name: 'Sign in', - exact: true, - }); - - await credentialsSignIn.click(); - - await page.waitForSelector('text=Welcome to Toolpad, Test User!'); - - expect(page.url()).toBe(`${BASE_URL}/`); - }); - - test('sign out redirects to sign in page with callback URL', async () => { - await page.goto(`${BASE_URL}/auth/signin`); - - await page.fill('input[name="email"]', 'welcome@email.com'); - await page.fill('input[name="password"]', 'password'); - - const credentialsSignIn = await page.getByRole('button', { - name: 'Sign in', - exact: true, - }); - - await credentialsSignIn.click(); - - await page.waitForSelector('text=Welcome to Toolpad, Test User!'); - expect(page.url()).toBe(`${BASE_URL}/`); - - await page.goto(`${BASE_URL}/orders`); - - const accountButton = await page.getByLabel('Current User'); - await accountButton.click(); - - const signOut = await page.getByRole('button', { - name: 'Sign Out', - exact: true, - }); - await signOut.click(); - - await page.waitForSelector('text=please sign in to continue'); - - expect(page.url()).toBe( - `${BASE_URL}/auth/signin?callbackUrl=http%3A%2F%2Flocalhost%3A3000%2Forders`, - ); - }); - - test('sign in with correct credentials redirects to callback URL', async () => { - await page.goto(`${BASE_URL}/auth/signin?callbackUrl=http%3A%2F%2Flocalhost%3A3000%2Forders`); - - await page.fill('input[name="email"]', 'test@example.com'); - await page.fill('input[name="password"]', 'password'); - - const credentialsSignIn = await page.getByRole('button', { - name: 'Sign in', - exact: true, - }); - - await credentialsSignIn.click(); - - await page.waitForSelector('text=Welcome to the Toolpad orders!'); - - expect(page.url()).toBe(`${BASE_URL}/orders`); - }); - - test.afterEach(async () => { - await page.close(); - }); -}); - -test.describe('GitHub Sign In', () => { - let page: Page; - - test.beforeEach(async ({ browser }) => { - page = await browser.newPage(); - }); - - test('OAuth sign in flow is initiated successfully', async () => { - await page.goto(`${BASE_URL}/auth/signin`); - - const githubSignIn = await page.getByRole('button', { - name: 'Sign in with GitHub', - exact: true, - }); - - await githubSignIn.click(); - - await page.waitForSelector( - 'text=Sign in to GitHub to continue to Toolpad Core Next.js Playground', - ); - }); - - test.afterEach(async () => { - await page.close(); - }); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18a3663284e..cf136bb20d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1195,10 +1195,7 @@ importers: version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: 5.16.4 - version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@playwright/test': - specifier: 1.45.1 - version: 1.45.1 + version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@toolpad/core': specifier: workspace:* version: link:../../packages/toolpad-core @@ -1213,13 +1210,13 @@ importers: version: 18.3.0 eslint-config-next: specifier: 14.2.4 - version: 14.2.4(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)))(eslint@8.57.0)(typescript@5.5.3) + version: 14.2.4(eslint@8.57.0)(typescript@5.5.3) next: specifier: 14.2.5 - version: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: 5.0.0-beta.18 - version: 5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -3437,11 +3434,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.45.1': - resolution: {integrity: sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==} - engines: {node: '>=18'} - hasBin: true - '@playwright/test@1.45.2': resolution: {integrity: sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ==} engines: {node: '>=18'} @@ -8145,21 +8137,11 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} - playwright-core@1.45.1: - resolution: {integrity: sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==} - engines: {node: '>=18'} - hasBin: true - playwright-core@1.45.2: resolution: {integrity: sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw==} engines: {node: '>=18'} hasBin: true - playwright@1.45.1: - resolution: {integrity: sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==} - engines: {node: '>=18'} - hasBin: true - playwright@1.45.2: resolution: {integrity: sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g==} engines: {node: '>=18'} @@ -11821,22 +11803,22 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@emotion/cache': 11.11.0 '@emotion/server': 11.11.0 '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@emotion/cache': 11.11.0 @@ -12634,10 +12616,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.45.1': - dependencies: - playwright: 1.45.1 - '@playwright/test@1.45.2': dependencies: playwright: 1.45.2 @@ -15203,6 +15181,24 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.5.3): + dependencies: + '@next/eslint-plugin-next': 14.2.4 + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.34.3(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15238,6 +15234,23 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + dependencies: + debug: 4.3.5 + enhanced-resolve: 5.17.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.5 + is-core-module: 2.14.0 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)): dependencies: array.prototype.find: 2.2.3 @@ -15279,6 +15292,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-plugin-filenames@1.3.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15314,6 +15338,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.14.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -17510,10 +17561,10 @@ snapshots: nested-error-stacks@2.1.1: {} - next-auth@5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.31.0 - next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): @@ -17527,7 +17578,7 @@ snapshots: next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -17549,12 +17600,12 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.5 '@next/swc-win32-x64-msvc': 14.2.5 '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.1 + '@playwright/test': 1.45.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -17564,7 +17615,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.9)(babel-plugin-macros@3.1.0)(react@18.3.1) + styled-jsx: 5.1.1(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.5 '@next/swc-darwin-x64': 14.2.5 @@ -18218,16 +18269,8 @@ snapshots: dependencies: find-up: 3.0.0 - playwright-core@1.45.1: {} - playwright-core@1.45.2: {} - playwright@1.45.1: - dependencies: - playwright-core: 1.45.1 - optionalDependencies: - fsevents: 2.3.2 - playwright@1.45.2: dependencies: playwright-core: 1.45.2 @@ -19387,6 +19430,11 @@ snapshots: '@babel/core': 7.24.9 babel-plugin-macros: 3.1.0 + styled-jsx@5.1.1(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + stylis-plugin-rtl@2.1.1(stylis@4.3.2): dependencies: cssjanus: 2.1.0 From 19168863cce60c52ff936ecef03e1d15770f8f97 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Tue, 23 Jul 2024 15:13:40 +0530 Subject: [PATCH 091/109] fix: pnpm dedupe --- pnpm-lock.yaml | 128 +++---------------------------------------------- 1 file changed, 6 insertions(+), 122 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eacb3c488b2..6052fb9b0f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1195,7 +1195,7 @@ importers: version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: 5.16.4 - version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@toolpad/core': specifier: workspace:* version: link:../../packages/toolpad-core @@ -1210,13 +1210,13 @@ importers: version: 18.3.0 eslint-config-next: specifier: 14.2.4 - version: 14.2.4(eslint@8.57.0)(typescript@5.5.3) + version: 14.2.4(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)))(eslint@8.57.0)(typescript@5.5.3) next: specifier: 14.2.5 - version: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: 5.0.0-beta.18 - version: 5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -11814,17 +11814,6 @@ snapshots: '@emotion/server': 11.11.0 '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.24.8 - '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@emotion/cache': 11.11.0 - '@emotion/server': 11.11.0 - '@types/react': 18.3.3 - '@mui/material-nextjs@6.0.0-alpha.14(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@6.0.0-beta.2(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 @@ -15181,24 +15170,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@next/eslint-plugin-next': 14.2.4 - '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.34.3(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15234,23 +15205,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - dependencies: - debug: 4.3.5 - enhanced-resolve: 5.17.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.5 - is-core-module: 2.14.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.92.1(esbuild@0.21.5)): dependencies: array.prototype.find: 2.2.3 @@ -15292,17 +15246,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-plugin-filenames@1.3.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -15338,33 +15281,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -17561,10 +17477,10 @@ snapshots: nested-error-stacks@2.1.1: {} - next-auth@5.0.0-beta.18(next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.31.0 - next: 14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): @@ -17605,33 +17521,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.5(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.5 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001639 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.5 - '@next/swc-darwin-x64': 14.2.5 - '@next/swc-linux-arm64-gnu': 14.2.5 - '@next/swc-linux-arm64-musl': 14.2.5 - '@next/swc-linux-x64-gnu': 14.2.5 - '@next/swc-linux-x64-musl': 14.2.5 - '@next/swc-win32-arm64-msvc': 14.2.5 - '@next/swc-win32-ia32-msvc': 14.2.5 - '@next/swc-win32-x64-msvc': 14.2.5 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.45.2 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -19430,11 +19319,6 @@ snapshots: '@babel/core': 7.24.9 babel-plugin-macros: 3.1.0 - styled-jsx@5.1.1(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - stylis-plugin-rtl@2.1.1(stylis@4.3.2): dependencies: cssjanus: 2.1.0 From 3664521b7910c22ce31cf5d74b4ca1a34e0454dd Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 23 Jul 2024 12:02:57 +0200 Subject: [PATCH 092/109] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 70bc9d9ffd9..57f02edf0c3 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "docs:typescript:formatted": "tsx ./docs/scripts/formattedTSDemos", "eslint": "eslint . --report-unused-disable-directives --ext .js,.ts,.tsx", "jsonlint": "node ./scripts/jsonlint.mjs", - "release:build": "lerna run --ignore docs --stream build", + "release:build": "lerna run --ignore docs --stream build --concurrency 3", "release:version": "lerna version --exact --no-changelog --no-push --no-git-tag-version", "release:publish": "pnpm dedupe && pnpm release:build && pnpm publish --recursive --tag latest", "release:changelog": "dotenv -- node ./scripts/releaseChangelog.mjs --repo mui-toolpad", From 67b7ae9235ffcf81128c4294fe43cc1b4686974d Mon Sep 17 00:00:00 2001 From: MUI bot <2109932+Janpot@users.noreply.github.com> Date: Tue, 23 Jul 2024 12:10:38 +0200 Subject: [PATCH 093/109] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 57f02edf0c3..ba0e9898ec1 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "docs:typescript:formatted": "tsx ./docs/scripts/formattedTSDemos", "eslint": "eslint . --report-unused-disable-directives --ext .js,.ts,.tsx", "jsonlint": "node ./scripts/jsonlint.mjs", - "release:build": "lerna run --ignore docs --stream build --concurrency 3", + "release:build": "lerna run --ignore docs --stream build --concurrency 1", "release:version": "lerna version --exact --no-changelog --no-push --no-git-tag-version", "release:publish": "pnpm dedupe && pnpm release:build && pnpm publish --recursive --tag latest", "release:changelog": "dotenv -- node ./scripts/releaseChangelog.mjs --repo mui-toolpad", From 62033aa0dcb4e6bc07b399fe555129a09dde1572 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 24 Jul 2024 00:17:22 +0530 Subject: [PATCH 094/109] fix: Some `vale` warnings --- .../toolpad/core/components/account/account.md | 2 +- .../core/components/sign-in-page/sign-in-page.md | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/data/toolpad/core/components/account/account.md b/docs/data/toolpad/core/components/account/account.md index 0146bd38c9a..e011c9464b1 100644 --- a/docs/data/toolpad/core/components/account/account.md +++ b/docs/data/toolpad/core/components/account/account.md @@ -26,4 +26,4 @@ When signed out, the component renders as an inline sign in button within the da ### 🚧 Composition -The `Account` component will allow adding your own menu options, including deeply nested options. This is in progress. +The `Account` component allows adding your own menu options, including deeply nested options. This is in progress. diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index 1c0d8bc9c97..57f4a3b9168 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -19,10 +19,10 @@ The `SignInPage` component can be set up with an OAuth provider by passing in a ## Credentials :::warning -It is recommended to use the OAuth provider for more robust maintenance, support and security. +It is recommended to use the OAuth provider for more robust maintenance, support, and security. ::: -To render a username password form, pass in a provider with `credentials` as the `id` property. The `signIn` function will accept a `formData` parameter in this case. +To render a username password form, pass in a provider with `credentials` as the `id` property. The `signIn` function accepts a `formData` parameter in this case. {{"demo": "CredentialsSignInPage.js", "iframe": true, "height": 500}} @@ -37,7 +37,7 @@ interface AuthResponse { } ``` -This will render an alert with the `error` string as the message. +This renders an alert with the `error` string as the message. {{"demo": "NotificationsSignInPageError.js", "iframe": true, "height": 600}} @@ -50,7 +50,7 @@ This will render an alert with the `error` string as the message. The component is composable with any authentication library you might want to use. The following is a functional `SignInPage` with [auth.js](https://authjs.dev/) using GitHub, Next.js App router and server actions. :::warning -The following demo will not initiate an actual GitHub authentication flow, since doing that from within an `iframe` is not permitted. Run the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) example to test this functionality. +The following demo does not initiate an actual GitHub authentication flow, since doing that from within an `iframe` is not permitted. Run the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) example to test this functionality. ::: {{"demo": "AuthJsSignInApp.js", "iframe": true, "height": 300 }} @@ -82,7 +82,7 @@ npx auth secret | `AUTH_GITHUB_ID` | GitHub OAuth app client ID. | | `AUTH_GITHUB_SECRET` | GitHub OAuth app client secret. | -To get the required credentials from GitHub, we need to create an application in their developer settings. Read this [guide on Auth.js](https://authjs.dev/guides/configuring-github) on how to obtain those. +To get the required credentials from GitHub, create an application in their developer settings. Read this [guide on Auth.js](https://authjs.dev/guides/configuring-github) on how to obtain those. Use our detailed examples with both the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) and [pages directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs-pages/) to get started using Auth.js with Toolpad Core. @@ -102,8 +102,8 @@ Through the `branding` and `theme` props in the [AppProvider](https://mui.com/to #### 🚧 Composition -To enable deep customization beyond what is possible with custom props, the `SignInPage` component will allow bringing your own custom granular components, such as inputs and buttons. This is in progress. +To enable deep customization beyond what is possible with custom props, the `SignInPage` component allows bringing your own custom granular components, such as inputs and buttons. This is in progress. ### 🚧 Layouts -The `SignInPage` component will have versions with different layouts for authentication - one column, two column and others such. The APIs of these components will be identical. This is in progress. +The `SignInPage` component has versions with different layouts for authentication - one column, two column and others such. The APIs of these components is identical. This is in progress. From 9131ca22f18daf5007af4b57bd669a22fd5c0404 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 24 Jul 2024 13:50:42 +0530 Subject: [PATCH 095/109] fix: Typo --- docs/translations/api-docs/app-provider/app-provider.json | 2 +- packages/toolpad-core/src/AppProvider/AppProvider.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/translations/api-docs/app-provider/app-provider.json b/docs/translations/api-docs/app-provider/app-provider.json index 59d7e16d60c..030ef0a67fe 100644 --- a/docs/translations/api-docs/app-provider/app-provider.json +++ b/docs/translations/api-docs/app-provider/app-provider.json @@ -4,7 +4,7 @@ "authentication": { "description": "Authentication methods." }, "branding": { "description": "Branding options for the app." }, "children": { "description": "The content of the app provider." }, - "navigation": { "description": "Navigation definition for the app." }, + "navigation": { "description": "Navigation definition for the app." }, "router": { "description": "Router implementation used inside Toolpad components." }, "session": { "description": "Session info about the current user." }, "theme": { diff --git a/packages/toolpad-core/src/AppProvider/AppProvider.tsx b/packages/toolpad-core/src/AppProvider/AppProvider.tsx index ca3e5b61a8a..264c6473f8f 100644 --- a/packages/toolpad-core/src/AppProvider/AppProvider.tsx +++ b/packages/toolpad-core/src/AppProvider/AppProvider.tsx @@ -89,7 +89,7 @@ export interface AppProviderProps { */ branding?: Branding | null; /** - * Navigation definition for the app. + * Navigation definition for the app. * @default [] */ navigation?: Navigation; @@ -188,7 +188,7 @@ AppProvider.propTypes /* remove-proptypes */ = { */ children: PropTypes.node, /** - * Navigation definition for the app. + * Navigation definition for the app. * @default [] */ navigation: PropTypes.arrayOf( From 06d605f0918190e63cee435ba0274e2bba364887 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 24 Jul 2024 14:36:15 +0530 Subject: [PATCH 096/109] fix: Do this in a separate PR --- docs/pages/_app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pages/_app.js b/docs/pages/_app.js index 2a5ce86b1aa..2073dcfa55e 100644 --- a/docs/pages/_app.js +++ b/docs/pages/_app.js @@ -216,7 +216,7 @@ function AppWrapper(props) { productIdentifier = { metadata: '', name: 'Toolpad Core', - versions: [{ text: `v${toolpadPkgJson.version}`, current: true }], + versions: [{ text: `v0.0.1`, current: true }], }; pages = toolpadCorePages; } @@ -225,7 +225,7 @@ function AppWrapper(props) { productIdentifier = { metadata: '', name: 'Toolpad Core', - versions: [{ text: `v${toolpadPkgJson.version}`, current: true }], + versions: [{ text: `v0.0.1`, current: true }], }; pages = toolpadCorePages; } else if (productId === 'toolpad-studio') { From c54d22b24e87820645a59c452bd416b8fac06270 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 25 Jul 2024 12:04:40 +0530 Subject: [PATCH 097/109] fix: Dashboard Account demo content spacing --- .../toolpad/core/components/account/AccountWithDashboard.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx index 45ba8443f90..d6c07dd61c9 100644 --- a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { Session, AppProvider, DashboardLayout } from '@toolpad/core'; export default function AccountWithDashboard() { @@ -30,7 +31,7 @@ export default function AccountWithDashboard() { return ( -

Content

+ Dashboard content
); From 54b628d0d7f5f25edfe87a858a89e9c28e5a8956 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 25 Jul 2024 12:47:28 +0530 Subject: [PATCH 098/109] fix: This should be a pre-commit hook --- .../toolpad/core/components/account/AccountWithDashboard.js | 3 ++- .../core/components/account/AccountWithDashboard.tsx.preview | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.js b/docs/data/toolpad/core/components/account/AccountWithDashboard.js index 6bf11a83817..d9ef1f1776d 100644 --- a/docs/data/toolpad/core/components/account/AccountWithDashboard.js +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { AppProvider, DashboardLayout } from '@toolpad/core'; export default function AccountWithDashboard() { @@ -30,7 +31,7 @@ export default function AccountWithDashboard() { return ( -

Content

+ Dashboard content
); diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview index a8aa4df3e09..32238be7a1b 100644 --- a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx.preview @@ -1,3 +1,3 @@ -

Content

+ Dashboard content
\ No newline at end of file From 885b06bec281d1bce073126539e61356bf925449 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 25 Jul 2024 13:00:06 +0530 Subject: [PATCH 099/109] fix: Should also be a pre-commit hook --- docs/data/toolpad/core/pagesApi.js | 2 +- docs/pages/toolpad/core/api/page-container-toolbar.json | 2 +- docs/pages/toolpad/core/api/page-container.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/data/toolpad/core/pagesApi.js b/docs/data/toolpad/core/pagesApi.js index 0da0902329d..346ba5b4a23 100644 --- a/docs/data/toolpad/core/pagesApi.js +++ b/docs/data/toolpad/core/pagesApi.js @@ -4,7 +4,7 @@ module.exports = [ { pathname: '/toolpad/core/api/dashboard-layout' }, { pathname: '/toolpad/core/api/dialogs-provider' }, { pathname: '/toolpad/core/api/notifications-provider' }, - { pathname: '/toolpad/core/api/sign-in-page' }, { pathname: '/toolpad/core/api/page-container' }, { pathname: '/toolpad/core/api/page-container-toolbar' }, + { pathname: '/toolpad/core/api/sign-in-page' }, ]; diff --git a/docs/pages/toolpad/core/api/page-container-toolbar.json b/docs/pages/toolpad/core/api/page-container-toolbar.json index fce831943e9..4d789399e61 100644 --- a/docs/pages/toolpad/core/api/page-container-toolbar.json +++ b/docs/pages/toolpad/core/api/page-container-toolbar.json @@ -1,7 +1,7 @@ { "props": {}, "name": "PageContainerToolbar", - "imports": ["import { PageContainerToolbar } from '@toolpad-core/PageContainer';"], + "imports": ["import { PageContainerToolbar } from '@toolpad/core/PageContainer';"], "classes": [], "spread": true, "themeDefaultProps": false, diff --git a/docs/pages/toolpad/core/api/page-container.json b/docs/pages/toolpad/core/api/page-container.json index 63cbe300d3a..82219960b02 100644 --- a/docs/pages/toolpad/core/api/page-container.json +++ b/docs/pages/toolpad/core/api/page-container.json @@ -2,8 +2,8 @@ "props": {}, "name": "PageContainer", "imports": [ - "import { PageContainer } from '@toolpad-core/PageContainer';", - "import { PageContainer } from '@toolpad-core';" + "import { PageContainer } from '@toolpad/core/PageContainer';", + "import { PageContainer } from '@toolpad/core';" ], "slots": [ { From 4f8d253c6fa0bd30897e187a3a1148ff33d0763a Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Mon, 29 Jul 2024 13:22:58 +0530 Subject: [PATCH 100/109] fix: Migrate navigation types --- examples/core-auth-nextjs-pages/src/pages/_app.tsx | 4 ++-- examples/core-auth-nextjs/src/app/layout.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/core-auth-nextjs-pages/src/pages/_app.tsx b/examples/core-auth-nextjs-pages/src/pages/_app.tsx index c2aac60cbb8..97f7c74db22 100644 --- a/examples/core-auth-nextjs-pages/src/pages/_app.tsx +++ b/examples/core-auth-nextjs-pages/src/pages/_app.tsx @@ -26,12 +26,12 @@ const NAVIGATION: Navigation = [ title: 'Main items', }, { - slug: '/', + segment: '', title: 'Dashboard', icon: , }, { - slug: '/orders', + segment: 'orders', title: 'Orders', icon: , }, diff --git a/examples/core-auth-nextjs/src/app/layout.tsx b/examples/core-auth-nextjs/src/app/layout.tsx index b3697d10a80..ff8c20024d8 100644 --- a/examples/core-auth-nextjs/src/app/layout.tsx +++ b/examples/core-auth-nextjs/src/app/layout.tsx @@ -13,12 +13,12 @@ const NAVIGATION: Navigation = [ title: 'Main items', }, { - slug: '/', + segment: '', title: 'Dashboard', icon: , }, { - slug: '/orders', + segment: '/orders', title: 'Orders', icon: , }, From 4e9ae6ed7f1df76de12579e831ea2c65fee3946f Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Tue, 30 Jul 2024 12:33:39 +0530 Subject: [PATCH 101/109] fix: Make example work --- examples/core-auth-nextjs/package-lock.json | 7370 +++++++++++++++++++ examples/core-auth-nextjs/package.json | 8 +- 2 files changed, 7374 insertions(+), 4 deletions(-) create mode 100644 examples/core-auth-nextjs/package-lock.json diff --git a/examples/core-auth-nextjs/package-lock.json b/examples/core-auth-nextjs/package-lock.json new file mode 100644 index 00000000000..4eed1ec04e0 --- /dev/null +++ b/examples/core-auth-nextjs/package-lock.json @@ -0,0 +1,7370 @@ +{ + "name": "core-auth-nextjs", + "version": "0.3.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "core-auth-nextjs", + "version": "0.3.0", + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "6.0.0-beta.2", + "@mui/lab": "6.0.0-beta.2", + "@mui/material": "6.0.0-beta.2", + "@mui/material-nextjs": "next", + "@toolpad/core": "latest", + "next": "14.2.4", + "next-auth": "5.0.0-beta.18", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { + "@types/node": "^20.14.10", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "eslint-config-next": "14.2.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@auth/core": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.31.0.tgz", + "integrity": "sha512-UKk3psvA1cRbk4/c9CkpWB8mdWrkKvzw0DmEYRsWolUQytQ2cRqx+hYuV6ZCsngw/xbj9hpmkZmAZEyq2g4fMg==", + "dependencies": { + "@panva/hkdf": "^1.1.1", + "@types/cookie": "0.6.0", + "cookie": "0.6.0", + "jose": "^5.1.3", + "oauth4webapi": "^2.4.0", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", + "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.9.0", + "@emotion/utils": "^1.4.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", + "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz", + "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==", + "dependencies": { + "@floating-ui/utils": "^0.2.5" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz", + "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.5" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz", + "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "peer": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.54", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.54.tgz", + "integrity": "sha512-Yy5Ej0jvZgSxqlyMOw9sO2TBBYAH/fXv7zFC3VNcPlzkceZ4xhQCvVQYpkdrjSuACD/UvRN468zSY679+x9Fpw==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@floating-ui/react-dom": "^2.1.0", + "@mui/types": "^7.2.14", + "@mui/utils": "6.0.0-beta.1", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.0.0-dev.240424162023-9968b4889d", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.0.0-dev.240424162023-9968b4889d.tgz", + "integrity": "sha512-doh3M3U7HUGSBIWGe1yvesSbfDguMRjP0N09ogWSBM2hovXAlgULhMgcRTepAZLLwfRxFII0bCohq6B9NqoKuw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.0.0-beta.2.tgz", + "integrity": "sha512-TPY6Tnpc9Va71pRSwPvkuLZUW7n5J7ue5IH6A9juxBLcTN5Vo1AKPmx2cf7BMDGVJPkjtIzLqwmIHvGQQuvNQw==", + "dependencies": { + "@babel/runtime": "^7.24.8" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "6.0.0-beta.2", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "6.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.2.tgz", + "integrity": "sha512-A6vdvnoN5u3VEIFz6KV0fcw/ulpSdgMxYuqXZNaEYWESn/uXQJA0/zY/W2FcsJfKhcgNEFW3uHi3tg3WccDwPg==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@mui/base": "5.0.0-beta.54", + "@mui/system": "6.0.0-beta.1", + "@mui/types": "^7.2.14", + "@mui/utils": "6.0.0-beta.1", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^6.0.0-beta.2", + "@mui/material-pigment-css": "^6.0.0-beta.1", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "6.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.0.0-beta.2.tgz", + "integrity": "sha512-2LJ+o8VY1sV7ntld1xv9jjp+kRkogPfNw+7h/OuZs546N4L7ewwVVl6RwZiXc2d9adulTCevvDOKXOZp+XexGg==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@mui/core-downloads-tracker": "^6.0.0-beta.2", + "@mui/system": "6.0.0-beta.1", + "@mui/types": "^7.2.14", + "@mui/utils": "6.0.0-beta.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.0.0-beta.1", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material-nextjs": { + "version": "6.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@mui/material-nextjs/-/material-nextjs-6.0.0-beta.3.tgz", + "integrity": "sha512-05B3OUXFuUhc51oE8/jhDY7ffv8UQqOndQ6SPMzBRl15DCzmcqvKXdP6zj1fGkTc+HVjlIRwx4oJ6M/hm7XsQA==", + "dependencies": { + "@babel/runtime": "^7.24.8" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/cache": "^11.11.0", + "@emotion/react": "^11.11.4", + "@emotion/server": "^11.11.0", + "@types/react": "^17.0.0 || ^18.0.0", + "next": "^13.0.0 || ^14.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/cache": { + "optional": true + }, + "@emotion/server": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "6.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.0.0-beta.1.tgz", + "integrity": "sha512-IY4JMVmNuxeXm7yvKsMt+F+cejM0FjD1VTykjTQaYQA//JXpyphQK+oj8ML/n2NJUDkoE4O+aqW0nm/sBjyEQw==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@mui/utils": "6.0.0-beta.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "6.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.0.0-beta.1.tgz", + "integrity": "sha512-Q2Hrt0BRJ6kSq0BYjIZHwHoEwmIZAyxBf15k6Vt0kkrqMGPKqDZxpg/miO0Mh/gkfXL/C0NfUO9XYti5DOVEsA==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.0.0-beta.1.tgz", + "integrity": "sha512-gqp++9yZ91gXt9b8BrI8LelrnLnIcYWR0pxVSR+3OXwepOC17gONO3w5KOCpJcR8f0irmIccNg3a5LeaLWt1KA==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@mui/private-theming": "6.0.0-beta.1", + "@mui/styled-engine": "6.0.0-beta.1", + "@mui/types": "^7.2.14", + "@mui/utils": "6.0.0-beta.1", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", + "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.0.0-beta.1.tgz", + "integrity": "sha512-NpvigKbCf90GaDb57Pmiuc0SmctyKpvABxFJa0d6Clri3tW5KYoZaVUZrWtqvuLkQEl9LvrLC/rhwX8NkbCzkg==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@next/env": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz", + "integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz", + "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", + "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", + "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", + "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", + "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", + "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", + "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", + "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", + "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", + "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", + "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", + "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", + "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", + "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", + "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", + "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", + "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", + "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", + "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@toolpad/core": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@toolpad/core/-/core-0.4.0.tgz", + "integrity": "sha512-qOoQMh1zEit5ImdefYtvWpInarXEFRUEcAdat/Fa0/73yau77An+6MICAm9K6TzuTCHzDyakZ4jYSzS/V3bE1w==", + "dependencies": { + "@mui/base": "5.0.0-beta.40", + "@mui/lab": "5.0.0-alpha.172", + "@mui/utils": "6.0.0-beta.1", + "@toolpad/utils": "0.4.0", + "client-only": "^0.0.1", + "invariant": "2.2.4", + "prop-types": "15.8.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@mui/icons-material": "6.0.0-beta.2", + "@mui/material": "6.0.0-beta.2", + "next": "^14", + "react": "^18" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/base": { + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/base/node_modules/@mui/utils": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", + "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/lab": { + "version": "5.0.0-alpha.172", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.172.tgz", + "integrity": "sha512-stpa3WTsDE1HamFR4eeS6Bhxalm+u9FhzzNph/PrDMdWSRBHlJs2mqvZ6FEoO22O7MOCwNMqbXTkvEwsyEf0ew==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/system": "^5.16.1", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.1", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": ">=5.15.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/lab/node_modules/@mui/utils": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", + "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/private-theming": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.5.tgz", + "integrity": "sha512-CSLg0YkpDqg0aXOxtjo3oTMd3XWMxvNb5d0v4AYVqwOltU8q6GvnZjhWyCLjGSCrcgfwm6/VDjaKLPlR14wxIA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.5", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/private-theming/node_modules/@mui/utils": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", + "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/styled-engine": { + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.4.tgz", + "integrity": "sha512-0+mnkf+UiAmTVB8PZFqOhqf729Yh0Cxq29/5cA3VAyDVTRIUUQ8FXQhiAhUIbijFmM72rY80ahFPXIm4WDbzcA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/system": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.5.tgz", + "integrity": "sha512-uzIUGdrWddUx1HPxW4+B2o4vpgKyRxGe/8BxbfXVDPNPHX75c782TseoCnR/VyfnZJfqX87GcxDmnZEE1c031g==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.5", + "@mui/styled-engine": "^5.16.4", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.5", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/core/node_modules/@mui/system/node_modules/@mui/utils": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", + "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@toolpad/utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@toolpad/utils/-/utils-0.4.0.tgz", + "integrity": "sha512-t9yPj2nwBR8orptrDlH+Qd2Ov3pwbegpxNZMktNDiPI+rNFOpTW/co8FxmHFx4q17lskzjD3SEmGFSOM7Y1ggQ==", + "dependencies": { + "invariant": "2.2.4", + "prettier": "3.3.3", + "react-is": "18.3.1", + "title": "3.5.3", + "vitest": "2.0.0-beta.13", + "yaml": "2.4.5", + "yaml-diff-patch": "2.0.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", + "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", + "devOptional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "peer": true + }, + "node_modules/@vitest/expect": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.0-beta.13.tgz", + "integrity": "sha512-VvdoRimo52gLziVilXzuNxe3VBYIhy+n2wjXrT2IAa1y9P1FxbDHHJzrSVw5c9bLwhxJvIyQIKWE9kFQoO5MZg==", + "dependencies": { + "@vitest/spy": "2.0.0-beta.13", + "@vitest/utils": "2.0.0-beta.13", + "chai": "^5.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.0-beta.13.tgz", + "integrity": "sha512-50J8rYy3u3sjxNc+IfCu9xnCn8Z3vpmUeKO0d1zf0SNrvm+1QurFg0AxVbsaqc0jIdjR9bVZwwtrOF8rM2pqsg==", + "dependencies": { + "@vitest/utils": "2.0.0-beta.13", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.0-beta.13.tgz", + "integrity": "sha512-avQ7e6LoRKjmA0Fv4Iw9fxvFf6I+XtoCObTl0EdCMdrzGUMSPjFx1fYz5NaCd7iuGW3fQrBpmm/TV/Sd9i8gtw==", + "dependencies": { + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.0-beta.13.tgz", + "integrity": "sha512-gQTFVKTspb7zJ10R2EDEdD7f85cu199BdTThTwzlu3rtcj9ifJ/s5gkwFMeXgO8xRwTtW89Hjl9Zb92SqE2wfg==", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.0-beta.13.tgz", + "integrity": "sha512-af+EpEofA39r5pbYxfVQxDv5dLwQxMiLXlwWMbDgjcw97BHNKarh2XEQ2D7AFWViYwC4HvIDc7kP2C/OC0xJHA==", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz", + "integrity": "sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001644", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001644.tgz", + "integrity": "sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "engines": { + "node": ">= 16" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clipboardy": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz", + "integrity": "sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==", + "dependencies": { + "arch": "^2.1.0", + "execa": "^0.8.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz", + "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.2.4", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "dev": true, + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/execa/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "peer": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "peer": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "peer": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "peer": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jose": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", + "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "peer": true + }, + "node_modules/next": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz", + "integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==", + "dependencies": { + "@next/env": "14.2.4", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.4", + "@next/swc-darwin-x64": "14.2.4", + "@next/swc-linux-arm64-gnu": "14.2.4", + "@next/swc-linux-arm64-musl": "14.2.4", + "@next/swc-linux-x64-gnu": "14.2.4", + "@next/swc-linux-x64-musl": "14.2.4", + "@next/swc-win32-arm64-msvc": "14.2.4", + "@next/swc-win32-ia32-msvc": "14.2.4", + "@next/swc-win32-x64-msvc": "14.2.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-auth": { + "version": "5.0.0-beta.18", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-5.0.0-beta.18.tgz", + "integrity": "sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ==", + "dependencies": { + "@auth/core": "0.31.0" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "next": "^14", + "nodemailer": "^6.6.5", + "react": "^18.2.0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/oauth4webapi": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.11.1.tgz", + "integrity": "sha512-aNzOnL98bL6izG97zgnZs1PFEyO4WDVRhz2Pd066NPak44w5ESLRCYmJIyey8avSBPOMtBjhF3ZDDm7bIb7UOg==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oppa": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oppa/-/oppa-0.4.0.tgz", + "integrity": "sha512-DFvM3+F+rB/igo3FRnkDWitjZgBH9qZAn68IacYHsqbZBKwuTA+LdD4zSJiQtgQpWq7M08we5FlGAVHz0yW7PQ==", + "dependencies": { + "chalk": "^4.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/oppa/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/oppa/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/oppa/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/oppa/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/oppa/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/oppa/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", + "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.19.1", + "@rollup/rollup-android-arm64": "4.19.1", + "@rollup/rollup-darwin-arm64": "4.19.1", + "@rollup/rollup-darwin-x64": "4.19.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", + "@rollup/rollup-linux-arm-musleabihf": "4.19.1", + "@rollup/rollup-linux-arm64-gnu": "4.19.1", + "@rollup/rollup-linux-arm64-musl": "4.19.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", + "@rollup/rollup-linux-riscv64-gnu": "4.19.1", + "@rollup/rollup-linux-s390x-gnu": "4.19.1", + "@rollup/rollup-linux-x64-gnu": "4.19.1", + "@rollup/rollup-linux-x64-musl": "4.19.1", + "@rollup/rollup-win32-arm64-msvc": "4.19.1", + "@rollup/rollup-win32-ia32-msvc": "4.19.1", + "@rollup/rollup-win32-x64-msvc": "4.19.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "node_modules/tinybench": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==" + }, + "node_modules/tinypool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/title": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/title/-/title-3.5.3.tgz", + "integrity": "sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==", + "dependencies": { + "arg": "1.0.0", + "chalk": "2.3.0", + "clipboardy": "1.2.2", + "titleize": "1.0.0" + }, + "bin": { + "title": "bin/title.js" + } + }, + "node_modules/title/node_modules/chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dependencies": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/title/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/title/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/title/node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/titleize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.0.tgz", + "integrity": "sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "devOptional": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.0-beta.13.tgz", + "integrity": "sha512-yopsxgK3fz/+MLoYE3wTcDeZ0ZBl2hK8hAIVsnjNbnQX0yx6mKaTQ04mYCpez/ss491MsYy4PHRCVV68IaC77g==", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "picocolors": "^1.0.1", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.40", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", + "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitest": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.0-beta.13.tgz", + "integrity": "sha512-WlyAzTY5KDNIfl2ij51nn040Hj0B0m1VDhCQV+7dgOzxdxAyHK0+vEqCfhPVx6k9y0FBq+0QT4k5L3tvaeEY5Q==", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.0-beta.13", + "@vitest/runner": "2.0.0-beta.13", + "@vitest/snapshot": "2.0.0-beta.13", + "@vitest/spy": "2.0.0-beta.13", + "@vitest/utils": "2.0.0-beta.13", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "picocolors": "^1.0.1", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "vite": "^5.0.0", + "vite-node": "2.0.0-beta.13", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.0-beta.13", + "@vitest/ui": "2.0.0-beta.13", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "peer": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-diff-patch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yaml-diff-patch/-/yaml-diff-patch-2.0.0.tgz", + "integrity": "sha512-RhfIQPGcKSZhsUmsczXAeg5jNhWXk3tAmhl2kjfZthdyaL0XXXOpvRozUp22HvPStmZsHu8T30/UEfX9oIwGxw==", + "dependencies": { + "fast-json-patch": "^3.1.0", + "oppa": "^0.4.0", + "yaml": "^2.0.0-10" + }, + "bin": { + "yaml-diff-patch": "dist/bin/yaml-patch.js", + "yaml-overwrite": "dist/bin/yaml-patch.js", + "yaml-patch": "dist/bin/yaml-patch.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/examples/core-auth-nextjs/package.json b/examples/core-auth-nextjs/package.json index 7519a03be7f..a1f4cfd41b9 100644 --- a/examples/core-auth-nextjs/package.json +++ b/examples/core-auth-nextjs/package.json @@ -8,10 +8,10 @@ "dependencies": { "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.16.0", - "@mui/lab": "^5.0.0-alpha.170", - "@mui/material": "^5.16.0", - "@mui/material-nextjs": "^5.15.11", + "@mui/icons-material": "6.0.0-beta.2", + "@mui/lab": "6.0.0-beta.2", + "@mui/material": "6.0.0-beta.2", + "@mui/material-nextjs": "next", "@toolpad/core": "latest", "next": "14.2.4", "next-auth": "5.0.0-beta.18", From 5889ea8fe0710a0b157cf6e7e474a496b11e822b Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 31 Jul 2024 09:35:28 +0530 Subject: [PATCH 102/109] fix: Upgrade examples --- examples/core-auth-nextjs-pages/package.json | 15 +- .../core-auth-nextjs-pages/src/pages/_app.tsx | 7 +- examples/core-auth-nextjs/package-lock.json | 7370 ----------------- .../src/app/(dashboard)/layout.tsx | 7 +- examples/core-auth-nextjs/src/app/layout.tsx | 2 +- playground/nextjs-pages/src/pages/_app.tsx | 4 +- 6 files changed, 23 insertions(+), 7382 deletions(-) delete mode 100644 examples/core-auth-nextjs/package-lock.json diff --git a/examples/core-auth-nextjs-pages/package.json b/examples/core-auth-nextjs-pages/package.json index a562977194d..3a1dbbdb7ed 100644 --- a/examples/core-auth-nextjs-pages/package.json +++ b/examples/core-auth-nextjs-pages/package.json @@ -8,14 +8,15 @@ "dependencies": { "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.16.0", - "@mui/material": "^5.16.0", - "@mui/material-nextjs": "^5.15.11", - "next-auth": "5.0.0-beta.19", + "@mui/icons-material": "6.0.0-beta.2", + "@mui/lab": "6.0.0-beta.2", + "@mui/material": "6.0.0-beta.2", + "@mui/material-nextjs": "next", "@toolpad/core": "latest", - "next": "^14.2.4", - "react": "^18.3.1", - "react-dom": "^18.3.1" + "next": "14.2.4", + "next-auth": "5.0.0-beta.18", + "react": "18.3.1", + "react-dom": "18.3.1" }, "devDependencies": { "@types/react": "^18.3.3", diff --git a/examples/core-auth-nextjs-pages/src/pages/_app.tsx b/examples/core-auth-nextjs-pages/src/pages/_app.tsx index 97f7c74db22..7b80dd503b9 100644 --- a/examples/core-auth-nextjs-pages/src/pages/_app.tsx +++ b/examples/core-auth-nextjs-pages/src/pages/_app.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { AppProvider } from '@toolpad/core/nextjs'; import { DashboardLayout } from '@toolpad/core/DashboardLayout'; +import { PageContainer } from '@toolpad/core/PageContainer'; import Head from 'next/head'; import { AppCacheProvider } from '@mui/material-nextjs/v14-pagesRouter'; import DashboardIcon from '@mui/icons-material/Dashboard'; @@ -47,7 +48,11 @@ const AUTHENTICATION = { }; function getDefaultLayout(page: React.ReactElement) { - return {page}; + return ( + + {page} + + ); } function RequireAuth({ children }: { children: React.ReactNode }) { diff --git a/examples/core-auth-nextjs/package-lock.json b/examples/core-auth-nextjs/package-lock.json deleted file mode 100644 index 4eed1ec04e0..00000000000 --- a/examples/core-auth-nextjs/package-lock.json +++ /dev/null @@ -1,7370 +0,0 @@ -{ - "name": "core-auth-nextjs", - "version": "0.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "core-auth-nextjs", - "version": "0.3.0", - "dependencies": { - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "6.0.0-beta.2", - "@mui/lab": "6.0.0-beta.2", - "@mui/material": "6.0.0-beta.2", - "@mui/material-nextjs": "next", - "@toolpad/core": "latest", - "next": "14.2.4", - "next-auth": "5.0.0-beta.18", - "react": "18.3.1", - "react-dom": "18.3.1" - }, - "devDependencies": { - "@types/node": "^20.14.10", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "eslint-config-next": "14.2.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@auth/core": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.31.0.tgz", - "integrity": "sha512-UKk3psvA1cRbk4/c9CkpWB8mdWrkKvzw0DmEYRsWolUQytQ2cRqx+hYuV6ZCsngw/xbj9hpmkZmAZEyq2g4fMg==", - "dependencies": { - "@panva/hkdf": "^1.1.1", - "@types/cookie": "0.6.0", - "cookie": "0.6.0", - "jose": "^5.1.3", - "oauth4webapi": "^2.4.0", - "preact": "10.11.3", - "preact-render-to-string": "5.2.3" - }, - "peerDependencies": { - "@simplewebauthn/browser": "^9.0.1", - "@simplewebauthn/server": "^9.0.2", - "nodemailer": "^6.8.0" - }, - "peerDependenciesMeta": { - "@simplewebauthn/browser": { - "optional": true - }, - "@simplewebauthn/server": { - "optional": true - }, - "nodemailer": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", - "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", - "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.13.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", - "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", - "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" - }, - "node_modules/@emotion/react": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", - "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", - "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.9.0", - "@emotion/utils": "^1.4.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" - }, - "node_modules/@emotion/styled": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", - "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", - "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz", - "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==", - "dependencies": { - "@floating-ui/utils": "^0.2.5" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz", - "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.5" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", - "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz", - "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "peer": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "peer": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.54", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.54.tgz", - "integrity": "sha512-Yy5Ej0jvZgSxqlyMOw9sO2TBBYAH/fXv7zFC3VNcPlzkceZ4xhQCvVQYpkdrjSuACD/UvRN468zSY679+x9Fpw==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@floating-ui/react-dom": "^2.1.0", - "@mui/types": "^7.2.14", - "@mui/utils": "6.0.0-beta.1", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "6.0.0-dev.240424162023-9968b4889d", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.0.0-dev.240424162023-9968b4889d.tgz", - "integrity": "sha512-doh3M3U7HUGSBIWGe1yvesSbfDguMRjP0N09ogWSBM2hovXAlgULhMgcRTepAZLLwfRxFII0bCohq6B9NqoKuw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "6.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.0.0-beta.2.tgz", - "integrity": "sha512-TPY6Tnpc9Va71pRSwPvkuLZUW7n5J7ue5IH6A9juxBLcTN5Vo1AKPmx2cf7BMDGVJPkjtIzLqwmIHvGQQuvNQw==", - "dependencies": { - "@babel/runtime": "^7.24.8" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "6.0.0-beta.2", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/lab": { - "version": "6.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.2.tgz", - "integrity": "sha512-A6vdvnoN5u3VEIFz6KV0fcw/ulpSdgMxYuqXZNaEYWESn/uXQJA0/zY/W2FcsJfKhcgNEFW3uHi3tg3WccDwPg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@mui/base": "5.0.0-beta.54", - "@mui/system": "6.0.0-beta.1", - "@mui/types": "^7.2.14", - "@mui/utils": "6.0.0-beta.1", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": "^6.0.0-beta.2", - "@mui/material-pigment-css": "^6.0.0-beta.1", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "6.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.0.0-beta.2.tgz", - "integrity": "sha512-2LJ+o8VY1sV7ntld1xv9jjp+kRkogPfNw+7h/OuZs546N4L7ewwVVl6RwZiXc2d9adulTCevvDOKXOZp+XexGg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@mui/core-downloads-tracker": "^6.0.0-beta.2", - "@mui/system": "6.0.0-beta.1", - "@mui/types": "^7.2.14", - "@mui/utils": "6.0.0-beta.1", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.1", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^18.3.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.0.0-beta.1", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material-nextjs": { - "version": "6.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@mui/material-nextjs/-/material-nextjs-6.0.0-beta.3.tgz", - "integrity": "sha512-05B3OUXFuUhc51oE8/jhDY7ffv8UQqOndQ6SPMzBRl15DCzmcqvKXdP6zj1fGkTc+HVjlIRwx4oJ6M/hm7XsQA==", - "dependencies": { - "@babel/runtime": "^7.24.8" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/cache": "^11.11.0", - "@emotion/react": "^11.11.4", - "@emotion/server": "^11.11.0", - "@types/react": "^17.0.0 || ^18.0.0", - "next": "^13.0.0 || ^14.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/cache": { - "optional": true - }, - "@emotion/server": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "6.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.0.0-beta.1.tgz", - "integrity": "sha512-IY4JMVmNuxeXm7yvKsMt+F+cejM0FjD1VTykjTQaYQA//JXpyphQK+oj8ML/n2NJUDkoE4O+aqW0nm/sBjyEQw==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@mui/utils": "6.0.0-beta.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "6.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.0.0-beta.1.tgz", - "integrity": "sha512-Q2Hrt0BRJ6kSq0BYjIZHwHoEwmIZAyxBf15k6Vt0kkrqMGPKqDZxpg/miO0Mh/gkfXL/C0NfUO9XYti5DOVEsA==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "6.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.0.0-beta.1.tgz", - "integrity": "sha512-gqp++9yZ91gXt9b8BrI8LelrnLnIcYWR0pxVSR+3OXwepOC17gONO3w5KOCpJcR8f0irmIccNg3a5LeaLWt1KA==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@mui/private-theming": "6.0.0-beta.1", - "@mui/styled-engine": "6.0.0-beta.1", - "@mui/types": "^7.2.14", - "@mui/utils": "6.0.0-beta.1", - "clsx": "^2.1.1", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.15", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", - "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "6.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.0.0-beta.1.tgz", - "integrity": "sha512-NpvigKbCf90GaDb57Pmiuc0SmctyKpvABxFJa0d6Clri3tW5KYoZaVUZrWtqvuLkQEl9LvrLC/rhwX8NkbCzkg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@next/env": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz", - "integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz", - "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", - "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", - "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", - "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", - "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", - "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", - "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", - "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", - "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", - "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@panva/hkdf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", - "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", - "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", - "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", - "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", - "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", - "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", - "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", - "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", - "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", - "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", - "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", - "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", - "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", - "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", - "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", - "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", - "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@toolpad/core": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@toolpad/core/-/core-0.4.0.tgz", - "integrity": "sha512-qOoQMh1zEit5ImdefYtvWpInarXEFRUEcAdat/Fa0/73yau77An+6MICAm9K6TzuTCHzDyakZ4jYSzS/V3bE1w==", - "dependencies": { - "@mui/base": "5.0.0-beta.40", - "@mui/lab": "5.0.0-alpha.172", - "@mui/utils": "6.0.0-beta.1", - "@toolpad/utils": "0.4.0", - "client-only": "^0.0.1", - "invariant": "2.2.4", - "prop-types": "15.8.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@mui/icons-material": "6.0.0-beta.2", - "@mui/material": "6.0.0-beta.2", - "next": "^14", - "react": "^18" - }, - "peerDependenciesMeta": { - "next": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/base": { - "version": "5.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", - "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/base/node_modules/@mui/utils": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", - "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/lab": { - "version": "5.0.0-alpha.172", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.172.tgz", - "integrity": "sha512-stpa3WTsDE1HamFR4eeS6Bhxalm+u9FhzzNph/PrDMdWSRBHlJs2mqvZ6FEoO22O7MOCwNMqbXTkvEwsyEf0ew==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/system": "^5.16.1", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.1", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": ">=5.15.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/lab/node_modules/@mui/utils": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", - "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/private-theming": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.5.tgz", - "integrity": "sha512-CSLg0YkpDqg0aXOxtjo3oTMd3XWMxvNb5d0v4AYVqwOltU8q6GvnZjhWyCLjGSCrcgfwm6/VDjaKLPlR14wxIA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.5", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/private-theming/node_modules/@mui/utils": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", - "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/styled-engine": { - "version": "5.16.4", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.4.tgz", - "integrity": "sha512-0+mnkf+UiAmTVB8PZFqOhqf729Yh0Cxq29/5cA3VAyDVTRIUUQ8FXQhiAhUIbijFmM72rY80ahFPXIm4WDbzcA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/system": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.5.tgz", - "integrity": "sha512-uzIUGdrWddUx1HPxW4+B2o4vpgKyRxGe/8BxbfXVDPNPHX75c782TseoCnR/VyfnZJfqX87GcxDmnZEE1c031g==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.5", - "@mui/styled-engine": "^5.16.4", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.5", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/core/node_modules/@mui/system/node_modules/@mui/utils": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.5.tgz", - "integrity": "sha512-CwhcA9y44XwK7k2joL3Y29mRUnoBt+gOZZdGyw7YihbEwEErJYBtDwbZwVgH68zAljGe/b+Kd5bzfl63Gi3R2A==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@toolpad/utils": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@toolpad/utils/-/utils-0.4.0.tgz", - "integrity": "sha512-t9yPj2nwBR8orptrDlH+Qd2Ov3pwbegpxNZMktNDiPI+rNFOpTW/co8FxmHFx4q17lskzjD3SEmGFSOM7Y1ggQ==", - "dependencies": { - "invariant": "2.2.4", - "prettier": "3.3.3", - "react-is": "18.3.1", - "title": "3.5.3", - "vitest": "2.0.0-beta.13", - "yaml": "2.4.5", - "yaml-diff-patch": "2.0.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.14.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", - "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", - "devOptional": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "peer": true - }, - "node_modules/@vitest/expect": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.0-beta.13.tgz", - "integrity": "sha512-VvdoRimo52gLziVilXzuNxe3VBYIhy+n2wjXrT2IAa1y9P1FxbDHHJzrSVw5c9bLwhxJvIyQIKWE9kFQoO5MZg==", - "dependencies": { - "@vitest/spy": "2.0.0-beta.13", - "@vitest/utils": "2.0.0-beta.13", - "chai": "^5.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.0-beta.13.tgz", - "integrity": "sha512-50J8rYy3u3sjxNc+IfCu9xnCn8Z3vpmUeKO0d1zf0SNrvm+1QurFg0AxVbsaqc0jIdjR9bVZwwtrOF8rM2pqsg==", - "dependencies": { - "@vitest/utils": "2.0.0-beta.13", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.0-beta.13.tgz", - "integrity": "sha512-avQ7e6LoRKjmA0Fv4Iw9fxvFf6I+XtoCObTl0EdCMdrzGUMSPjFx1fYz5NaCd7iuGW3fQrBpmm/TV/Sd9i8gtw==", - "dependencies": { - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.0-beta.13.tgz", - "integrity": "sha512-gQTFVKTspb7zJ10R2EDEdD7f85cu199BdTThTwzlu3rtcj9ifJ/s5gkwFMeXgO8xRwTtW89Hjl9Zb92SqE2wfg==", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.0-beta.13.tgz", - "integrity": "sha512-af+EpEofA39r5pbYxfVQxDv5dLwQxMiLXlwWMbDgjcw97BHNKarh2XEQ2D7AFWViYwC4HvIDc7kP2C/OC0xJHA==", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/arg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-1.0.0.tgz", - "integrity": "sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001644", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001644.tgz", - "integrity": "sha512-YGvlOZB4QhZuiis+ETS0VXR+MExbFf4fZYYeMTEE0aTQd/RdIjkTyZjLrbYVKnHzppDvnOhritRVv+i7Go6mHw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "engines": { - "node": ">= 16" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/clipboardy": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.2.tgz", - "integrity": "sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==", - "dependencies": { - "arch": "^2.1.0", - "execa": "^0.8.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz", - "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.2.4", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", - "dev": true, - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "peer": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/execa/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "peer": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "peer": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "peer": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "peer": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "peer": true - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jose": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", - "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "peer": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "peer": true - }, - "node_modules/next": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz", - "integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==", - "dependencies": { - "@next/env": "14.2.4", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.4", - "@next/swc-darwin-x64": "14.2.4", - "@next/swc-linux-arm64-gnu": "14.2.4", - "@next/swc-linux-arm64-musl": "14.2.4", - "@next/swc-linux-x64-gnu": "14.2.4", - "@next/swc-linux-x64-musl": "14.2.4", - "@next/swc-win32-arm64-msvc": "14.2.4", - "@next/swc-win32-ia32-msvc": "14.2.4", - "@next/swc-win32-x64-msvc": "14.2.4" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-auth": { - "version": "5.0.0-beta.18", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-5.0.0-beta.18.tgz", - "integrity": "sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ==", - "dependencies": { - "@auth/core": "0.31.0" - }, - "peerDependencies": { - "@simplewebauthn/browser": "^9.0.1", - "@simplewebauthn/server": "^9.0.2", - "next": "^14", - "nodemailer": "^6.6.5", - "react": "^18.2.0" - }, - "peerDependenciesMeta": { - "@simplewebauthn/browser": { - "optional": true - }, - "@simplewebauthn/server": { - "optional": true - }, - "nodemailer": { - "optional": true - } - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/oauth4webapi": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.11.1.tgz", - "integrity": "sha512-aNzOnL98bL6izG97zgnZs1PFEyO4WDVRhz2Pd066NPak44w5ESLRCYmJIyey8avSBPOMtBjhF3ZDDm7bIb7UOg==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/oppa": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/oppa/-/oppa-0.4.0.tgz", - "integrity": "sha512-DFvM3+F+rB/igo3FRnkDWitjZgBH9qZAn68IacYHsqbZBKwuTA+LdD4zSJiQtgQpWq7M08we5FlGAVHz0yW7PQ==", - "dependencies": { - "chalk": "^4.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/oppa/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/oppa/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/oppa/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/oppa/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/oppa/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/oppa/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.11.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", - "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-render-to-string": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", - "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", - "dependencies": { - "pretty-format": "^3.8.0" - }, - "peerDependencies": { - "preact": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", - "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.1", - "@rollup/rollup-android-arm64": "4.19.1", - "@rollup/rollup-darwin-arm64": "4.19.1", - "@rollup/rollup-darwin-x64": "4.19.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", - "@rollup/rollup-linux-arm-musleabihf": "4.19.1", - "@rollup/rollup-linux-arm64-gnu": "4.19.1", - "@rollup/rollup-linux-arm64-musl": "4.19.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", - "@rollup/rollup-linux-riscv64-gnu": "4.19.1", - "@rollup/rollup-linux-s390x-gnu": "4.19.1", - "@rollup/rollup-linux-x64-gnu": "4.19.1", - "@rollup/rollup-linux-x64-musl": "4.19.1", - "@rollup/rollup-win32-arm64-msvc": "4.19.1", - "@rollup/rollup-win32-ia32-msvc": "4.19.1", - "@rollup/rollup-win32-x64-msvc": "4.19.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "peer": true - }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==" - }, - "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/title": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/title/-/title-3.5.3.tgz", - "integrity": "sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==", - "dependencies": { - "arg": "1.0.0", - "chalk": "2.3.0", - "clipboardy": "1.2.2", - "titleize": "1.0.0" - }, - "bin": { - "title": "bin/title.js" - } - }, - "node_modules/title/node_modules/chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dependencies": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/title/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/title/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/title/node_modules/supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", - "dependencies": { - "has-flag": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/titleize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.0.tgz", - "integrity": "sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "devOptional": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.0-beta.13.tgz", - "integrity": "sha512-yopsxgK3fz/+MLoYE3wTcDeZ0ZBl2hK8hAIVsnjNbnQX0yx6mKaTQ04mYCpez/ss491MsYy4PHRCVV68IaC77g==", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "picocolors": "^1.0.1", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/vitest": { - "version": "2.0.0-beta.13", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.0-beta.13.tgz", - "integrity": "sha512-WlyAzTY5KDNIfl2ij51nn040Hj0B0m1VDhCQV+7dgOzxdxAyHK0+vEqCfhPVx6k9y0FBq+0QT4k5L3tvaeEY5Q==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.0-beta.13", - "@vitest/runner": "2.0.0-beta.13", - "@vitest/snapshot": "2.0.0-beta.13", - "@vitest/spy": "2.0.0-beta.13", - "@vitest/utils": "2.0.0-beta.13", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "picocolors": "^1.0.1", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "vite": "^5.0.0", - "vite-node": "2.0.0-beta.13", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.0-beta.13", - "@vitest/ui": "2.0.0-beta.13", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "peer": true - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yaml-diff-patch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yaml-diff-patch/-/yaml-diff-patch-2.0.0.tgz", - "integrity": "sha512-RhfIQPGcKSZhsUmsczXAeg5jNhWXk3tAmhl2kjfZthdyaL0XXXOpvRozUp22HvPStmZsHu8T30/UEfX9oIwGxw==", - "dependencies": { - "fast-json-patch": "^3.1.0", - "oppa": "^0.4.0", - "yaml": "^2.0.0-10" - }, - "bin": { - "yaml-diff-patch": "dist/bin/yaml-patch.js", - "yaml-overwrite": "dist/bin/yaml-patch.js", - "yaml-patch": "dist/bin/yaml-patch.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx b/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx index 94ecc97609f..5dee163b753 100644 --- a/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx +++ b/examples/core-auth-nextjs/src/app/(dashboard)/layout.tsx @@ -1,6 +1,11 @@ import * as React from 'react'; import { DashboardLayout } from '@toolpad/core/DashboardLayout'; +import { PageContainer } from '@toolpad/core/PageContainer'; export default async function DashboardPagesLayout(props: { children: React.ReactNode }) { - return {props.children}; + return ( + + {props.children} + + ); } diff --git a/examples/core-auth-nextjs/src/app/layout.tsx b/examples/core-auth-nextjs/src/app/layout.tsx index ff8c20024d8..36e22ddf283 100644 --- a/examples/core-auth-nextjs/src/app/layout.tsx +++ b/examples/core-auth-nextjs/src/app/layout.tsx @@ -18,7 +18,7 @@ const NAVIGATION: Navigation = [ icon: , }, { - segment: '/orders', + segment: 'orders', title: 'Orders', icon: , }, diff --git a/playground/nextjs-pages/src/pages/_app.tsx b/playground/nextjs-pages/src/pages/_app.tsx index a0891801045..97f7c74db22 100644 --- a/playground/nextjs-pages/src/pages/_app.tsx +++ b/playground/nextjs-pages/src/pages/_app.tsx @@ -26,12 +26,12 @@ const NAVIGATION: Navigation = [ title: 'Main items', }, { - segment: '/', + segment: '', title: 'Dashboard', icon: , }, { - segment: '/orders', + segment: 'orders', title: 'Orders', icon: , }, From 742daa4f933ef9d8ea99af1f1b7918d42ef5d68b Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 31 Jul 2024 09:35:37 +0530 Subject: [PATCH 103/109] fix: `dedupe` --- pnpm-lock.yaml | 222 ++++++++++++++++++++++++++++--------------------- 1 file changed, 127 insertions(+), 95 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca8ee0bd6af..d45e33aa5c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,7 +104,7 @@ importers: version: https://codeload.github.com/mui/material-ui/tar.gz/2fe1e9c0ecd0cfa928ed632083c0dfe05ba4351c(encoding@0.1.13) '@mui/x-charts': specifier: 7.11.0 - version: 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@next/eslint-plugin-next': specifier: 14.2.5 version: 14.2.5 @@ -194,7 +194,7 @@ importers: version: 7.34.3(eslint@8.57.0) eslint-plugin-react-compiler: specifier: latest - version: 0.0.0-experimental-0998c1e-20240625(eslint@8.57.0) + version: 0.0.0-experimental-9ed098e-20240725(eslint@8.57.0) eslint-plugin-react-hooks: specifier: 4.6.2 version: 4.6.2(eslint@8.57.0) @@ -293,10 +293,10 @@ importers: version: 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/docs': specifier: next - version: 6.0.0-beta.3(h2e6g77vnz7qljfcmobfugulwm) + version: 6.0.0-beta.4(xgvazv6bvdw74wg5vv6vgzvx6u) '@mui/icons-material': specifier: next - version: 6.0.0-beta.3(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.4(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/internal-markdown': specifier: ^1.0.1 version: 1.0.8 @@ -305,28 +305,28 @@ importers: version: 5.0.0-beta.46(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/lab': specifier: next - version: 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': specifier: next - version: 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: next - version: 6.0.0-beta.3(@emotion/cache@11.11.0)(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/server@11.11.0)(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 6.0.0-beta.4(@emotion/cache@11.11.0)(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/server@11.11.0)(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@mui/styles': specifier: next - version: 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) '@mui/system': specifier: next - version: 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': specifier: next - version: 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + version: 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) '@mui/x-date-pickers': specifier: 7.11.0 - version: 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-date-pickers-pro': specifier: 7.11.0 - version: 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-license': specifier: 7.11.0 version: 7.11.0(@types/react@18.3.3)(react@18.3.1) @@ -1198,7 +1198,7 @@ importers: version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: 5.16.4 - version: 5.16.4(@emotion/cache@11.13.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.16.4(@emotion/cache@11.13.1)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@toolpad/core': specifier: workspace:* version: link:../../packages/toolpad-core @@ -1243,7 +1243,7 @@ importers: version: 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': specifier: 5.16.4 - version: 5.16.4(@emotion/cache@11.13.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.16.4(@emotion/cache@11.13.1)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@toolpad/core': specifier: workspace:* version: link:../../packages/toolpad-core @@ -2094,6 +2094,10 @@ packages: resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.7': resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} @@ -2159,8 +2163,8 @@ packages: '@emotion/cache@11.11.0': resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - '@emotion/cache@11.13.0': - resolution: {integrity: sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==} + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -2650,8 +2654,8 @@ packages: '@mui/core-downloads-tracker@6.0.0-dev.240424162023-9968b4889d': resolution: {integrity: sha512-doh3M3U7HUGSBIWGe1yvesSbfDguMRjP0N09ogWSBM2hovXAlgULhMgcRTepAZLLwfRxFII0bCohq6B9NqoKuw==} - '@mui/docs@6.0.0-beta.3': - resolution: {integrity: sha512-QnA7sTuOxUMFyD+aehKpc/rgEma3lFl0rFlkwGTeuDkKnUgtvbL0IzQPG6ZnjRDMGKrF/JPghETrRLx+SQM9Dw==} + '@mui/docs@6.0.0-beta.4': + resolution: {integrity: sha512-zQ/0CPWRmNBDYwLE10FrBm4wnLUCm5200ZsyqFowcHr2Utajmlsby4BIkhjlZ7/XurQr2SW67bA+VIWT+GKvDQ==} engines: {node: '>=14.0.0'} peerDependencies: '@mui/base': '*' @@ -2660,6 +2664,7 @@ packages: '@mui/system': ^5.0.0 '@types/react': ^17.0.0 || ^18.0.0 chai: ^4.4.1 + csstype: ^3.1.3 next: ^13.5.1 || ^14 react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: @@ -2688,11 +2693,11 @@ packages: '@types/react': optional: true - '@mui/icons-material@6.0.0-beta.3': - resolution: {integrity: sha512-tsEqy19BJLb4H17u4yrplDRK2h5nc/PJrD5jlrq/EjX3NAJjCCcWyXPvHFO3GQMVcnnMVYlqzTP4pUsWAAMPng==} + '@mui/icons-material@6.0.0-beta.4': + resolution: {integrity: sha512-04lX8JqiKEZYUO2PZSksWt6bvecCmSkBolk6XiCIjjnCX95sGUdhoGFrnIwldBwEyn5N1/M4zUeBPkn09CrFrQ==} engines: {node: '>=14.0.0'} peerDependencies: - '@mui/material': 6.0.0-beta.3 + '@mui/material': 6.0.0-beta.4 '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 peerDependenciesMeta: @@ -2761,14 +2766,14 @@ packages: '@types/react': optional: true - '@mui/lab@6.0.0-beta.3': - resolution: {integrity: sha512-PHnYfWl2H6ADz+MXiNNC9DMehsHPc063Y2+1mgBEJ8Konmxd8pG7EXNmSS/BNEJFI5q6V7r3H20kajdnTt4qLQ==} + '@mui/lab@6.0.0-beta.4': + resolution: {integrity: sha512-bBkWE5U/M/kBllilcvs3V2RySSz0/q3s4BxagD/5bvqz1v1VyASBRyY0bovV/oNAGN1fBKAsevxb0hklNnClvQ==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material': ^6.0.0-beta.3 - '@mui/material-pigment-css': ^6.0.0-beta.3 + '@mui/material': ^6.0.0-beta.4 + '@mui/material-pigment-css': ^6.0.0-beta.4 '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -2800,8 +2805,8 @@ packages: '@types/react': optional: true - '@mui/material-nextjs@6.0.0-beta.3': - resolution: {integrity: sha512-05B3OUXFuUhc51oE8/jhDY7ffv8UQqOndQ6SPMzBRl15DCzmcqvKXdP6zj1fGkTc+HVjlIRwx4oJ6M/hm7XsQA==} + '@mui/material-nextjs@6.0.0-beta.4': + resolution: {integrity: sha512-GSI/tX32T5iYtqjpbt0AbSMWvRX0yLdyCIYt8AB5HOHNYXlP7kDd+9INhReTbjdg8ZJqWeH87mxzKQ3/gbStGg==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/cache': ^11.11.0 @@ -2855,13 +2860,13 @@ packages: '@types/react': optional: true - '@mui/material@6.0.0-beta.3': - resolution: {integrity: sha512-hZFv7lXHCn23fh6fe6/zjo0YSaw3TZ8RxGOagu8UfR5vyIdQQd57V1kk85Gl1W8Of5wcFilzkEjO7UAIIEoEGg==} + '@mui/material@6.0.0-beta.4': + resolution: {integrity: sha512-TqETyQcwH6+3MdsZbTyJK8y41j//xeWKG9kvH4CEGeYDXConBc4TFS/2t+lf1w051Vd74/GiyGaDqlSX1Fn3dQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material-pigment-css': ^6.0.0-beta.3 + '@mui/material-pigment-css': ^6.0.0-beta.4 '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 @@ -2910,8 +2915,8 @@ packages: '@types/react': optional: true - '@mui/private-theming@6.0.0-beta.3': - resolution: {integrity: sha512-b/SAMp21qj2jaOYjfM4EF9lOzu8AFsmAPmVMq8YM23+JAu+y88xTXihH/m5mbnIpsP/pM4+fCeZ79tWNTZUEyg==} + '@mui/private-theming@6.0.0-beta.4': + resolution: {integrity: sha512-mHt4NH6KD1dOc/Y9yG5xkVtKRTmo2khLiJrbgfU1BLTKD++jAoadnZihQvEubQQzw0+dcBP/5mI9Gv5udTSdiA==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2959,8 +2964,8 @@ packages: '@emotion/styled': optional: true - '@mui/styled-engine@6.0.0-beta.3': - resolution: {integrity: sha512-Lul9pmAvZ37pe2SPqbh+aJCdS8Pg5CJJsiHGGRaga+b2c+8GIu1nn/J78R2lr5ES8aLFT9onMK2HOcFgu0VLGA==} + '@mui/styled-engine@6.0.0-beta.4': + resolution: {integrity: sha512-L3twZGfmRk+qkkDZY+c8yWkYdRI0cGs5kyquqVUg1z4KZbFP/hDd2uDTpT/oZ0vJdPbwF9+INPexzkQG1KzlQg==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -2972,8 +2977,8 @@ packages: '@emotion/styled': optional: true - '@mui/styles@6.0.0-beta.3': - resolution: {integrity: sha512-QbekBkcqfDHY7W4HhZXWEwxqBmouPYJOUrCG/E74zPaMClqPbfzET9C801mHqzg8dGf42IBYqIUL/30g9t8FEQ==} + '@mui/styles@6.0.0-beta.4': + resolution: {integrity: sha512-YNN7jqgRZJFXkuVP4bjCGgt/thAOaBTPLZkEzonDdoKfU4N85yEEy/GFpwZUNTlVN5akfg9wpFWeMKxyFe8DEg==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -3030,8 +3035,8 @@ packages: '@types/react': optional: true - '@mui/system@6.0.0-beta.3': - resolution: {integrity: sha512-0JHz/td+VYh+am/J1CrExM+tNA9rrqqNa4nGNwAJPPM12D1p7QusdVfaaWZhhcslKoInR5V/ncrwj4KaBHoAow==} + '@mui/system@6.0.0-beta.4': + resolution: {integrity: sha512-0tKYCXOIQILKTkU6m6gjIQ3f9gU1qBa7vZFkTiyi2t3BTGRgOHduNaddQrAZYrTYGEBypaoOeCfllmtEW+dVmQ==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -3094,6 +3099,16 @@ packages: '@types/react': optional: true + '@mui/utils@6.0.0-beta.4': + resolution: {integrity: sha512-tJsYnoUh0d9JeEcz70jbF9S2uLviBDgu1FNWJUDvuz31a/ClaJsGY0sodHPhamvob3XrPjzdQX2xSZ91m9Jzag==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@mui/x-charts@7.11.0': resolution: {integrity: sha512-qNmrXk2eKoXOuxyLX6Vg4paWPcRttnIQx8hxuHc/avvGzX55kS4s69G8NIG0mtqygtDMcYJPDGNCJOlmkp1uAg==} engines: {node: '>=14.0.0'} @@ -5765,8 +5780,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-react-compiler@0.0.0-experimental-0998c1e-20240625: - resolution: {integrity: sha512-npq2RomExoQI3jETs4OrifaygyJYgOcX/q74Q9OC7GmffLh5zSJaQpzjs2fi61NMNkJyIvTBD0C6sKTGGcetOw==} + eslint-plugin-react-compiler@0.0.0-experimental-9ed098e-20240725: + resolution: {integrity: sha512-Xv2iD8kU6R4Wdjdh1WhdP8UnSqSV+/XcadxwBCmMr836fQUoXGuw/uVGc01v9opZs9SwKzo+8My6ayVCgAinPA==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' @@ -11146,6 +11161,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.7': dependencies: '@babel/code-frame': 7.24.7 @@ -11238,7 +11257,7 @@ snapshots: '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 - '@emotion/cache@11.13.0': + '@emotion/cache@11.13.1': dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 @@ -11747,7 +11766,7 @@ snapshots: '@mui/base@5.0.0-beta.55(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) '@mui/utils': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) @@ -11763,17 +11782,18 @@ snapshots: '@mui/core-downloads-tracker@6.0.0-dev.240424162023-9968b4889d': {} - '@mui/docs@6.0.0-beta.3(h2e6g77vnz7qljfcmobfugulwm)': + '@mui/docs@6.0.0-beta.4(xgvazv6bvdw74wg5vv6vgzvx6u)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/icons-material': 6.0.0-beta.3(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/icons-material': 6.0.0-beta.4(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/internal-markdown': 1.0.8 - '@mui/material': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) chai: 5.1.1 clipboard-copy: 4.0.1 clsx: 2.1.1 + csstype: 3.1.3 next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nprogress: 0.2.0 prop-types: 15.8.1 @@ -11797,10 +11817,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/icons-material@6.0.0-beta.3(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/icons-material@6.0.0-beta.4(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 - '@mui/material': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.25.0 + '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.3 @@ -11900,14 +11920,14 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/lab@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/lab@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.55(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 @@ -11917,20 +11937,20 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/material-nextjs@5.16.4(@emotion/cache@11.13.0)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.4(@emotion/cache@11.13.1)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: - '@emotion/cache': 11.13.0 + '@emotion/cache': 11.13.1 '@emotion/server': 11.11.0 '@types/react': 18.3.3 - '@mui/material-nextjs@6.0.0-beta.3(@emotion/cache@11.11.0)(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/server@11.11.0)(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@6.0.0-beta.4(@emotion/cache@11.11.0)(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/server@11.11.0)(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -11981,13 +12001,13 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/core-downloads-tracker': 6.0.0-dev.240424162023-9968b4889d - '@mui/system': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@mui/system': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.10 clsx: 2.1.1 @@ -12043,10 +12063,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@mui/private-theming@6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1)': + '@mui/private-theming@6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 - '@mui/utils': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.25.0 + '@mui/utils': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: @@ -12085,10 +12105,10 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 - '@emotion/cache': 11.13.0 + '@babel/runtime': 7.25.0 + '@emotion/cache': 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 @@ -12096,13 +12116,13 @@ snapshots: '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/styles@6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1)': + '@mui/styles@6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/hash': 0.9.2 - '@mui/private-theming': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + '@mui/private-theming': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -12167,13 +12187,13 @@ snapshots: '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@types/react': 18.3.3 - '@mui/system@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/system@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 - '@mui/private-theming': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.25.0 + '@mui/private-theming': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) + '@mui/styled-engine': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1) + '@mui/utils': 6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -12221,7 +12241,19 @@ snapshots: '@mui/utils@6.0.0-beta.3(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 + '@mui/types': 7.2.15(@types/react@18.3.3) + '@types/prop-types': 15.7.12 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@mui/utils@6.0.0-beta.4(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.0 '@mui/types': 7.2.15(@types/react@18.3.3) '@types/prop-types': 15.7.12 clsx: 2.1.1 @@ -12255,11 +12287,11 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mui/x-charts@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-charts@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) '@react-spring/rafz': 9.7.3 @@ -12360,14 +12392,14 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers-pro@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers-pro@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) - '@mui/x-date-pickers': 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/x-date-pickers': 7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-license': 7.11.0(@types/react@18.3.3)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 @@ -12404,11 +12436,11 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.0.0-beta.3(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) '@types/react-transition-group': 4.4.10 @@ -14859,7 +14891,7 @@ snapshots: css-vendor@2.0.8: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 is-in-browser: 1.1.3 css.escape@1.5.1: {} @@ -15514,7 +15546,7 @@ snapshots: globals: 13.24.0 rambda: 7.5.0 - eslint-plugin-react-compiler@0.0.0-experimental-0998c1e-20240625(eslint@8.57.0): + eslint-plugin-react-compiler@0.0.0-experimental-9ed098e-20240725(eslint@8.57.0): dependencies: '@babel/core': 7.24.9 '@babel/parser': 7.24.8 @@ -16942,40 +16974,40 @@ snapshots: jss-plugin-camel-case@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 hyphenate-style-name: 1.1.0 jss: 10.10.0 jss-plugin-default-unit@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 jss: 10.10.0 jss-plugin-global@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 jss: 10.10.0 jss-plugin-nested@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 jss: 10.10.0 tiny-warning: 1.0.3 jss-plugin-props-sort@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 jss: 10.10.0 jss-plugin-rule-value-function@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 jss: 10.10.0 tiny-warning: 1.0.3 jss-plugin-vendor-prefixer@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 css-vendor: 2.0.8 jss: 10.10.0 From 877b047deaf295fdc3c4c78320fcb6f8149ca890 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 31 Jul 2024 10:47:41 +0530 Subject: [PATCH 104/109] fix: Review --- .../core/components/account/AccountDemo.js | 1 - .../core/components/account/AccountDemo.tsx | 1 - .../account/AccountWithDashboard.js | 1 - .../account/AccountWithDashboard.tsx | 1 - .../core/components/account/account.md | 2 +- .../sign-in-page/BrandingSignInPage.js | 6 +- .../sign-in-page/BrandingSignInPage.tsx | 7 +- .../BrandingSignInPage.tsx.preview | 13 ++ .../sign-in-page/OAuthSignInPage.js | 4 +- .../sign-in-page/OAuthSignInPage.tsx | 4 +- .../components/sign-in-page/sign-in-page.md | 104 +++++++++++----- .../src/SignInPage/SignInPage.tsx | 14 --- pnpm-lock.yaml | 114 ++++++++---------- 13 files changed, 155 insertions(+), 117 deletions(-) diff --git a/docs/data/toolpad/core/components/account/AccountDemo.js b/docs/data/toolpad/core/components/account/AccountDemo.js index 488c059fb29..cdab8b6603d 100644 --- a/docs/data/toolpad/core/components/account/AccountDemo.js +++ b/docs/data/toolpad/core/components/account/AccountDemo.js @@ -6,7 +6,6 @@ export default function AccountDemo() { const authentication = React.useMemo(() => { return { signIn: () => { - alert('Signing in!'); setSession({ user: { name: 'Bharat Kashyap', diff --git a/docs/data/toolpad/core/components/account/AccountDemo.tsx b/docs/data/toolpad/core/components/account/AccountDemo.tsx index e66484c7b56..fe964215d99 100644 --- a/docs/data/toolpad/core/components/account/AccountDemo.tsx +++ b/docs/data/toolpad/core/components/account/AccountDemo.tsx @@ -11,7 +11,6 @@ export default function AccountDemo() { const authentication = React.useMemo(() => { return { signIn: () => { - alert('Signing in!'); setSession({ user: { name: 'Bharat Kashyap', diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.js b/docs/data/toolpad/core/components/account/AccountWithDashboard.js index d9ef1f1776d..9490c00de3e 100644 --- a/docs/data/toolpad/core/components/account/AccountWithDashboard.js +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.js @@ -13,7 +13,6 @@ export default function AccountWithDashboard() { const authentication = React.useMemo(() => { return { signIn: () => { - alert('Signing in!'); setSession({ user: { name: 'Bharat Kashyap', diff --git a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx index d6c07dd61c9..f63a6721688 100644 --- a/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx +++ b/docs/data/toolpad/core/components/account/AccountWithDashboard.tsx @@ -13,7 +13,6 @@ export default function AccountWithDashboard() { const authentication = React.useMemo(() => { return { signIn: () => { - alert('Signing in!'); setSession({ user: { name: 'Bharat Kashyap', diff --git a/docs/data/toolpad/core/components/account/account.md b/docs/data/toolpad/core/components/account/account.md index e011c9464b1..331f4134a1f 100644 --- a/docs/data/toolpad/core/components/account/account.md +++ b/docs/data/toolpad/core/components/account/account.md @@ -8,7 +8,7 @@ components: Account

A component that renders an account management dropdown for your application.

-The `Account` component is a quick and easy way to display an account management menu for authenticated users. It works deeply with the `SignInPage` and `DashboardLayout` components, meaning that it automatically appears to the top navigation bar inside `DashboardLayout` once your users have signed in through the `SignInPage`. +The `Account` component is a quick and easy way to display an account management menu for authenticated users. It is deeply integrated with the `SignInPage` and `DashboardLayout` components, meaning that it automatically appears in the top navigation bar inside `DashboardLayout` once your users have signed in through the `SignInPage`. ## States diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js index a4a53f65e92..a3c4307327b 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.js @@ -10,6 +10,7 @@ const providers = [ { id: 'credentials', name: 'Email and Password' }, ]; +// preview-start const BRANDING = { logo: ( { const promise = new Promise((resolve) => { setTimeout(() => { - alert(`Signing in with "${provider.name}"`); + console.log(`Sign in with ${provider.id}`); resolve(); - }, 300); + }, 500); }); return promise; }; diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx index 616681f7524..23ba97e0e02 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx @@ -9,7 +9,7 @@ const providers = [ { id: 'google', name: 'Google' }, { id: 'credentials', name: 'Email and Password' }, ]; - +// preview-start const BRANDING = { logo: ( void = async (provider) => { const promise = new Promise((resolve) => { setTimeout(() => { - alert(`Signing in with "${provider.name}"`); + console.log(`Sign in with ${provider.id}`); resolve(); - }, 300); + }, 500); }); return promise; }; diff --git a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview index 26ee6ba95cd..e4142f33849 100644 --- a/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview +++ b/docs/data/toolpad/core/components/sign-in-page/BrandingSignInPage.tsx.preview @@ -1,3 +1,16 @@ +const BRANDING = { + logo: ( + MUI logo + ), + title: 'MUI', +}; + +// ... + \ No newline at end of file diff --git a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js index 31bcf126ee1..deffe90a7c4 100644 --- a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.js @@ -13,9 +13,9 @@ const providers = [ const signIn = async (provider) => { const promise = new Promise((resolve) => { setTimeout(() => { - alert(`Signing in with "${provider.name}"`); + console.log(`Sign in with ${provider.id}`); resolve(); - }, 300); + }, 500); }); return promise; }; diff --git a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx index 4bd2b3c5bd2..64539f77820 100644 --- a/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx +++ b/docs/data/toolpad/core/components/sign-in-page/OAuthSignInPage.tsx @@ -12,9 +12,9 @@ const providers = [ const signIn: (provider: AuthProvider) => void = async (provider) => { const promise = new Promise((resolve) => { setTimeout(() => { - alert(`Signing in with "${provider.name}"`); + console.log(`Sign in with ${provider.id}`); resolve(); - }, 300); + }, 500); }); return promise; }; diff --git a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md index 57f4a3b9168..382691b45b1 100644 --- a/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md +++ b/docs/data/toolpad/core/components/sign-in-page/sign-in-page.md @@ -6,7 +6,7 @@ components: SignInPage, Account, NotificationsProvider # Sign In Page -

A component that renders a functional authentication page for your application.

+

A customizable sign in UI component that abstracts away the pain needed to wire together a secure authentication page for your application.

The `SignInPage` component is a quick way to generate a ready-to-use authentication page with multiple OAuth providers, or a credentials form. @@ -47,44 +47,88 @@ This renders an alert with the `error` string as the message. #### Next.js App Directory and GitHub -The component is composable with any authentication library you might want to use. The following is a functional `SignInPage` with [auth.js](https://authjs.dev/) using GitHub, Next.js App router and server actions. +The component is composable with any authentication library you might want to use. The following is a `SignInPage` with [Auth.js](https://authjs.dev/) using GitHub, Next.js App router and server actions. -:::warning -The following demo does not initiate an actual GitHub authentication flow, since doing that from within an `iframe` is not permitted. Run the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) example to test this functionality. -::: - -{{"demo": "AuthJsSignInApp.js", "iframe": true, "height": 300 }} +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/core/auth-next.png", "alt": "Auth.js & Next.js with Toolpad Core sign in page", "caption": "Auth.js & Next.js app router with Toolpad Core Sign In page", "zoom": true, "indent": 1 }} #### Setting up -The project contains an `.env.local` with the following variables: +If you're using the default [Next.js app directory example](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/), Auth.js is already installed. Otherwise, follow the [installation instructions](https://authjs.dev/getting-started/installation). -```bash -AUTH_SECRET= -AUTH_GITHUB_ID= -AUTH_GITHUB_SECRET= -``` +##### GitHub configuration -You must pass values to them before running this project. +To get the required credentials, create an application in the GitHub developer settings. Read this [guide on Auth.js](https://authjs.dev/guides/configuring-github#adding-environment-variables) on how to obtain those. -##### AUTH_SECRET +##### Server Configuration -`AUTH_SECRET` is a random value used by the Auth.js to encrypt tokens and email verification hashes. (See [Auth.js Deployment documentation](https://authjs.dev/getting-started/deployment) to learn more). You can generate one via running: +The `SignInPage` component can slot in as a custom sign in page inside Auth.js: -```bash -npx auth secret +```ts title="./auth.ts" +// ... +export const { handlers, auth, signIn, signOut } = NextAuth({ + providers, + secret: process.env.AUTH_SECRET, + pages: { + signIn: '/auth/signin', // you can customize this based on your requirement + }, +// ... ``` -##### GitHub configuration - -| environment variable name                       | description | -| :------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | -| `AUTH_GITHUB_ID` | GitHub OAuth app client ID. | -| `AUTH_GITHUB_SECRET` | GitHub OAuth app client secret. | - -To get the required credentials from GitHub, create an application in their developer settings. Read this [guide on Auth.js](https://authjs.dev/guides/configuring-github) on how to obtain those. +You can then have a fully built GitHub sign in page appear at `/auth/signin` by adding `SignInPage` to `page.tsx`: + +```tsx title="./app/auth/signin/page.tsx" +// ... +import * as React from 'react'; +import type { AuthProvider } from '@toolpad/core'; +import { SignInPage } from '@toolpad/core/SignInPage'; +import { AuthError } from 'next-auth'; +import { providerMap, signIn } from '../../../auth'; + +export default function SignIn() { + return ( + { + 'use server'; + try { + return await signIn(provider.id, { + ...(formData && { + email: formData.get('email'), + password: formData.get('password'), + }), + redirectTo: callbackUrl ?? '/', + }); + } catch (error) { + if (error instanceof Error && error.message === 'NEXT_REDIRECT') { + throw error; + } + if (error instanceof AuthError) { + return { + error: + error.type === 'CredentialsSignin' + ? 'Invalid credentials.' + : 'An error with Auth.js occurred.', + type: error.type, + }; + } + return { + error: 'Something went wrong.', + type: 'UnknownError', + }; + } + }} + /> + ); +} +``` -Use our detailed examples with both the [Next.js app directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/) and [pages directory](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs-pages/) to get started using Auth.js with Toolpad Core. +:::info +If you're using the default [Next.js app directory example](https://github.com/mui/mui-toolpad/tree/master/examples/core-auth-nextjs/), all of this is already configured for you. Otherwise, follow the [custom sign in page instructions](https://authjs.dev/guides/pages/signin). +::: ## Customization @@ -106,4 +150,8 @@ To enable deep customization beyond what is possible with custom props, the `Sig ### 🚧 Layouts -The `SignInPage` component has versions with different layouts for authentication - one column, two column and others such. The APIs of these components is identical. This is in progress. +The `SignInPage` component has versions with different layouts for authentication - one column, two column and others such. The APIs of these components are identical. This is in progress. + +## 🚧 Other authentication Flows + +The `SignInPage` will be accompanied by other components to allow users to sign up, verify emails and reset passwords. This is in progress. diff --git a/packages/toolpad-core/src/SignInPage/SignInPage.tsx b/packages/toolpad-core/src/SignInPage/SignInPage.tsx index 0b4927bce7a..1d2156912af 100644 --- a/packages/toolpad-core/src/SignInPage/SignInPage.tsx +++ b/packages/toolpad-core/src/SignInPage/SignInPage.tsx @@ -9,8 +9,6 @@ import Checkbox from '@mui/material/Checkbox'; import Container from '@mui/material/Container'; import Divider from '@mui/material/Divider'; import FormControlLabel from '@mui/material/FormControlLabel'; -import Grid from '@mui/material/Grid'; -import Link from '@mui/material/Link'; import TextField, { TextFieldProps } from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import LoadingButton, { LoadingButtonProps } from '@mui/lab/LoadingButton'; @@ -308,18 +306,6 @@ function SignInPage(props: SignInPageProps) { > Sign in - - - - Forgot password? - - - - - {"Don't have an account? Sign Up"} - - -
) : null} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d45e33aa5c3..7519e76e8ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2090,10 +2090,6 @@ packages: '@babel/runtime@7.0.0': resolution: {integrity: sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==} - '@babel/runtime@7.24.8': - resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.0': resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} @@ -11157,10 +11153,6 @@ snapshots: dependencies: regenerator-runtime: 0.12.1 - '@babel/runtime@7.24.8': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 @@ -11236,7 +11228,7 @@ snapshots: '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.4 @@ -11277,7 +11269,7 @@ snapshots: '@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 @@ -11310,7 +11302,7 @@ snapshots: '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) @@ -11738,7 +11730,7 @@ snapshots: '@mui/base@5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) @@ -11752,7 +11744,7 @@ snapshots: '@mui/base@5.0.0-beta.51(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) '@mui/utils': 6.0.0-alpha.13(@types/react@18.3.3)(react@18.3.1) @@ -11803,7 +11795,7 @@ snapshots: '@mui/icons-material@5.16.4(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: @@ -11811,7 +11803,7 @@ snapshots: '@mui/icons-material@6.0.0-beta.2(@mui/material@6.0.0-beta.2(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/material': 6.0.0-beta.2(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: @@ -11832,7 +11824,7 @@ snapshots: '@mui/internal-markdown@1.0.8': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 lodash: 4.17.21 marked: 13.0.2 prismjs: 1.29.0 @@ -11854,7 +11846,7 @@ snapshots: '@mui/joy@5.0.0-beta.46(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.51(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/core-downloads-tracker': 6.0.0-dev.240424162023-9968b4889d '@mui/system': 6.0.0-alpha.13(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -11871,7 +11863,7 @@ snapshots: '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -11888,7 +11880,7 @@ snapshots: '@mui/lab@5.0.0-alpha.172(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -11905,7 +11897,7 @@ snapshots: '@mui/lab@5.0.0-alpha.172(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.2(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 6.0.0-beta.2(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -11939,7 +11931,7 @@ snapshots: '@mui/material-nextjs@5.16.4(@emotion/cache@11.13.1)(@emotion/server@11.11.0)(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -11961,7 +11953,7 @@ snapshots: '@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/core-downloads-tracker': 5.16.4 '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) @@ -11982,7 +11974,7 @@ snapshots: '@mui/material@6.0.0-beta.2(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/core-downloads-tracker': 6.0.0-dev.240424162023-9968b4889d '@mui/system': 6.0.0-beta.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) @@ -12038,7 +12030,7 @@ snapshots: '@mui/private-theming@5.16.4(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 @@ -12047,7 +12039,7 @@ snapshots: '@mui/private-theming@6.0.0-alpha.13(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/utils': 6.0.0-alpha.13(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 @@ -12056,7 +12048,7 @@ snapshots: '@mui/private-theming@6.0.0-beta.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/utils': 6.0.0-beta.1(@types/react@18.3.3)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 @@ -12074,7 +12066,7 @@ snapshots: '@mui/styled-engine@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 @@ -12085,7 +12077,7 @@ snapshots: '@mui/styled-engine@6.0.0-alpha.13(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 @@ -12096,7 +12088,7 @@ snapshots: '@mui/styled-engine@6.0.0-beta.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/cache': 11.11.0 csstype: 3.1.3 prop-types: 15.8.1 @@ -12141,7 +12133,7 @@ snapshots: '@mui/system@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/private-theming': 5.16.4(@types/react@18.3.3)(react@18.3.1) '@mui/styled-engine': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) @@ -12157,7 +12149,7 @@ snapshots: '@mui/system@6.0.0-alpha.13(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/private-theming': 6.0.0-alpha.13(@types/react@18.3.3)(react@18.3.1) '@mui/styled-engine': 6.0.0-alpha.13(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) @@ -12173,7 +12165,7 @@ snapshots: '@mui/system@6.0.0-beta.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/private-theming': 6.0.0-beta.1(@types/react@18.3.3)(react@18.3.1) '@mui/styled-engine': 6.0.0-beta.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.15(@types/react@18.3.3) @@ -12209,7 +12201,7 @@ snapshots: '@mui/utils@5.16.4(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 @@ -12220,7 +12212,7 @@ snapshots: '@mui/utils@6.0.0-alpha.13(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@types/prop-types': 15.7.12 prop-types: 15.8.1 react: 18.3.1 @@ -12230,7 +12222,7 @@ snapshots: '@mui/utils@6.0.0-beta.1(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 @@ -12265,7 +12257,7 @@ snapshots: '@mui/x-charts@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -12289,7 +12281,7 @@ snapshots: '@mui/x-charts@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -12313,7 +12305,7 @@ snapshots: '@mui/x-data-grid-premium@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) @@ -12335,7 +12327,7 @@ snapshots: '@mui/x-data-grid-pro@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) @@ -12355,7 +12347,7 @@ snapshots: '@mui/x-data-grid@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) @@ -12372,7 +12364,7 @@ snapshots: '@mui/x-date-pickers-pro@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns@2.30.0)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -12394,7 +12386,7 @@ snapshots: '@mui/x-date-pickers-pro@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -12417,7 +12409,7 @@ snapshots: '@mui/x-date-pickers@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns@2.30.0)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -12438,7 +12430,7 @@ snapshots: '@mui/x-date-pickers@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(date-fns-jalali@2.29.3-0)(date-fns@2.30.0)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': 6.0.0-beta.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': 5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) @@ -12460,7 +12452,7 @@ snapshots: '@mui/x-internals@7.11.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 transitivePeerDependencies: @@ -12468,7 +12460,7 @@ snapshots: '@mui/x-license@7.11.0(@types/react@18.3.3)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@mui/utils': 5.16.4(@types/react@18.3.3)(react@18.3.1) react: 18.3.1 transitivePeerDependencies: @@ -12476,7 +12468,7 @@ snapshots: '@mui/x-tree-view@7.11.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.4(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1) '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -13105,7 +13097,7 @@ snapshots: '@testing-library/dom@10.2.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -13116,7 +13108,7 @@ snapshots: '@testing-library/jest-dom@6.4.6(vitest@2.0.0-beta.13(@types/node@20.14.11)(@vitest/browser@2.0.0-beta.13)(jsdom@24.1.0)(terser@5.31.1))': dependencies: '@adobe/css-tools': 4.4.0 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 @@ -13128,7 +13120,7 @@ snapshots: '@testing-library/react@16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@testing-library/dom': 10.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14235,7 +14227,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 cosmiconfig: 7.1.0 resolve: 1.22.8 @@ -14282,7 +14274,7 @@ snapshots: babel-plugin-preval@5.1.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 '@types/babel__core': 7.20.5 babel-plugin-macros: 3.1.0 require-from-string: 2.0.2 @@ -14979,7 +14971,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 dateformat@3.0.3: {} @@ -15117,7 +15109,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 csstype: 3.1.3 dot-prop@5.3.0: @@ -17018,7 +17010,7 @@ snapshots: jss@10.10.0: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 csstype: 3.1.3 is-in-browser: 1.1.3 tiny-warning: 1.0.3 @@ -18656,7 +18648,7 @@ snapshots: dependencies: '@babel/core': 7.24.9 '@babel/generator': 7.24.10 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -18690,14 +18682,14 @@ snapshots: react-error-boundary@4.0.13(react@18.3.1): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 react: 18.3.1 react-error-overlay@6.0.11: {} react-event-listener@0.6.6(react@18.3.1): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 prop-types: 15.8.1 react: 18.3.1 warning: 4.0.3 @@ -18785,7 +18777,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -18931,7 +18923,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 regexp.prototype.flags@1.5.2: dependencies: @@ -19074,7 +19066,7 @@ snapshots: rtl-css-js@1.16.1: dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.0 run-async@2.4.1: {} From e6dc77fcc04ba2ff8fc4c29fd244dd063bf624e1 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 31 Jul 2024 14:27:18 +0530 Subject: [PATCH 105/109] fix: Resolve "TODO" --- examples/core-auth-nextjs-pages/package.json | 2 +- examples/core-auth-nextjs-pages/src/auth.ts | 2 +- examples/core-auth-nextjs/package.json | 2 +- examples/core-auth-nextjs/src/auth.ts | 4 +--- playground/nextjs-pages/package.json | 2 +- playground/nextjs-pages/src/auth.ts | 2 +- playground/nextjs/package.json | 2 +- playground/nextjs/src/auth.ts | 4 +--- 8 files changed, 8 insertions(+), 12 deletions(-) diff --git a/examples/core-auth-nextjs-pages/package.json b/examples/core-auth-nextjs-pages/package.json index 3a1dbbdb7ed..95c672fbca1 100644 --- a/examples/core-auth-nextjs-pages/package.json +++ b/examples/core-auth-nextjs-pages/package.json @@ -14,7 +14,7 @@ "@mui/material-nextjs": "next", "@toolpad/core": "latest", "next": "14.2.4", - "next-auth": "5.0.0-beta.18", + "next-auth": "beta", "react": "18.3.1", "react-dom": "18.3.1" }, diff --git a/examples/core-auth-nextjs-pages/src/auth.ts b/examples/core-auth-nextjs-pages/src/auth.ts index bd2ca76b7a9..ea2d24096a6 100644 --- a/examples/core-auth-nextjs-pages/src/auth.ts +++ b/examples/core-auth-nextjs-pages/src/auth.ts @@ -20,7 +20,7 @@ const providers: Provider[] = [ return { id: 'test', name: 'Test User', - email: 'test@example.com', + email: c.email, }; }, }), diff --git a/examples/core-auth-nextjs/package.json b/examples/core-auth-nextjs/package.json index a1f4cfd41b9..54031cc342e 100644 --- a/examples/core-auth-nextjs/package.json +++ b/examples/core-auth-nextjs/package.json @@ -14,7 +14,7 @@ "@mui/material-nextjs": "next", "@toolpad/core": "latest", "next": "14.2.4", - "next-auth": "5.0.0-beta.18", + "next-auth": "beta", "react": "18.3.1", "react-dom": "18.3.1" }, diff --git a/examples/core-auth-nextjs/src/auth.ts b/examples/core-auth-nextjs/src/auth.ts index 1b576e12053..8d879974213 100644 --- a/examples/core-auth-nextjs/src/auth.ts +++ b/examples/core-auth-nextjs/src/auth.ts @@ -15,14 +15,12 @@ const providers: Provider[] = [ }, authorize(c) { if (c.password !== 'password') { - // TODO: Set next-auth version to latest when - // https://github.com/nextauthjs/next-auth/issues/11074 is resolved return null; } return { id: 'test', name: 'Test User', - email: 'test@example.com', + email: c.email, }; }, }), diff --git a/playground/nextjs-pages/package.json b/playground/nextjs-pages/package.json index bbf5514f259..9436c69bb68 100644 --- a/playground/nextjs-pages/package.json +++ b/playground/nextjs-pages/package.json @@ -12,7 +12,7 @@ "@mui/icons-material": "5.16.4", "@mui/material": "5.16.4", "@mui/material-nextjs": "5.16.4", - "next-auth": "5.0.0-beta.19", + "next-auth": "beta", "@toolpad/core": "workspace:*", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", diff --git a/playground/nextjs-pages/src/auth.ts b/playground/nextjs-pages/src/auth.ts index bd2ca76b7a9..ea2d24096a6 100644 --- a/playground/nextjs-pages/src/auth.ts +++ b/playground/nextjs-pages/src/auth.ts @@ -20,7 +20,7 @@ const providers: Provider[] = [ return { id: 'test', name: 'Test User', - email: 'test@example.com', + email: c.email, }; }, }), diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index beb0688e11e..4f8c3952b20 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -19,7 +19,7 @@ "@types/react-dom": "18.3.0", "eslint-config-next": "14.2.4", "next": "14.2.5", - "next-auth": "5.0.0-beta.18", + "next-auth": "beta", "react": "18.3.1", "react-dom": "18.3.1" } diff --git a/playground/nextjs/src/auth.ts b/playground/nextjs/src/auth.ts index 1b576e12053..8d879974213 100644 --- a/playground/nextjs/src/auth.ts +++ b/playground/nextjs/src/auth.ts @@ -15,14 +15,12 @@ const providers: Provider[] = [ }, authorize(c) { if (c.password !== 'password') { - // TODO: Set next-auth version to latest when - // https://github.com/nextauthjs/next-auth/issues/11074 is resolved return null; } return { id: 'test', name: 'Test User', - email: 'test@example.com', + email: c.email, }; }, }), From 4439766456637e1a16be8df99c45646727bb128c Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 31 Jul 2024 14:27:55 +0530 Subject: [PATCH 106/109] fix: `Unstable_Grid2` is unresolved --- .../components/page-container/PageContent.js | 2 +- .../components/page-container/PageContent.tsx | 2 +- docs/src/components/landing-core/Examples.js | 2 +- docs/src/components/landing-core/Features.js | 2 +- .../components/landing-core/StudioIntro.js | 2 +- .../landing-core/ToolpadDashboardLayout.tsx | 2 +- docs/src/components/landing/CardGrid.js | 2 +- docs/src/components/landing/UseCases.js | 2 +- pnpm-lock.yaml | 50 ++++++++++++++----- 9 files changed, 45 insertions(+), 21 deletions(-) diff --git a/docs/data/toolpad/core/components/page-container/PageContent.js b/docs/data/toolpad/core/components/page-container/PageContent.js index 808c4242497..5a500556015 100644 --- a/docs/data/toolpad/core/components/page-container/PageContent.js +++ b/docs/data/toolpad/core/components/page-container/PageContent.js @@ -2,7 +2,7 @@ import * as React from 'react'; import Card from '@mui/material/Card'; import CardContent from '@mui/material/CardContent'; import Typography from '@mui/material/Typography'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; export default function PageContent() { return ( diff --git a/docs/data/toolpad/core/components/page-container/PageContent.tsx b/docs/data/toolpad/core/components/page-container/PageContent.tsx index 808c4242497..5a500556015 100644 --- a/docs/data/toolpad/core/components/page-container/PageContent.tsx +++ b/docs/data/toolpad/core/components/page-container/PageContent.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import Card from '@mui/material/Card'; import CardContent from '@mui/material/CardContent'; import Typography from '@mui/material/Typography'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; export default function PageContent() { return ( diff --git a/docs/src/components/landing-core/Examples.js b/docs/src/components/landing-core/Examples.js index 4828201b025..1160e68efaf 100644 --- a/docs/src/components/landing-core/Examples.js +++ b/docs/src/components/landing-core/Examples.js @@ -10,7 +10,7 @@ import DashboardRoundedIcon from '@mui/icons-material/DashboardRounded'; import AutoAwesomeRoundedIcon from '@mui/icons-material/AutoAwesomeRounded'; import SectionHeadline from 'docs/src/components/typography/SectionHeadline'; import GradientText from 'docs/src/components/typography/GradientText'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; const ImageContainer = styled(Link)(({ theme }) => [ { diff --git a/docs/src/components/landing-core/Features.js b/docs/src/components/landing-core/Features.js index a4341f880b2..f33be156a7d 100644 --- a/docs/src/components/landing-core/Features.js +++ b/docs/src/components/landing-core/Features.js @@ -1,5 +1,5 @@ import * as React from 'react'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; import Typography from '@mui/material/Typography'; import Section from 'docs/src/layouts/Section'; import SectionHeadline from 'docs/src/components/typography/SectionHeadline'; diff --git a/docs/src/components/landing-core/StudioIntro.js b/docs/src/components/landing-core/StudioIntro.js index 3b10b2c9732..e868425e89b 100644 --- a/docs/src/components/landing-core/StudioIntro.js +++ b/docs/src/components/landing-core/StudioIntro.js @@ -1,6 +1,6 @@ import * as React from 'react'; import { alpha } from '@mui/material/styles'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; import Card from '@mui/material/Card'; import CardMedia from '@mui/material/CardMedia'; import Typography from '@mui/material/Typography'; diff --git a/docs/src/components/landing-core/ToolpadDashboardLayout.tsx b/docs/src/components/landing-core/ToolpadDashboardLayout.tsx index 59c9a9fce6a..4b58c4d625f 100644 --- a/docs/src/components/landing-core/ToolpadDashboardLayout.tsx +++ b/docs/src/components/landing-core/ToolpadDashboardLayout.tsx @@ -12,7 +12,7 @@ import { AppProvider, Router } from '@toolpad/core/AppProvider'; import { DashboardLayout } from '@toolpad/core/DashboardLayout'; import { PageContainer, type Navigation } from '@toolpad/core'; import DemoSandbox from 'docs/src/modules/components/DemoSandbox'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; import { styled } from '@mui/material'; import Frame from '../../modules/components/Frame'; diff --git a/docs/src/components/landing/CardGrid.js b/docs/src/components/landing/CardGrid.js index edcacaab991..c4f38125817 100644 --- a/docs/src/components/landing/CardGrid.js +++ b/docs/src/components/landing/CardGrid.js @@ -4,7 +4,7 @@ import { alpha } from '@mui/material/styles'; import Box from '@mui/material/Box'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; import SectionHeadline from 'docs/src/components/typography/SectionHeadline'; import Section from 'docs/src/layouts/Section'; import IconImage from 'docs/src/components/icon/IconImage'; diff --git a/docs/src/components/landing/UseCases.js b/docs/src/components/landing/UseCases.js index 176cd8cc93d..d2aa3aed795 100644 --- a/docs/src/components/landing/UseCases.js +++ b/docs/src/components/landing/UseCases.js @@ -12,7 +12,7 @@ import DashboardRoundedIcon from '@mui/icons-material/DashboardRounded'; import AutoAwesomeRoundedIcon from '@mui/icons-material/AutoAwesomeRounded'; import SectionHeadline from 'docs/src/components/typography/SectionHeadline'; import GradientText from 'docs/src/components/typography/GradientText'; -import Grid from '@mui/material/Unstable_Grid2'; +import Grid from '@mui/material/Grid2'; const ImageContainer = styled(Link)(({ theme }) => [ { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7519e76e8ff..c6a5df26bbd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1218,8 +1218,8 @@ importers: specifier: 14.2.5 version: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: - specifier: 5.0.0-beta.18 - version: 5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: beta + version: 5.0.0-beta.20(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: 18.3.1 version: 18.3.1 @@ -1412,6 +1412,20 @@ packages: nodemailer: optional: true + '@auth/core@0.34.2': + resolution: {integrity: sha512-KywHKRgLiF3l7PLyL73fjLSIBe1YNcA6sMeew4yMP6cfCWGXZrkkXd32AjRi1hlJ9nvovUBGZHvbn+LijO6ZeQ==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + '@babel/cli@7.24.8': resolution: {integrity: sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==} engines: {node: '>=6.9.0'} @@ -7623,14 +7637,14 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - next-auth@5.0.0-beta.18: - resolution: {integrity: sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ==} + next-auth@5.0.0-beta.19: + resolution: {integrity: sha512-YHu1igcAxZPh8ZB7GIM93dqgY6gcAzq66FOhQFheAdOx1raxNcApt05nNyNCSB6NegSiyJ4XOPsaNow4pfDmsg==} peerDependencies: '@simplewebauthn/browser': ^9.0.1 '@simplewebauthn/server': ^9.0.2 - next: ^14 + next: ^14 || ^15.0.0-0 nodemailer: ^6.6.5 - react: ^18.2.0 + react: ^18.2.0 || ^19.0.0-0 peerDependenciesMeta: '@simplewebauthn/browser': optional: true @@ -7639,12 +7653,12 @@ packages: nodemailer: optional: true - next-auth@5.0.0-beta.19: - resolution: {integrity: sha512-YHu1igcAxZPh8ZB7GIM93dqgY6gcAzq66FOhQFheAdOx1raxNcApt05nNyNCSB6NegSiyJ4XOPsaNow4pfDmsg==} + next-auth@5.0.0-beta.20: + resolution: {integrity: sha512-+48SjV9k9AtUU3JbEIa4PXNjKIewfFjVGL7Xs2RKkuQ5QqegDNIQiIG8sLk6/qo7RTScQYIGKgeQ5IuQRtrTQg==} peerDependencies: '@simplewebauthn/browser': ^9.0.1 '@simplewebauthn/server': ^9.0.2 - next: ^14 || ^15.0.0-0 + next: ^14.0.0-0 || ^15.0.0-0 nodemailer: ^6.6.5 react: ^18.2.0 || ^19.0.0-0 peerDependenciesMeta: @@ -10262,6 +10276,16 @@ snapshots: preact: 10.11.3 preact-render-to-string: 5.2.3(preact@10.11.3) + '@auth/core@0.34.2': + dependencies: + '@panva/hkdf': 1.2.0 + '@types/cookie': 0.6.0 + cookie: 0.6.0 + jose: 5.6.2 + oauth4webapi: 2.11.1 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + '@babel/cli@7.24.8(@babel/core@7.24.9)': dependencies: '@babel/core': 7.24.9 @@ -17707,15 +17731,15 @@ snapshots: nested-error-stacks@2.1.1: {} - next-auth@5.0.0-beta.18(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: - '@auth/core': 0.31.0 + '@auth/core': 0.32.0 next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.20(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: - '@auth/core': 0.32.0 + '@auth/core': 0.34.2 next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 From 7c884f69035a4ed3edc9a3ebff8542b87f3df535 Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Wed, 31 Jul 2024 15:22:11 +0530 Subject: [PATCH 107/109] fix: Add demos to landing page --- docs/src/components/landing-core/BuiltWith.js | 10 +- docs/src/components/landing-core/Examples.js | 8 +- docs/src/components/landing-core/Features.js | 5 +- docs/src/components/landing-core/Hero.js | 6 +- .../landing-core/ToolpadAuthDemo.tsx | 96 +++++++++++++++++++ .../landing-core/ToolpadDashboardLayout.tsx | 2 +- .../landing-core/ToolpadDialogDemo.tsx | 2 +- .../landing-core/ToolpadFeaturesSwitcher.tsx | 16 ++-- .../landing-core/ToolpadNotificationDemo.tsx | 2 +- .../landing-core/ToolpadPageContainerDemo.tsx | 2 +- pnpm-lock.yaml | 50 +--------- 11 files changed, 123 insertions(+), 76 deletions(-) create mode 100644 docs/src/components/landing-core/ToolpadAuthDemo.tsx diff --git a/docs/src/components/landing-core/BuiltWith.js b/docs/src/components/landing-core/BuiltWith.js index 5f3b5caa823..02c54c6540c 100644 --- a/docs/src/components/landing-core/BuiltWith.js +++ b/docs/src/components/landing-core/BuiltWith.js @@ -1,6 +1,6 @@ import * as React from 'react'; import Typography from '@mui/material/Typography'; -import Grid from '@mui/material/Grid'; +import Grid from '@mui/material/Grid2'; import GradientText from 'docs/src/components/typography/GradientText'; import Section from 'docs/src/layouts/Section'; import SectionHeadline from 'docs/src/components/typography/SectionHeadline'; @@ -11,7 +11,7 @@ const content = [ icon: React, title: 'React', description: - 'Toolpad is a code-centric approach to admin apps. Entire app is accessible and customizable through React code.', + 'Toolpad is a code-centric approach to admin apps. The entire app is accessible and customizable through React code.', }, { icon: ( @@ -27,13 +27,13 @@ const content = [ ), title: 'Next.js', description: - 'Next.js sets the industry standard for modern React applications. Building over it, is a leverage that makes Toolpad efficient.', + 'Next.js sets the industry standard for modern React applications. Building over it is a leverage that makes Toolpad efficient.', }, { icon: MUI, title: 'MUI', description: - 'The tight integration with MUI ensures you get all the latest features from our list of MaterialUI components.', + 'A tight integration with MUI ensures you get all the latest features from our list of Material UI components.', }, ]; @@ -51,7 +51,7 @@ export default function BuiltWith() { /> {content.map(({ icon, title, description }) => ( - + ))} diff --git a/docs/src/components/landing-core/Examples.js b/docs/src/components/landing-core/Examples.js index 1160e68efaf..5677a6bc14f 100644 --- a/docs/src/components/landing-core/Examples.js +++ b/docs/src/components/landing-core/Examples.js @@ -105,13 +105,9 @@ export default function Examples() { } /> - + - + } diff --git a/docs/src/components/landing-core/Features.js b/docs/src/components/landing-core/Features.js index f33be156a7d..bbf0a0d8884 100644 --- a/docs/src/components/landing-core/Features.js +++ b/docs/src/components/landing-core/Features.js @@ -6,6 +6,7 @@ import SectionHeadline from 'docs/src/components/typography/SectionHeadline'; import GradientText from 'docs/src/components/typography/GradientText'; import ToolpadFeaturesSwitcher from './ToolpadFeaturesSwitcher'; import ToolpadDialogDemo from './ToolpadDialogDemo'; +import ToolpadAuthDemo from './ToolpadAuthDemo'; import ToolpadDashboardLayout from './ToolpadDashboardLayout'; import ToolpadNotificationDemo from './ToolpadNotificationDemo'; import ToolpadPageContainerDemo from './ToolpadPageContainerDemo'; @@ -33,10 +34,10 @@ export default function ToolpadComponents() { > {tab === 'navigation' && } - {tab === 'auth' &&
To Do
} + {tab === 'auth' && } + {tab === 'page' && } {tab === 'dialogs' && } {tab === 'notifications' && } - {tab === 'page' && }
diff --git a/docs/src/components/landing-core/Hero.js b/docs/src/components/landing-core/Hero.js index 67333b8c835..b4bf19608c4 100644 --- a/docs/src/components/landing-core/Hero.js +++ b/docs/src/components/landing-core/Hero.js @@ -57,9 +57,9 @@ export default function Hero() { color="text.secondary" sx={{ maxWidth: 620, mb: 3, textWrap: 'balance', textAlign: 'center' }} > - From the creators of MUI, Toolpad offers the components needed for your next admin panel - and internal tools project. Bootstrap from scratch in our CLI with well chosen defaults, - or drop Toolpad into your existing Next.js or Vite* project. + Toolpad offers the components needed for your next admin portal or internal tool. + Bootstrap from scratch in our CLI with well chosen defaults, or drop Toolpad into your + existing Next.js or Vite* project. {}; + +const code = ` + +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'facebook', name: 'Facebook' }, +]; + +const signIn = async (provider) => { + try { + await signIn(provider.id); + } catch (error) { + // Handle errors + } +}; + +export default function OAuthSignInPage() { + return ( + + + + ); +} + +`; + +const providers = [ + { id: 'github', name: 'GitHub' }, + { id: 'google', name: 'Google' }, + { id: 'facebook', name: 'Facebook' }, +]; + +const signIn: (provider: AuthProvider) => void = async (provider) => { + const promise = new Promise((resolve) => { + setTimeout(() => { + // eslint-disable-next-line no-console + console.log(`Sign in with ${provider.id}`); + resolve(); + }, 500); + }); + return promise; +}; + +function OAuthSignInPage() { + return ( + + + + ); +} + +export default function ToolpadDashboardLayout() { + return ( + + + ({ + p: 2, + display: 'flex', + alignItems: 'center', + maxWidth: '100%', + mx: 'auto', + bgcolor: '#FFF', + borderRadius: '8px', + ...theme.applyDarkStyles({ + bgcolor: 'primaryDark.900', + }), + })} + > + + + + + + + + + + ); +} diff --git a/docs/src/components/landing-core/ToolpadDashboardLayout.tsx b/docs/src/components/landing-core/ToolpadDashboardLayout.tsx index 4b58c4d625f..3b163ed40f8 100644 --- a/docs/src/components/landing-core/ToolpadDashboardLayout.tsx +++ b/docs/src/components/landing-core/ToolpadDashboardLayout.tsx @@ -218,7 +218,7 @@ export default function ToolpadDashboardLayout() { iframe name="DashboardLayout" onResetDemoClick={NOOP} - productId="joy-ui" + productId="toolpad-core" usesCssVarsTheme > diff --git a/docs/src/components/landing-core/ToolpadDialogDemo.tsx b/docs/src/components/landing-core/ToolpadDialogDemo.tsx index 112b21a69b4..07b8a89f5d6 100644 --- a/docs/src/components/landing-core/ToolpadDialogDemo.tsx +++ b/docs/src/components/landing-core/ToolpadDialogDemo.tsx @@ -54,7 +54,7 @@ function MyCustomDialog({ open, onClose }: DialogProps) { function DemoContent() { const dialogs = useDialogs(); return ( -
+