From 973aa9762b2e70ef7bc183c9224911fec38093f0 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Wed, 3 Jan 2024 17:14:13 +0000 Subject: [PATCH 01/35] Add universal required email config for authentication --- docs/schemas/v1/definitions.json | 7 + packages/toolpad-app/src/appDom/index.ts | 1 + .../toolpad-app/src/runtime/AppLayout.tsx | 3 + .../toolpad-app/src/runtime/ToolpadApp.tsx | 4 +- packages/toolpad-app/src/runtime/useAuth.ts | 11 +- packages/toolpad-app/src/server/auth.ts | 79 ++++- packages/toolpad-app/src/server/index.ts | 2 +- packages/toolpad-app/src/server/schema.ts | 4 + .../src/server/toolpadAppServer.ts | 2 +- .../AppEditor/AppAuthorizationEditor.tsx | 300 ++++++++++++------ packages/toolpad-app/src/toolpad/Toolpad.tsx | 2 +- packages/toolpad-app/typings/@auth.d.ts | 5 + 12 files changed, 298 insertions(+), 122 deletions(-) create mode 100644 packages/toolpad-app/typings/@auth.d.ts diff --git a/docs/schemas/v1/definitions.json b/docs/schemas/v1/definitions.json index e85eaf0d061..d64d1e81e88 100644 --- a/docs/schemas/v1/definitions.json +++ b/docs/schemas/v1/definitions.json @@ -40,6 +40,13 @@ "additionalProperties": false }, "description": "Authentication providers to use." + }, + "requiredEmail": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Valid email patterns for the authenticated user." } }, "additionalProperties": false, diff --git a/packages/toolpad-app/src/appDom/index.ts b/packages/toolpad-app/src/appDom/index.ts index fc77c90008d..d44a331a9c9 100644 --- a/packages/toolpad-app/src/appDom/index.ts +++ b/packages/toolpad-app/src/appDom/index.ts @@ -59,6 +59,7 @@ export interface AppNode extends AppDomNodeBase { readonly attributes: { readonly authentication?: { readonly providers?: AuthProviderConfig[]; + readonly requiredEmail?: string[]; }; readonly authorization?: { readonly roles?: { diff --git a/packages/toolpad-app/src/runtime/AppLayout.tsx b/packages/toolpad-app/src/runtime/AppLayout.tsx index d86ca02b0e1..ea8ecea86ad 100644 --- a/packages/toolpad-app/src/runtime/AppLayout.tsx +++ b/packages/toolpad-app/src/runtime/AppLayout.tsx @@ -225,6 +225,9 @@ export function AppLayout({ ); - if (!IS_RENDERED_IN_CANVAS && hasAuthentication && page.attributes.authorization) { + if (!IS_RENDERED_IN_CANVAS && hasAuthentication) { pageContent = ( {pageContent} diff --git a/packages/toolpad-app/src/runtime/useAuth.ts b/packages/toolpad-app/src/runtime/useAuth.ts index fa6d0830815..72454802146 100644 --- a/packages/toolpad-app/src/runtime/useAuth.ts +++ b/packages/toolpad-app/src/runtime/useAuth.ts @@ -69,11 +69,16 @@ export function useAuth({ dom, basename }: UseAuthInput): AuthPayload { }, [basename]); const signOut = React.useCallback(async () => { - try { - setIsSigningOut(true); + setIsSigningOut(true); - const csrfToken = await getCsrfToken(); + let csrfToken; + try { + csrfToken = await getCsrfToken(); + } catch (error) { + console.error((error as Error).message); + } + try { await fetch(`${basename}${AUTH_SIGNOUT_PATH}`, { method: 'POST', headers: { diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index dfd098c5c6b..dd1b8710155 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -1,14 +1,18 @@ import express, { Router } from 'express'; import { Auth } from '@auth/core'; -import GithubProvider from '@auth/core/providers/github'; +import GithubProvider, { GitHubEmail, GitHubProfile } from '@auth/core/providers/github'; import GoogleProvider from '@auth/core/providers/google'; import { getToken } from '@auth/core/jwt'; +import { TokenSet } from '@auth/core/types'; +import { OAuthConfig } from '@auth/core/providers'; import { asyncHandler } from '../utils/express'; import { adaptRequestFromExpressToFetch } from './httpApiAdapters'; import { ToolpadProject } from './localMode'; import * as appDom from '../appDom'; -export function createAuthHandler(base: string): Router { +export function createAuthHandler(project: ToolpadProject): Router { + const { base } = project.options; + const router = express.Router(); router.use( @@ -27,6 +31,42 @@ export function createAuthHandler(base: string): Router { GithubProvider({ clientId: process.env.TOOLPAD_GITHUB_ID, clientSecret: process.env.TOOLPAD_GITHUB_SECRET, + userinfo: { + url: 'https://api.github.com/user', + async request({ + tokens, + provider, + }: { + tokens: TokenSet; + provider: OAuthConfig; + }) { + const profile = await fetch(provider.userinfo?.url as URL, { + headers: { + Authorization: `Bearer ${tokens.access_token}`, + 'User-Agent': 'authjs', + }, + }).then(async (githubRes) => githubRes.json()); + + if (!profile.email) { + // If the user does not have a public email, get another via the GitHub API + // See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user + const githubRes = await fetch('https://api.github.com/user/emails', { + headers: { + Authorization: `Bearer ${tokens.access_token}`, + 'User-Agent': 'authjs', + }, + }); + + if (githubRes.ok) { + const emails: GitHubEmail[] = await githubRes.json(); + profile.email = (emails.find((e) => e.primary) ?? emails[0]).email; + profile.verifiedEmails = emails.filter((e) => e.verified).map((e) => e.email); + } + } + + return profile; + }, + }, }), GoogleProvider({ clientId: process.env.TOOLPAD_GOOGLE_CLIENT_ID, @@ -44,12 +84,30 @@ export function createAuthHandler(base: string): Router { trustHost: true, callbacks: { async signIn({ account, profile }) { + const dom = await project.loadDom(); + + const app = appDom.getApp(dom); + const requiredEmails = app.attributes.authentication?.requiredEmail ?? []; + + if (account?.provider === 'github') { + return Boolean( + profile?.verifiedEmails && + (requiredEmails.length === 0 || + requiredEmails.some((requiredEmail) => + profile.verifiedEmails!.some((verifiedEmail) => + new RegExp(requiredEmail).test(verifiedEmail), + ), + )), + ); + } if (account?.provider === 'google') { return Boolean( profile?.email_verified && profile?.email && - (!process.env.TOOLPAD_GOOGLE_AUTH_DOMAIN || - profile.email.endsWith(`@${process.env.TOOLPAD_GOOGLE_AUTH_DOMAIN}`)), + (requiredEmails.length === 0 || + requiredEmails.some( + (requiredEmail) => new RegExp(requiredEmail).test(profile.email!) ?? false, + )), ); } return true; @@ -91,10 +149,11 @@ export async function createAuthPagesMiddleware(project: ToolpadProject) { const signInPath = `${base}/signin`; + let isRedirect = false; if ( hasAuthentication && req.get('sec-fetch-dest') === 'document' && - req.originalUrl !== signInPath && + req.originalUrl.split('?')[0] !== signInPath && !req.originalUrl.startsWith(`${base}/api/auth`) ) { const request = adaptRequestFromExpressToFetch(req); @@ -111,11 +170,13 @@ export async function createAuthPagesMiddleware(project: ToolpadProject) { } if (!token) { - res.redirect(signInPath); - res.end(); - } else { - next(); + isRedirect = true; } + } + + if (isRedirect) { + res.redirect(signInPath); + res.end(); } else { next(); } diff --git a/packages/toolpad-app/src/server/index.ts b/packages/toolpad-app/src/server/index.ts index 59cd181762e..ee1986cb191 100644 --- a/packages/toolpad-app/src/server/index.ts +++ b/packages/toolpad-app/src/server/index.ts @@ -125,7 +125,7 @@ async function createDevHandler(project: ToolpadProject) { handler.use('/api/runtime-rpc', createRpcHandler(runtimeRpcServer)); if (process.env.TOOLPAD_AUTH_SECRET) { - const authHandler = createAuthHandler(project.options.base); + const authHandler = createAuthHandler(project); handler.use('/api/auth', express.urlencoded({ extended: true }), authHandler); } diff --git a/packages/toolpad-app/src/server/schema.ts b/packages/toolpad-app/src/server/schema.ts index df488f6ff59..f4cb8293e38 100644 --- a/packages/toolpad-app/src/server/schema.ts +++ b/packages/toolpad-app/src/server/schema.ts @@ -271,6 +271,10 @@ export const applicationSchema = toolpadObjectSchema( ) .optional() .describe('Authentication providers to use.'), + requiredEmail: z + .array(z.string()) + .optional() + .describe('Valid email patterns for the authenticated user.'), }) .optional() .describe('Authentication configuration for this application.'), diff --git a/packages/toolpad-app/src/server/toolpadAppServer.ts b/packages/toolpad-app/src/server/toolpadAppServer.ts index e14793fffbe..6fcb7eefb3b 100644 --- a/packages/toolpad-app/src/server/toolpadAppServer.ts +++ b/packages/toolpad-app/src/server/toolpadAppServer.ts @@ -69,7 +69,7 @@ export async function createProdHandler(project: ToolpadProject) { handler.use('/api/runtime-rpc', createRpcHandler(runtimeRpcServer)); if (process.env.TOOLPAD_AUTH_SECRET) { - const authHandler = createAuthHandler(project.options.base); + const authHandler = createAuthHandler(project); handler.use('/api/auth', express.urlencoded({ extended: true }), authHandler); } diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index ff661f2eec6..5a898af51ff 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { Alert, + Box, Button, Checkbox, Dialog, @@ -14,7 +15,10 @@ import { MenuItem, Select, SelectChangeEvent, + Snackbar, Stack, + Tab, + TextField, Tooltip, Typography, } from '@mui/material'; @@ -31,21 +35,144 @@ import { } from '@mui/x-data-grid'; import GitHubIcon from '@mui/icons-material/GitHub'; import GoogleIcon from '@mui/icons-material/Google'; +import { TabContext, TabList } from '@mui/lab'; import { useAppState, useAppStateApi } from '../AppState'; import * as appDom from '../../appDom'; +import TabPanel from '../../components/TabPanel'; import { AuthProviderConfig, AuthProvider } from '../../types'; +import { updateArray } from '../../utils/immutability'; const AUTH_PROVIDERS = new Map([ ['github', { name: 'GitHub', Icon: GitHubIcon }], ['google', { name: 'Google', Icon: GoogleIcon }], ]); -interface EditToolbarProps { +export function AppAuthenticationEditor() { + const { dom } = useAppState(); + const appState = useAppStateApi(); + + const handleAuthProvidersChange = React.useCallback( + (event: SelectChangeEvent) => { + const { + target: { value: providers }, + } = event; + + appState.update((draft) => { + const app = appDom.getApp(draft); + + draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authentication', { + ...app.attributes?.authentication, + providers: (typeof providers === 'string' ? providers.split(',') : providers).map( + (provider) => ({ provider } as AuthProviderConfig), + ), + }); + + return draft; + }); + }, + [appState], + ); + + const handleRequiredEmailChange = React.useCallback( + (index: number) => (event: React.ChangeEvent) => { + const { + target: { value: email }, + } = event; + + appState.update((draft) => { + const app = appDom.getApp(draft); + + draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authentication', { + ...app.attributes?.authentication, + requiredEmail: updateArray( + app.attributes?.authentication?.requiredEmail ?? [], + email, + index, + ).filter((requiredEmail) => requiredEmail !== ''), + }); + + return draft; + }); + }, + [appState], + ); + + const appNode = appDom.getApp(dom); + const { authentication } = appNode.attributes; + + const authProviders = React.useMemo( + () => authentication?.providers ?? [], + [authentication?.providers], + ).map((providerConfig) => providerConfig.provider); + + const requiredEmails = authentication?.requiredEmail ?? []; + + return ( + + + Providers + + + Authentication providers + + labelId="auth-providers-label" + label="Authentication providers" + id="auth-providers" + multiple + value={authProviders} + onChange={handleAuthProvidersChange} + fullWidth + renderValue={(selected) => + selected + .map((selectedValue) => AUTH_PROVIDERS.get(selectedValue)?.name ?? '') + .join(', ') + } + > + {[...AUTH_PROVIDERS].map(([value, { name, Icon }]) => ( + + + -1} /> + + {name} + + + ))} + + + If set, only authenticated users can use the app. + + + + Certain environment variables must be set for authentication providers to work.{' '} + + Learn how to set up authentication + + . + + + Required email patterns + + + If set, authenticated user emails must match one of the patterns below. + + {[...requiredEmails, ''].map((email, index) => ( + + ))} + + ); +} + +interface RolesToolbarProps { addNewRoleDisabled: boolean; onAddNewRole: () => void; } -function EditToolbar({ addNewRoleDisabled, onAddNewRole }: EditToolbarProps) { +function RolesToolbar({ addNewRoleDisabled, onAddNewRole }: RolesToolbarProps) { return ( - - + + + Authorization + + + + + + + + + + + + + + Define the roles for your application. You can configure your pages to be accessible + to specific roles only. + + + + + + + + + + + {errorSnackbarMessage ? ( + + {errorSnackbarMessage} + + ) : undefined} + + ); } diff --git a/packages/toolpad-app/src/toolpad/Toolpad.tsx b/packages/toolpad-app/src/toolpad/Toolpad.tsx index 13cb4612d13..159aa33765c 100644 --- a/packages/toolpad-app/src/toolpad/Toolpad.tsx +++ b/packages/toolpad-app/src/toolpad/Toolpad.tsx @@ -16,7 +16,7 @@ import { getViewFromPathname } from '../utils/domView'; import AppProvider, { AppState, useAppStateContext } from './AppState'; import { FEATURE_FLAG_AUTHORIZATION, FEATURE_FLAG_GLOBAL_FUNCTIONS } from '../constants'; import { ProjectProvider } from '../project'; -import { AppAuthorizationDialog } from './AppEditor/AppAuthorizationEditor'; +import AppAuthorizationDialog from './AppEditor/AppAuthorizationEditor'; import useBoolean from '../utils/useBoolean'; const Centered = styled('div')({ diff --git a/packages/toolpad-app/typings/@auth.d.ts b/packages/toolpad-app/typings/@auth.d.ts new file mode 100644 index 00000000000..e28ef3fb444 --- /dev/null +++ b/packages/toolpad-app/typings/@auth.d.ts @@ -0,0 +1,5 @@ +export declare module '@auth/core/types' { + interface Profile { + verifiedEmails?: string[]; + } +} From ba2399d6497ad81d2c31d21458d212bf9b673239 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Wed, 3 Jan 2024 17:17:27 +0000 Subject: [PATCH 02/35] Must have at least 1 verified email in Github --- packages/toolpad-app/src/server/auth.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index dd1b8710155..bfda720d71d 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -92,6 +92,7 @@ export function createAuthHandler(project: ToolpadProject): Router { if (account?.provider === 'github') { return Boolean( profile?.verifiedEmails && + profile.verifiedEmails.length > 0 && (requiredEmails.length === 0 || requiredEmails.some((requiredEmail) => profile.verifiedEmails!.some((verifiedEmail) => From 08791c6ebc46e410ce33548447e0f46f303896e1 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:57:16 +0000 Subject: [PATCH 03/35] Address review comments --- docs/schemas/v1/definitions.json | 2 +- packages/toolpad-app/src/appDom/index.ts | 2 +- packages/toolpad-app/src/server/auth.ts | 14 ++++++------- packages/toolpad-app/src/server/schema.ts | 2 +- .../AppEditor/AppAuthorizationEditor.tsx | 20 +++++++++---------- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/schemas/v1/definitions.json b/docs/schemas/v1/definitions.json index d64d1e81e88..0ba1ffcef93 100644 --- a/docs/schemas/v1/definitions.json +++ b/docs/schemas/v1/definitions.json @@ -41,7 +41,7 @@ }, "description": "Authentication providers to use." }, - "requiredEmail": { + "requiredDomain": { "type": "array", "items": { "type": "string" diff --git a/packages/toolpad-app/src/appDom/index.ts b/packages/toolpad-app/src/appDom/index.ts index d44a331a9c9..4b70c84d51e 100644 --- a/packages/toolpad-app/src/appDom/index.ts +++ b/packages/toolpad-app/src/appDom/index.ts @@ -59,7 +59,7 @@ export interface AppNode extends AppDomNodeBase { readonly attributes: { readonly authentication?: { readonly providers?: AuthProviderConfig[]; - readonly requiredEmail?: string[]; + readonly requiredDomain?: string[]; }; readonly authorization?: { readonly roles?: { diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index bfda720d71d..48278866543 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -87,16 +87,16 @@ export function createAuthHandler(project: ToolpadProject): Router { const dom = await project.loadDom(); const app = appDom.getApp(dom); - const requiredEmails = app.attributes.authentication?.requiredEmail ?? []; + const requiredDomains = app.attributes.authentication?.requiredDomain ?? []; if (account?.provider === 'github') { return Boolean( profile?.verifiedEmails && profile.verifiedEmails.length > 0 && - (requiredEmails.length === 0 || - requiredEmails.some((requiredEmail) => + (requiredDomains.length === 0 || + requiredDomains.some((requiredDomain) => profile.verifiedEmails!.some((verifiedEmail) => - new RegExp(requiredEmail).test(verifiedEmail), + verifiedEmail.endsWith(`@${requiredDomain}`), ), )), ); @@ -105,9 +105,9 @@ export function createAuthHandler(project: ToolpadProject): Router { return Boolean( profile?.email_verified && profile?.email && - (requiredEmails.length === 0 || - requiredEmails.some( - (requiredEmail) => new RegExp(requiredEmail).test(profile.email!) ?? false, + (requiredDomains.length === 0 || + requiredDomains.some( + (requiredDomain) => profile.email!.endsWith(`@${requiredDomain}`) ?? false, )), ); } diff --git a/packages/toolpad-app/src/server/schema.ts b/packages/toolpad-app/src/server/schema.ts index f4cb8293e38..ade8997643d 100644 --- a/packages/toolpad-app/src/server/schema.ts +++ b/packages/toolpad-app/src/server/schema.ts @@ -271,7 +271,7 @@ export const applicationSchema = toolpadObjectSchema( ) .optional() .describe('Authentication providers to use.'), - requiredEmail: z + requiredDomain: z .array(z.string()) .optional() .describe('Valid email patterns for the authenticated user.'), diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 5a898af51ff..5e1cc936247 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -73,7 +73,7 @@ export function AppAuthenticationEditor() { [appState], ); - const handleRequiredEmailChange = React.useCallback( + const handleRequiredDomainChange = React.useCallback( (index: number) => (event: React.ChangeEvent) => { const { target: { value: email }, @@ -84,11 +84,11 @@ export function AppAuthenticationEditor() { draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authentication', { ...app.attributes?.authentication, - requiredEmail: updateArray( - app.attributes?.authentication?.requiredEmail ?? [], + requiredDomain: updateArray( + app.attributes?.authentication?.requiredDomain ?? [], email, index, - ).filter((requiredEmail) => requiredEmail !== ''), + ).filter((requiredDomain) => requiredDomain !== ''), }); return draft; @@ -105,7 +105,7 @@ export function AppAuthenticationEditor() { [authentication?.providers], ).map((providerConfig) => providerConfig.provider); - const requiredEmails = authentication?.requiredEmail ?? []; + const requiredDomains = authentication?.requiredDomain ?? []; return ( @@ -150,17 +150,17 @@ export function AppAuthenticationEditor() { . - Required email patterns + Required email domains - If set, authenticated user emails must match one of the patterns below. + If set, authenticated user emails must be in one of the domains below. - {[...requiredEmails, ''].map((email, index) => ( + {[...requiredDomains, ''].map((email, index) => ( ))} From 39c0f006c403dd400f6d9611a81cd8766b29a422 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:10:58 +0000 Subject: [PATCH 04/35] Refactor (review comments) --- docs/schemas/v1/definitions.json | 2 +- packages/toolpad-app/src/appDom/index.ts | 2 +- packages/toolpad-app/src/server/auth.ts | 203 +++++++++--------- packages/toolpad-app/src/server/schema.ts | 2 +- .../AppEditor/AppAuthorizationEditor.tsx | 20 +- 5 files changed, 117 insertions(+), 112 deletions(-) diff --git a/docs/schemas/v1/definitions.json b/docs/schemas/v1/definitions.json index 0ba1ffcef93..4196e62bef1 100644 --- a/docs/schemas/v1/definitions.json +++ b/docs/schemas/v1/definitions.json @@ -41,7 +41,7 @@ }, "description": "Authentication providers to use." }, - "requiredDomain": { + "restrictedDomains": { "type": "array", "items": { "type": "string" diff --git a/packages/toolpad-app/src/appDom/index.ts b/packages/toolpad-app/src/appDom/index.ts index 4b70c84d51e..c3d9b0b05e3 100644 --- a/packages/toolpad-app/src/appDom/index.ts +++ b/packages/toolpad-app/src/appDom/index.ts @@ -59,7 +59,7 @@ export interface AppNode extends AppDomNodeBase { readonly attributes: { readonly authentication?: { readonly providers?: AuthProviderConfig[]; - readonly requiredDomain?: string[]; + readonly restrictedDomains?: string[]; }; readonly authorization?: { readonly roles?: { diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index 48278866543..2197f772185 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -3,7 +3,7 @@ import { Auth } from '@auth/core'; import GithubProvider, { GitHubEmail, GitHubProfile } from '@auth/core/providers/github'; import GoogleProvider from '@auth/core/providers/google'; import { getToken } from '@auth/core/jwt'; -import { TokenSet } from '@auth/core/types'; +import { AuthConfig, TokenSet } from '@auth/core/types'; import { OAuthConfig } from '@auth/core/providers'; import { asyncHandler } from '../utils/express'; import { adaptRequestFromExpressToFetch } from './httpApiAdapters'; @@ -15,109 +15,114 @@ export function createAuthHandler(project: ToolpadProject): Router { const router = express.Router(); + const githubProvider = GithubProvider({ + clientId: process.env.TOOLPAD_GITHUB_ID, + clientSecret: process.env.TOOLPAD_GITHUB_SECRET, + userinfo: { + url: 'https://api.github.com/user', + async request({ + tokens, + provider, + }: { + tokens: TokenSet; + provider: OAuthConfig; + }) { + const profile = await fetch(provider.userinfo?.url as URL, { + headers: { + Authorization: `Bearer ${tokens.access_token}`, + 'User-Agent': 'authjs', + }, + }).then(async (githubRes) => githubRes.json()); + + if (!profile.email) { + // If the user does not have a public email, get another via the GitHub API + // See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user + const githubRes = await fetch('https://api.github.com/user/emails', { + headers: { + Authorization: `Bearer ${tokens.access_token}`, + 'User-Agent': 'authjs', + }, + }); + + if (githubRes.ok) { + const emails: GitHubEmail[] = await githubRes.json(); + profile.email = (emails.find((e) => e.primary) ?? emails[0]).email; + profile.verifiedEmails = emails.filter((e) => e.verified).map((e) => e.email); + } + } + + return profile; + }, + }, + }); + + const googleProvider = GoogleProvider({ + clientId: process.env.TOOLPAD_GOOGLE_CLIENT_ID, + clientSecret: process.env.TOOLPAD_GOOGLE_CLIENT_SECRET, + authorization: { + params: { + prompt: 'consent', + access_type: 'offline', + response_type: 'code', + }, + }, + }); + + const authConfig: AuthConfig = { + pages: { + signIn: `${base}/signin`, + signOut: base, + error: `${base}/signin`, // Error code passed in query string as ?error= + verifyRequest: base, + }, + providers: [githubProvider, googleProvider], + secret: process.env.TOOLPAD_AUTH_SECRET, + trustHost: true, + callbacks: { + async signIn({ account, profile }) { + const dom = await project.loadDom(); + const app = appDom.getApp(dom); + + const restrictedDomains = app.attributes.authentication?.restrictedDomains ?? []; + + if (account?.provider === 'github') { + return Boolean( + profile?.verifiedEmails && + profile.verifiedEmails.length > 0 && + (restrictedDomains.length === 0 || + restrictedDomains.some((restrictedDomain) => + profile.verifiedEmails!.some((verifiedEmail) => + verifiedEmail.endsWith(`@${restrictedDomain}`), + ), + )), + ); + } + + if (account?.provider === 'google') { + return Boolean( + profile?.email_verified && + profile?.email && + (restrictedDomains.length === 0 || + restrictedDomains.some( + (restrictedDomain) => profile.email!.endsWith(`@${restrictedDomain}`) ?? false, + )), + ); + } + + return true; + }, + async redirect({ baseUrl }) { + return `${baseUrl}${base}`; + }, + }, + }; + router.use( '/*', asyncHandler(async (req, res) => { const request = adaptRequestFromExpressToFetch(req); - const response = (await Auth(request, { - pages: { - signIn: `${base}/signin`, - signOut: base, - error: `${base}/signin`, // Error code passed in query string as ?error= - verifyRequest: base, - }, - providers: [ - GithubProvider({ - clientId: process.env.TOOLPAD_GITHUB_ID, - clientSecret: process.env.TOOLPAD_GITHUB_SECRET, - userinfo: { - url: 'https://api.github.com/user', - async request({ - tokens, - provider, - }: { - tokens: TokenSet; - provider: OAuthConfig; - }) { - const profile = await fetch(provider.userinfo?.url as URL, { - headers: { - Authorization: `Bearer ${tokens.access_token}`, - 'User-Agent': 'authjs', - }, - }).then(async (githubRes) => githubRes.json()); - - if (!profile.email) { - // If the user does not have a public email, get another via the GitHub API - // See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user - const githubRes = await fetch('https://api.github.com/user/emails', { - headers: { - Authorization: `Bearer ${tokens.access_token}`, - 'User-Agent': 'authjs', - }, - }); - - if (githubRes.ok) { - const emails: GitHubEmail[] = await githubRes.json(); - profile.email = (emails.find((e) => e.primary) ?? emails[0]).email; - profile.verifiedEmails = emails.filter((e) => e.verified).map((e) => e.email); - } - } - - return profile; - }, - }, - }), - GoogleProvider({ - clientId: process.env.TOOLPAD_GOOGLE_CLIENT_ID, - clientSecret: process.env.TOOLPAD_GOOGLE_CLIENT_SECRET, - authorization: { - params: { - prompt: 'consent', - access_type: 'offline', - response_type: 'code', - }, - }, - }), - ], - secret: process.env.TOOLPAD_AUTH_SECRET, - trustHost: true, - callbacks: { - async signIn({ account, profile }) { - const dom = await project.loadDom(); - - const app = appDom.getApp(dom); - const requiredDomains = app.attributes.authentication?.requiredDomain ?? []; - - if (account?.provider === 'github') { - return Boolean( - profile?.verifiedEmails && - profile.verifiedEmails.length > 0 && - (requiredDomains.length === 0 || - requiredDomains.some((requiredDomain) => - profile.verifiedEmails!.some((verifiedEmail) => - verifiedEmail.endsWith(`@${requiredDomain}`), - ), - )), - ); - } - if (account?.provider === 'google') { - return Boolean( - profile?.email_verified && - profile?.email && - (requiredDomains.length === 0 || - requiredDomains.some( - (requiredDomain) => profile.email!.endsWith(`@${requiredDomain}`) ?? false, - )), - ); - } - return true; - }, - async redirect({ baseUrl }) { - return `${baseUrl}${base}`; - }, - }, - })) as Response; + const response = (await Auth(request, authConfig)) as Response; // Converting Fetch API's Response to Express' res res.status(response.status); diff --git a/packages/toolpad-app/src/server/schema.ts b/packages/toolpad-app/src/server/schema.ts index ade8997643d..cd58c14ce91 100644 --- a/packages/toolpad-app/src/server/schema.ts +++ b/packages/toolpad-app/src/server/schema.ts @@ -271,7 +271,7 @@ export const applicationSchema = toolpadObjectSchema( ) .optional() .describe('Authentication providers to use.'), - requiredDomain: z + restrictedDomains: z .array(z.string()) .optional() .describe('Valid email patterns for the authenticated user.'), diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 5e1cc936247..5fc4fb06a85 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -73,10 +73,10 @@ export function AppAuthenticationEditor() { [appState], ); - const handleRequiredDomainChange = React.useCallback( + const handleRestrictedDomainsChange = React.useCallback( (index: number) => (event: React.ChangeEvent) => { const { - target: { value: email }, + target: { value: domain }, } = event; appState.update((draft) => { @@ -84,11 +84,11 @@ export function AppAuthenticationEditor() { draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authentication', { ...app.attributes?.authentication, - requiredDomain: updateArray( - app.attributes?.authentication?.requiredDomain ?? [], - email, + restrictedDomains: updateArray( + app.attributes?.authentication?.restrictedDomains ?? [], + domain, index, - ).filter((requiredDomain) => requiredDomain !== ''), + ).filter((restrictedDomain) => restrictedDomain !== ''), }); return draft; @@ -105,7 +105,7 @@ export function AppAuthenticationEditor() { [authentication?.providers], ).map((providerConfig) => providerConfig.provider); - const requiredDomains = authentication?.requiredDomain ?? []; + const restrictedDomains = authentication?.restrictedDomains ?? []; return ( @@ -155,11 +155,11 @@ export function AppAuthenticationEditor() { If set, authenticated user emails must be in one of the domains below. - {[...requiredDomains, ''].map((email, index) => ( + {[...restrictedDomains, ''].map((domain, index) => ( ))} From d7fc87ca80e84c8397256a90dd14199a600465ef Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:40:54 +0000 Subject: [PATCH 05/35] Small refactor --- packages/toolpad-app/src/server/auth.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index 2197f772185..043b08545c5 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -27,21 +27,20 @@ export function createAuthHandler(project: ToolpadProject): Router { tokens: TokenSet; provider: OAuthConfig; }) { + const headers = { + Authorization: `Bearer ${tokens.access_token}`, + 'User-Agent': 'authjs', + }; + const profile = await fetch(provider.userinfo?.url as URL, { - headers: { - Authorization: `Bearer ${tokens.access_token}`, - 'User-Agent': 'authjs', - }, + headers, }).then(async (githubRes) => githubRes.json()); if (!profile.email) { // If the user does not have a public email, get another via the GitHub API // See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user const githubRes = await fetch('https://api.github.com/user/emails', { - headers: { - Authorization: `Bearer ${tokens.access_token}`, - 'User-Agent': 'authjs', - }, + headers, }); if (githubRes.ok) { From 07015a045461e47395b092807171c3aec9b42277 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Mon, 8 Jan 2024 19:20:03 +0000 Subject: [PATCH 06/35] Load env before imports --- packages/toolpad-app/src/server/auth.ts | 102 +++++++++--------- .../src/server/toolpadAppServer.ts | 1 + 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index 043b08545c5..ba1ca3e1d0b 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -10,62 +10,62 @@ import { adaptRequestFromExpressToFetch } from './httpApiAdapters'; import { ToolpadProject } from './localMode'; import * as appDom from '../appDom'; -export function createAuthHandler(project: ToolpadProject): Router { - const { base } = project.options; - - const router = express.Router(); - - const githubProvider = GithubProvider({ - clientId: process.env.TOOLPAD_GITHUB_ID, - clientSecret: process.env.TOOLPAD_GITHUB_SECRET, - userinfo: { - url: 'https://api.github.com/user', - async request({ - tokens, - provider, - }: { - tokens: TokenSet; - provider: OAuthConfig; - }) { - const headers = { - Authorization: `Bearer ${tokens.access_token}`, - 'User-Agent': 'authjs', - }; - - const profile = await fetch(provider.userinfo?.url as URL, { +const githubProvider = GithubProvider({ + clientId: process.env.TOOLPAD_GITHUB_ID, + clientSecret: process.env.TOOLPAD_GITHUB_SECRET, + userinfo: { + url: 'https://api.github.com/user', + async request({ + tokens, + provider, + }: { + tokens: TokenSet; + provider: OAuthConfig; + }) { + const headers = { + Authorization: `Bearer ${tokens.access_token}`, + 'User-Agent': 'authjs', + }; + + const profile = await fetch(provider.userinfo?.url as URL, { + headers, + }).then(async (githubRes) => githubRes.json()); + + if (!profile.email) { + // If the user does not have a public email, get another via the GitHub API + // See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user + const githubRes = await fetch('https://api.github.com/user/emails', { headers, - }).then(async (githubRes) => githubRes.json()); - - if (!profile.email) { - // If the user does not have a public email, get another via the GitHub API - // See https://docs.github.com/en/rest/users/emails#list-public-email-addresses-for-the-authenticated-user - const githubRes = await fetch('https://api.github.com/user/emails', { - headers, - }); - - if (githubRes.ok) { - const emails: GitHubEmail[] = await githubRes.json(); - profile.email = (emails.find((e) => e.primary) ?? emails[0]).email; - profile.verifiedEmails = emails.filter((e) => e.verified).map((e) => e.email); - } + }); + + if (githubRes.ok) { + const emails: GitHubEmail[] = await githubRes.json(); + profile.email = (emails.find((e) => e.primary) ?? emails[0]).email; + profile.verifiedEmails = emails.filter((e) => e.verified).map((e) => e.email); } + } - return profile; - }, + return profile; }, - }); - - const googleProvider = GoogleProvider({ - clientId: process.env.TOOLPAD_GOOGLE_CLIENT_ID, - clientSecret: process.env.TOOLPAD_GOOGLE_CLIENT_SECRET, - authorization: { - params: { - prompt: 'consent', - access_type: 'offline', - response_type: 'code', - }, + }, +}); + +const googleProvider = GoogleProvider({ + clientId: process.env.TOOLPAD_GOOGLE_CLIENT_ID, + clientSecret: process.env.TOOLPAD_GOOGLE_CLIENT_SECRET, + authorization: { + params: { + prompt: 'consent', + access_type: 'offline', + response_type: 'code', }, - }); + }, +}); + +export function createAuthHandler(project: ToolpadProject): Router { + const { base } = project.options; + + const router = express.Router(); const authConfig: AuthConfig = { pages: { diff --git a/packages/toolpad-app/src/server/toolpadAppServer.ts b/packages/toolpad-app/src/server/toolpadAppServer.ts index 6fcb7eefb3b..9aa7bb1ad64 100644 --- a/packages/toolpad-app/src/server/toolpadAppServer.ts +++ b/packages/toolpad-app/src/server/toolpadAppServer.ts @@ -1,3 +1,4 @@ +import 'dotenv/config'; import * as path from 'path'; import * as fs from 'fs/promises'; import { Server } from 'http'; From f73041484c9e29ddc06c892b878fee9b93eba9b8 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Mon, 8 Jan 2024 19:58:11 +0000 Subject: [PATCH 07/35] Add spacing to navigation --- packages/toolpad-app/src/toolpad/Toolpad.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/toolpad-app/src/toolpad/Toolpad.tsx b/packages/toolpad-app/src/toolpad/Toolpad.tsx index 159aa33765c..9f4200becf1 100644 --- a/packages/toolpad-app/src/toolpad/Toolpad.tsx +++ b/packages/toolpad-app/src/toolpad/Toolpad.tsx @@ -105,7 +105,9 @@ function EditorShell({ children }: EditorShellProps) { Authorization + + + ) : null } actions={ From ebce000769893eb28c2454e2ebb179be40a2c288 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:58:26 +0000 Subject: [PATCH 08/35] Azure AD auth provider (without role mapping) --- packages/toolpad-app/src/appDom/index.ts | 3 + .../src/components/icons/AzureIcon.tsx | 23 ++++ packages/toolpad-app/src/constants.ts | 2 +- .../toolpad-app/src/runtime/AppLayout.tsx | 9 +- .../toolpad-app/src/runtime/SignInPage.tsx | 119 +++++++++++------- .../toolpad-app/src/runtime/ToolpadApp.tsx | 18 ++- packages/toolpad-app/src/runtime/auth.tsx | 17 ++- packages/toolpad-app/src/runtime/useAuth.ts | 2 +- packages/toolpad-app/src/server/auth.ts | 38 +++++- packages/toolpad-app/src/server/schema.ts | 2 +- .../AppEditor/AppAuthorizationEditor.tsx | 30 +++-- .../AppEditor/PageEditor/PageOptionsPanel.tsx | 22 ++-- .../PagesExplorer/CreatePageNodeDialog.tsx | 3 + .../toolpad/AppEditor/PagesExplorer/index.tsx | 3 + packages/toolpad-app/src/types.ts | 2 +- packages/toolpad-app/typings/@auth.d.ts | 8 ++ 16 files changed, 216 insertions(+), 85 deletions(-) create mode 100644 packages/toolpad-app/src/components/icons/AzureIcon.tsx diff --git a/packages/toolpad-app/src/appDom/index.ts b/packages/toolpad-app/src/appDom/index.ts index c3d9b0b05e3..f680caeb298 100644 --- a/packages/toolpad-app/src/appDom/index.ts +++ b/packages/toolpad-app/src/appDom/index.ts @@ -1084,6 +1084,9 @@ export function createDefaultDom(): AppDom { attributes: { title: 'Page 1', display: 'shell', + authorization: { + allowAll: true, + }, }, }); diff --git a/packages/toolpad-app/src/components/icons/AzureIcon.tsx b/packages/toolpad-app/src/components/icons/AzureIcon.tsx new file mode 100644 index 00000000000..bd39a325d4a --- /dev/null +++ b/packages/toolpad-app/src/components/icons/AzureIcon.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; + +interface AzureIconProps { + height?: number; + width?: number; + color?: string; +} + +export default function AzureIcon({ height = 18, width = 18, color = '#fff' }: AzureIconProps) { + return ( + + + + ); +} diff --git a/packages/toolpad-app/src/constants.ts b/packages/toolpad-app/src/constants.ts index 9a8e5503061..5d0b6d21566 100644 --- a/packages/toolpad-app/src/constants.ts +++ b/packages/toolpad-app/src/constants.ts @@ -21,4 +21,4 @@ export const VERSION_CHECK_INTERVAL = 1000 * 60 * 10; // TODO: Remove once global functions UI is ready export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; -export const FEATURE_FLAG_AUTHORIZATION = false; +export const FEATURE_FLAG_AUTHORIZATION = true; diff --git a/packages/toolpad-app/src/runtime/AppLayout.tsx b/packages/toolpad-app/src/runtime/AppLayout.tsx index ea8ecea86ad..ec5226e44b9 100644 --- a/packages/toolpad-app/src/runtime/AppLayout.tsx +++ b/packages/toolpad-app/src/runtime/AppLayout.tsx @@ -42,6 +42,7 @@ interface AppPagesNavigationProps { pages: NavigationEntry[]; clipped?: boolean; search?: string; + basename: string; } function AppPagesNavigation({ @@ -49,6 +50,7 @@ function AppPagesNavigation({ pages, clipped = false, search, + basename, }: AppPagesNavigationProps) { const navListSubheaderId = React.useId(); @@ -56,8 +58,6 @@ function AppPagesNavigation({ const productIcon = theme.palette.mode === 'dark' ? productIconDark : productIconLight; - const initialPageSlug = pages[0].slug; - return ( ) : null} diff --git a/packages/toolpad-app/src/runtime/SignInPage.tsx b/packages/toolpad-app/src/runtime/SignInPage.tsx index e2de26d1819..75e11bc352c 100644 --- a/packages/toolpad-app/src/runtime/SignInPage.tsx +++ b/packages/toolpad-app/src/runtime/SignInPage.tsx @@ -65,51 +65,80 @@ export default function SignInPage() { You must be authenticated to use this app. - {authProviders.includes('github') ? ( - } - loading={isSigningIn && latestSelectedProvider === 'github'} - disabled={isSigningIn} - loadingPosition="start" - size="large" - sx={{ - backgroundColor: '#24292F', - }} - > - Sign in with GitHub - - ) : null} - {authProviders.includes('google') ? ( - - } - loading={isSigningIn && latestSelectedProvider === 'google'} - disabled={isSigningIn} - loadingPosition="start" - size="large" - sx={{ - backgroundColor: '#fff', - color: '#000', - '&:hover': { - color: theme.palette.primary.contrastText, - }, - }} - > - Sign in with Google - - ) : null} + + {authProviders.includes('github') ? ( + } + loading={isSigningIn && latestSelectedProvider === 'github'} + disabled={isSigningIn} + loadingPosition="start" + size="large" + fullWidth + sx={{ + backgroundColor: '#24292F', + }} + > + Sign in with GitHub + + ) : null} + {authProviders.includes('google') ? ( + + } + loading={isSigningIn && latestSelectedProvider === 'google'} + disabled={isSigningIn} + loadingPosition="start" + size="large" + fullWidth + sx={{ + backgroundColor: '#fff', + color: '#000', + '&:hover': { + color: theme.palette.primary.contrastText, + }, + }} + > + Sign in with Google + + ) : null} + {authProviders.includes('azure-ad') ? ( + + } + loading={isSigningIn && latestSelectedProvider === 'azure-ad'} + disabled={isSigningIn} + loadingPosition="start" + size="large" + fullWidth + sx={{ + backgroundColor: '##0072c6', + }} + > + Sign in with Azure AD + + ) : null} + {pageContent} @@ -1564,19 +1565,27 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { const root = appDom.getApp(dom); const { pages = [] } = appDom.getChildNodes(dom, root); - const { hasAuthentication } = React.useContext(AuthContext); + const { session, hasAuthentication } = React.useContext(AuthContext); const pageMatch = useMatch('/pages/:slug'); const activePageSlug = pageMatch?.params.slug; + const authFilteredPages = React.useMemo(() => { + const userRoles = session?.user?.roles ?? []; + return pages.filter((page) => { + const { allowAll = true, allowedRoles = [] } = page.attributes.authorization ?? {}; + return allowAll || userRoles.some((role) => allowedRoles.includes(role)); + }); + }, [pages, session?.user?.roles]); + const navEntries = React.useMemo( () => - pages.map((page) => ({ + authFilteredPages.map((page) => ({ slug: page.name, displayName: appDom.getPageDisplayName(page), hasShell: page?.attributes.display !== 'standalone', })), - [pages], + [authFilteredPages], ); return ( @@ -1586,6 +1595,7 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { hasNavigation={!IS_RENDERED_IN_CANVAS} hasHeader={hasAuthentication && !IS_RENDERED_IN_CANVAS} clipped={SHOW_PREVIEW_HEADER} + basename={basename} > diff --git a/packages/toolpad-app/src/runtime/auth.tsx b/packages/toolpad-app/src/runtime/auth.tsx index 52f2ab6b887..80efccad26f 100644 --- a/packages/toolpad-app/src/runtime/auth.tsx +++ b/packages/toolpad-app/src/runtime/auth.tsx @@ -5,21 +5,23 @@ import { AUTH_SIGNIN_PATH, AuthContext } from './useAuth'; export interface RequireAuthorizationProps { children?: React.ReactNode; - allowedRole?: string | string[]; + allowAll?: boolean; + allowedRoles?: string[]; basename: string; } export function RequireAuthorization({ children, - allowedRole, + allowAll, + allowedRoles, basename, }: RequireAuthorizationProps) { const { session, isSigningIn } = React.useContext(AuthContext); const user = session?.user ?? null; const allowedRolesSet = React.useMemo>( - () => new Set(asArray(allowedRole ?? [])), - [allowedRole], + () => new Set(asArray(allowedRoles ?? [])), + [allowedRoles], ); React.useEffect(() => { @@ -45,11 +47,8 @@ export function RequireAuthorization({ } let reason = null; - if (!user.roles || user.roles.length <= 0) { - reason = 'User has no roles defined.'; - } else if (!user.roles.some((role) => allowedRolesSet.has(role))) { - const rolesList = user?.roles?.map((role) => JSON.stringify(role)).join(', '); - reason = `User with role(s) ${rolesList} is not allowed access to this resource.`; + if (!allowAll && !user.roles.some((role) => allowedRolesSet.has(role))) { + reason = `User does not have the roles to access this page.`; } // @TODO: Once we have roles we can add back this check. diff --git a/packages/toolpad-app/src/runtime/useAuth.ts b/packages/toolpad-app/src/runtime/useAuth.ts index 72454802146..1ac86a57e7f 100644 --- a/packages/toolpad-app/src/runtime/useAuth.ts +++ b/packages/toolpad-app/src/runtime/useAuth.ts @@ -8,7 +8,7 @@ export const AUTH_CSRF_PATH = `${AUTH_API_PATH}/csrf`; export const AUTH_SIGNIN_PATH = `${AUTH_API_PATH}/signin`; export const AUTH_SIGNOUT_PATH = `${AUTH_API_PATH}/signout`; -export type AuthProvider = 'github' | 'google'; +export type AuthProvider = 'github' | 'google' | 'azure-ad'; export interface AuthSession { user: { diff --git a/packages/toolpad-app/src/server/auth.ts b/packages/toolpad-app/src/server/auth.ts index ba1ca3e1d0b..17cae8722cf 100644 --- a/packages/toolpad-app/src/server/auth.ts +++ b/packages/toolpad-app/src/server/auth.ts @@ -2,6 +2,7 @@ import express, { Router } from 'express'; import { Auth } from '@auth/core'; import GithubProvider, { GitHubEmail, GitHubProfile } from '@auth/core/providers/github'; import GoogleProvider from '@auth/core/providers/google'; +import AzureADProvider from '@auth/core/providers/azure-ad'; import { getToken } from '@auth/core/jwt'; import { AuthConfig, TokenSet } from '@auth/core/types'; import { OAuthConfig } from '@auth/core/providers'; @@ -62,6 +63,12 @@ const googleProvider = GoogleProvider({ }, }); +const azureADProvider = AzureADProvider({ + clientId: process.env.TOOLPAD_AZURE_AD_CLIENT_ID, + clientSecret: process.env.TOOLPAD_AZURE_AD_CLIENT_SECRET, + tenantId: process.env.TOOLPAD_AZURE_AD_TENANT_ID, +}); + export function createAuthHandler(project: ToolpadProject): Router { const { base } = project.options; @@ -74,7 +81,7 @@ export function createAuthHandler(project: ToolpadProject): Router { error: `${base}/signin`, // Error code passed in query string as ?error= verifyRequest: base, }, - providers: [githubProvider, googleProvider], + providers: [githubProvider, googleProvider, azureADProvider], secret: process.env.TOOLPAD_AUTH_SECRET, trustHost: true, callbacks: { @@ -108,11 +115,40 @@ export function createAuthHandler(project: ToolpadProject): Router { ); } + if (account?.provider === 'azure-ad') { + return Boolean( + profile?.email && + (restrictedDomains.length === 0 || + restrictedDomains.some( + (restrictedDomain) => profile.email!.endsWith(`@${restrictedDomain}`) ?? false, + )), + ); + } + return true; }, async redirect({ baseUrl }) { return `${baseUrl}${base}`; }, + jwt({ token, account }) { + if (account?.provider === 'azure-ad' && account.id_token) { + const [, payload] = account.id_token.split('.'); + const idToken = JSON.parse(Buffer.from(payload, 'base64').toString('utf8')); + + token.roles = idToken.roles ?? []; + } + return token; + }, + // @TODO: Types for session callback are broken as it says token does not exist but it does + // Github issue: https://github.com/nextauthjs/next-auth/issues/9437 + // @ts-ignore + session({ session, token }) { + if (session.user) { + session.user.roles = token.roles ?? []; + } + + return session; + }, }, }; diff --git a/packages/toolpad-app/src/server/schema.ts b/packages/toolpad-app/src/server/schema.ts index cd58c14ce91..a74ea0c0157 100644 --- a/packages/toolpad-app/src/server/schema.ts +++ b/packages/toolpad-app/src/server/schema.ts @@ -265,7 +265,7 @@ export const applicationSchema = toolpadObjectSchema( .array( z.object({ provider: z - .enum(['github', 'google']) + .enum(['github', 'google', 'azure-ad']) .describe('Unique identifier for this authentication provider.'), }), ) diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 5fc4fb06a85..646d695cf0f 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -19,8 +19,10 @@ import { Stack, Tab, TextField, + Theme, Tooltip, Typography, + useTheme, } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import AddIcon from '@mui/icons-material/Add'; @@ -41,16 +43,28 @@ import * as appDom from '../../appDom'; import TabPanel from '../../components/TabPanel'; import { AuthProviderConfig, AuthProvider } from '../../types'; import { updateArray } from '../../utils/immutability'; - -const AUTH_PROVIDERS = new Map([ - ['github', { name: 'GitHub', Icon: GitHubIcon }], - ['google', { name: 'Google', Icon: GoogleIcon }], -]); +import AzureIcon from '../../components/icons/AzureIcon'; + +function getAuthProviderOptions(theme: Theme) { + return new Map([ + ['github', { name: 'GitHub', Icon: GitHubIcon }], + ['google', { name: 'Google', Icon: GoogleIcon }], + [ + 'azure-ad', + { + name: 'Azure AD', + Icon: () => , + }, + ], + ]); +} export function AppAuthenticationEditor() { const { dom } = useAppState(); const appState = useAppStateApi(); + const theme = useTheme(); + const handleAuthProvidersChange = React.useCallback( (event: SelectChangeEvent) => { const { @@ -107,6 +121,8 @@ export function AppAuthenticationEditor() { const restrictedDomains = authentication?.restrictedDomains ?? []; + const authProviderOptions = React.useMemo(() => getAuthProviderOptions(theme), [theme]); + return ( @@ -124,11 +140,11 @@ export function AppAuthenticationEditor() { fullWidth renderValue={(selected) => selected - .map((selectedValue) => AUTH_PROVIDERS.get(selectedValue)?.name ?? '') + .map((selectedValue) => authProviderOptions.get(selectedValue)?.name ?? '') .join(', ') } > - {[...AUTH_PROVIDERS].map(([value, { name, Icon }]) => ( + {[...authProviderOptions].map(([value, { name, Icon }]) => ( -1} /> diff --git a/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx b/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx index 6dd1548d081..a76f57e0704 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx @@ -63,18 +63,18 @@ export default function PageOptionsPanel() { const handleAllowAllChange = React.useCallback( (event: React.SyntheticEvent, isAllowed: boolean) => { domApi.update((draft) => - appDom.setNodeNamespacedProp( - draft, - page, - 'attributes', - 'authorization', - isAllowed ? undefined : { allowedRoles: [] }, - ), + appDom.setNodeNamespacedProp(draft, page, 'attributes', 'authorization', { + allowAll: isAllowed, + ...(isAllowed ? { allowedRoles: [] } : {}), + }), ); }, [domApi, page], ); + const allowAll = page.attributes.authorization?.allowAll ?? true; + const allowedRoles = page.attributes.authorization?.allowedRoles ?? []; + return ( Page: @@ -123,17 +123,15 @@ export default function PageOptionsPanel() {
Authorization: - } + control={} label="Allow access to all roles" /> ( diff --git a/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/CreatePageNodeDialog.tsx b/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/CreatePageNodeDialog.tsx index 89db3253ee1..62dddce7e2b 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/CreatePageNodeDialog.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/CreatePageNodeDialog.tsx @@ -60,6 +60,9 @@ export default function CreatePageDialog({ open, onClose, ...props }: CreatePage attributes: { title: name, display: 'shell', + authorization: { + allowAll: true, + }, }, }); const appNode = appDom.getApp(dom); diff --git a/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/index.tsx b/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/index.tsx index ff42fa79b70..a1bc515ca56 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/index.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/PagesExplorer/index.tsx @@ -239,6 +239,9 @@ export default function PagesExplorer({ className }: PagesExplorerProps) { attributes: { title: newPageName, display: 'shell', + authorization: { + allowAll: true, + }, }, }); const appNode = appDom.getApp(dom); diff --git a/packages/toolpad-app/src/types.ts b/packages/toolpad-app/src/types.ts index f62796bf1b9..5ea5b2a91cb 100644 --- a/packages/toolpad-app/src/types.ts +++ b/packages/toolpad-app/src/types.ts @@ -213,7 +213,7 @@ export interface ToolpadProjectOptions { export type CodeEditorFileType = 'resource' | 'component'; -export type AuthProvider = 'github' | 'google'; +export type AuthProvider = 'github' | 'google' | 'azure-ad'; export interface AuthProviderConfig { provider: AuthProvider; diff --git a/packages/toolpad-app/typings/@auth.d.ts b/packages/toolpad-app/typings/@auth.d.ts index e28ef3fb444..66dcb23e64e 100644 --- a/packages/toolpad-app/typings/@auth.d.ts +++ b/packages/toolpad-app/typings/@auth.d.ts @@ -1,5 +1,13 @@ export declare module '@auth/core/types' { + interface User { + roles: string[]; + } interface Profile { verifiedEmails?: string[]; } } +export declare module '@auth/core/jwt' { + interface JWT { + roles: string[]; + } +} From 60f031d0e75369ccb7a3680e8df58abd0a29068b Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:33:17 +0000 Subject: [PATCH 09/35] Use just size property in icon --- packages/toolpad-app/src/components/icons/AzureIcon.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/toolpad-app/src/components/icons/AzureIcon.tsx b/packages/toolpad-app/src/components/icons/AzureIcon.tsx index bd39a325d4a..6a72be449d7 100644 --- a/packages/toolpad-app/src/components/icons/AzureIcon.tsx +++ b/packages/toolpad-app/src/components/icons/AzureIcon.tsx @@ -1,17 +1,16 @@ import * as React from 'react'; interface AzureIconProps { - height?: number; - width?: number; + size?: number; color?: string; } -export default function AzureIcon({ height = 18, width = 18, color = '#fff' }: AzureIconProps) { +export default function AzureIcon({ size = 18, color = '#fff' }: AzureIconProps) { return ( Date: Tue, 16 Jan 2024 12:28:13 +0000 Subject: [PATCH 10/35] Add role mapping --- docs/schemas/v1/definitions.json | 145 ++++-------- packages/toolpad-app/src/appDom/index.ts | 3 +- .../toolpad-app/src/runtime/SignInPage.tsx | 2 +- packages/toolpad-app/src/server/auth.ts | 29 ++- packages/toolpad-app/src/server/schema.ts | 14 +- .../AppEditor/AppAuthorizationEditor.tsx | 206 +++++++++++++++++- 6 files changed, 282 insertions(+), 117 deletions(-) diff --git a/docs/schemas/v1/definitions.json b/docs/schemas/v1/definitions.json index 4196e62bef1..46068942643 100644 --- a/docs/schemas/v1/definitions.json +++ b/docs/schemas/v1/definitions.json @@ -27,16 +27,11 @@ "properties": { "provider": { "type": "string", - "enum": [ - "github", - "google" - ], + "enum": ["github", "google", "azure-ad"], "description": "Unique identifier for this authentication provider." } }, - "required": [ - "provider" - ], + "required": ["provider"], "additionalProperties": false }, "description": "Authentication providers to use." @@ -74,14 +69,28 @@ "description": "A description of the role." } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": false } ] }, "description": "Available roles for this application. These can be assigned to users." + }, + "roleMappings": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "propertyNames": { + "enum": ["github", "google", "azure-ad"] + }, + "description": "Role mapping definitions from authentication provider roles to Toolpad roles." } }, "additionalProperties": false, @@ -92,10 +101,7 @@ "description": "Defines the shape of this \"application\" object" } }, - "required": [ - "apiVersion", - "kind" - ], + "required": ["apiVersion", "kind"], "additionalProperties": false }, "Page": { @@ -185,9 +191,7 @@ "description": "The value" } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": false, "description": "A name/value pair." }, @@ -276,11 +280,7 @@ "type": "string" } }, - "required": [ - "kind", - "content", - "contentType" - ], + "required": ["kind", "content", "contentType"], "additionalProperties": false }, { @@ -297,10 +297,7 @@ } } }, - "required": [ - "kind", - "content" - ], + "required": ["kind", "content"], "additionalProperties": false } ], @@ -324,9 +321,7 @@ "const": "raw" } }, - "required": [ - "kind" - ], + "required": ["kind"], "additionalProperties": false, "description": "Don't interpret this body at all." }, @@ -338,9 +333,7 @@ "const": "json" } }, - "required": [ - "kind" - ], + "required": ["kind"], "additionalProperties": false, "description": "Interpret the fetch response as JSON" }, @@ -356,10 +349,7 @@ "description": "First row contains headers" } }, - "required": [ - "kind", - "headers" - ], + "required": ["kind", "headers"], "additionalProperties": false, "description": "Interpret the fetch response as CSV" }, @@ -371,9 +361,7 @@ "const": "xml" } }, - "required": [ - "kind" - ], + "required": ["kind"], "additionalProperties": false, "description": "Interpret the fetch response as XML" } @@ -381,9 +369,7 @@ "description": "How to parse the response." } }, - "required": [ - "kind" - ], + "required": ["kind"], "additionalProperties": false }, { @@ -399,9 +385,7 @@ "description": "The function to be executed on the backend by this query." } }, - "required": [ - "kind" - ], + "required": ["kind"], "additionalProperties": false } ], @@ -424,9 +408,7 @@ "description": "Time to cache before refetching" } }, - "required": [ - "name" - ], + "required": ["name"], "additionalProperties": false }, "description": "Queries that are used by the page. These will load data when the page opens." @@ -480,10 +462,7 @@ "description": "Defines the shape of this \"page\" object" } }, - "required": [ - "apiVersion", - "kind" - ], + "required": ["apiVersion", "kind"], "additionalProperties": false }, "Theme": { @@ -510,10 +489,7 @@ "properties": { "mode": { "type": "string", - "enum": [ - "light", - "dark" - ] + "enum": ["light", "dark"] }, "primary": { "$ref": "#/definitions/SimplePaletteColorOptions" @@ -533,18 +509,11 @@ "description": "Defines the shape of this \"theme\" object" } }, - "required": [ - "apiVersion", - "kind" - ], + "required": ["apiVersion", "kind"], "additionalProperties": false } }, - "required": [ - "Application", - "Page", - "Theme" - ], + "required": ["Application", "Page", "Theme"], "additionalProperties": false, "definitions": { "JsExpressionBinding": { @@ -555,9 +524,7 @@ "description": "The expression to be evaluated." } }, - "required": [ - "$$jsExpression" - ], + "required": ["$$jsExpression"], "additionalProperties": false, "description": "A binding that evaluates an expression and returns the result." }, @@ -569,9 +536,7 @@ "description": "The name of an environment variable." } }, - "required": [ - "$$env" - ], + "required": ["$$env"], "additionalProperties": false, "description": "An environment variable." }, @@ -583,9 +548,7 @@ "description": "The code to be executed." } }, - "required": [ - "$$jsExpressionAction" - ], + "required": ["$$jsExpressionAction"], "additionalProperties": false, "description": "A javascript expression to be executed when this action is triggered." }, @@ -615,16 +578,11 @@ "description": "Parameters to pass when navigating to this page" } }, - "required": [ - "page", - "parameters" - ], + "required": ["page", "parameters"], "additionalProperties": false } }, - "required": [ - "$$navigationAction" - ], + "required": ["$$navigationAction"], "additionalProperties": false, "description": "A navigation from one page to another, optionally passing parameters to the next page." }, @@ -716,10 +674,7 @@ "description": "The properties to configure this instance of the component." } }, - "required": [ - "component", - "name" - ], + "required": ["component", "name"], "additionalProperties": false, "description": "The instance of a component. Used to build user interfaces in pages." }, @@ -734,9 +689,7 @@ "description": "The subtree, that describes the UI to be rendered by the template." } }, - "required": [ - "$$template" - ], + "required": ["$$template"], "additionalProperties": false, "description": "Describes a fragment of Toolpad elements, to be used as a template." }, @@ -752,10 +705,7 @@ "description": "The value" } }, - "required": [ - "name", - "value" - ], + "required": ["name", "value"], "additionalProperties": false, "description": "a name/value pair with a string value." }, @@ -781,10 +731,7 @@ "description": "The value" } }, - "required": [ - "name", - "value" - ], + "required": ["name", "value"], "additionalProperties": false, "description": "A name/value pair where the value is dynamically bindable to strings." }, @@ -804,11 +751,9 @@ "type": "string" } }, - "required": [ - "main" - ], + "required": ["main"], "additionalProperties": false } }, "$schema": "http://json-schema.org/draft-07/schema#" -} \ No newline at end of file +} diff --git a/packages/toolpad-app/src/appDom/index.ts b/packages/toolpad-app/src/appDom/index.ts index f680caeb298..b70541f55d0 100644 --- a/packages/toolpad-app/src/appDom/index.ts +++ b/packages/toolpad-app/src/appDom/index.ts @@ -13,7 +13,7 @@ import invariant from 'invariant'; import { BoxProps, ThemeOptions as MuiThemeOptions } from '@mui/material'; import { guessTitle, pascalCase, removeDiacritics, uncapitalize } from '@mui/toolpad-utils/strings'; import { mapProperties, mapValues, hasOwnProperty } from '@mui/toolpad-utils/collections'; -import { AuthProviderConfig, ConnectionStatus } from '../types'; +import { AuthProvider, AuthProviderConfig, ConnectionStatus } from '../types'; import { omit, update, updateOrCreate } from '../utils/immutability'; import { ExactEntriesOf, Maybe } from '../utils/types'; import { envBindingSchema } from '../server/schema'; @@ -66,6 +66,7 @@ export interface AppNode extends AppDomNodeBase { readonly name: string; readonly description?: string; }[]; + readonly roleMappings?: Partial>>; }; }; } diff --git a/packages/toolpad-app/src/runtime/SignInPage.tsx b/packages/toolpad-app/src/runtime/SignInPage.tsx index 75e11bc352c..72800a1f643 100644 --- a/packages/toolpad-app/src/runtime/SignInPage.tsx +++ b/packages/toolpad-app/src/runtime/SignInPage.tsx @@ -65,7 +65,7 @@ export default function SignInPage() { You must be authenticated to use this app. - + {authProviders.includes('github') ? ( role.name) ?? []; + const roleMappings = authorization?.roleMappings?.['azure-ad'] ?? {}; + + token.roles = (idToken.roles ?? []).flatMap((providerRole) => + roleNames + .filter((role) => + roleMappings[role] + ? roleMappings[role].includes(providerRole) + : role === providerRole, + ) + // Remove duplicates in case multiple provider roles map to the same role + .filter((value, index, self) => self.indexOf(value) === index), + ); } + return token; }, // @TODO: Types for session callback are broken as it says token does not exist but it does diff --git a/packages/toolpad-app/src/server/schema.ts b/packages/toolpad-app/src/server/schema.ts index a74ea0c0157..e552521e57b 100644 --- a/packages/toolpad-app/src/server/schema.ts +++ b/packages/toolpad-app/src/server/schema.ts @@ -256,6 +256,8 @@ elementSchema = baseElementSchema }) .describe('The instance of a component. Used to build user interfaces in pages.'); +const authProviderSchema = z.enum(['github', 'google', 'azure-ad']); + export const applicationSchema = toolpadObjectSchema( 'application', z.object({ @@ -264,9 +266,9 @@ export const applicationSchema = toolpadObjectSchema( providers: z .array( z.object({ - provider: z - .enum(['github', 'google', 'azure-ad']) - .describe('Unique identifier for this authentication provider.'), + provider: authProviderSchema.describe( + 'Unique identifier for this authentication provider.', + ), }), ) .optional() @@ -292,6 +294,12 @@ export const applicationSchema = toolpadObjectSchema( ) .optional() .describe('Available roles for this application. These can be assigned to users.'), + roleMappings: z + .record(authProviderSchema, z.record(z.array(z.string()))) + .optional() + .describe( + 'Role mapping definitions from authentication provider roles to Toolpad roles.', + ), }) .optional() .describe('Authorization configuration for this application.'), diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 646d695cf0f..0c08c450d44 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -45,15 +45,22 @@ import { AuthProviderConfig, AuthProvider } from '../../types'; import { updateArray } from '../../utils/immutability'; import AzureIcon from '../../components/icons/AzureIcon'; +interface AuthProviderOption { + name: string; + icon: React.ReactNode; + hasRoles: boolean; +} + function getAuthProviderOptions(theme: Theme) { - return new Map([ - ['github', { name: 'GitHub', Icon: GitHubIcon }], - ['google', { name: 'Google', Icon: GoogleIcon }], + return new Map([ + ['github', { name: 'GitHub', icon: , hasRoles: false }], + ['google', { name: 'Google', icon: , hasRoles: false }], [ 'azure-ad', { name: 'Azure AD', - Icon: () => , + icon: , + hasRoles: true, }, ], ]); @@ -144,11 +151,11 @@ export function AppAuthenticationEditor() { .join(', ') } > - {[...authProviderOptions].map(([value, { name, Icon }]) => ( + {[...authProviderOptions].map(([value, { name, icon }]) => ( -1} /> - + {icon} {name} @@ -452,12 +459,172 @@ export function AppRolesEditor({ onRowUpdateError }: { onRowUpdateError: (error:
); } + +interface RoleMapping { + role: string; + providerRoles: string; +} + +interface RoleMappingRow extends RoleMapping { + id: string; +} + +export function AppRoleMappingsEditor({ + roleEnabledAuthProviderOptions, + onRowUpdateError, +}: { + roleEnabledAuthProviderOptions: [string, AuthProviderOption][]; + onRowUpdateError: (error: Error) => void; +}) { + const { dom } = useAppState(); + const appState = useAppStateApi(); + + const [activeAuthProvider, setAuthProvider] = React.useState( + (roleEnabledAuthProviderOptions[0]?.[0] as AuthProvider) ?? null, + ); + + const handleAuthProviderChange = React.useCallback( + (event: React.ChangeEvent) => { + const { value: provider } = event.target; + + setAuthProvider(provider as AuthProvider); + }, + [], + ); + + const updateRoleMapping = React.useCallback( + (role: string, providerRoles: string) => { + if (!activeAuthProvider) { + return; + } + + appState.update((draft) => { + const app = appDom.getApp(draft); + + draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authorization', { + ...app.attributes?.authorization, + roleMappings: { + ...(app.attributes?.authorization?.roleMappings ?? {}), + [activeAuthProvider]: { + ...(app.attributes?.authorization?.roleMappings?.[activeAuthProvider] ?? {}), + [role]: (providerRoles || role).split(',').map((updatedRole) => updatedRole.trim()), + }, + }, + }); + + return draft; + }); + }, + [activeAuthProvider, appState], + ); + + const roleMappingsRows = React.useMemo(() => { + if (!activeAuthProvider) { + return []; + } + + const appNode = appDom.getApp(dom); + const authorization = appNode.attributes.authorization; + const roles = authorization?.roles ?? []; + const roleMappings = activeAuthProvider + ? authorization?.roleMappings?.[activeAuthProvider] + : {}; + + const existingRows = + roles?.map((role) => ({ + id: role.name, + role: role.name, + providerRoles: roleMappings?.[role.name] ? roleMappings?.[role.name].join(', ') : role.name, + })) ?? []; + + return existingRows; + }, [activeAuthProvider, dom]); + + const roleMappingsColumns = React.useMemo(() => { + return [ + { + field: 'role', + headerName: 'Role', + editable: false, + flex: 0.4, + }, + { + field: 'providerRoles', + headerName: 'Provider roles', + editable: true, + flex: 1, + }, + ]; + }, []); + + const [rowModesModel, setRowModesModel] = React.useState({}); + + const handleRowModesModelChange = (newRowModesModel: GridRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + + const processRowUpdate = (newRow: GridRowModel): RoleMappingRow => { + updateRoleMapping(newRow.id, newRow.providerRoles); + + return { ...newRow, providerRoles: newRow.providerRoles || newRow.role }; + }; + + return ( + + + {roleEnabledAuthProviderOptions.map(([value, { name }]) => ( + + {name} + + ))} + + {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */} +
{ + if (Object.keys(rowModesModel).length > 0) { + // Avoid the escape key from closing a dialog this grid is rendered in + event.stopPropagation(); + } + }} + > + +
+
+ ); +} + export interface AppAuthorizationDialogProps { open: boolean; onClose: () => void; } export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizationDialogProps) { + const { dom } = useAppState(); + + const theme = useTheme(); + const [activeTab, setActiveTab] = React.useState<'authentication' | 'roles' | 'users'>( 'authentication', ); @@ -476,6 +643,19 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati setErrorSnackbarMessage(''); }, []); + const roleEnabledAuthProviderOptions = React.useMemo(() => { + const appNode = appDom.getApp(dom); + + const authProviders = (appNode.attributes.authentication?.providers ?? []).map( + (providerConfig) => providerConfig.provider, + ); + const authProviderOptions = getAuthProviderOptions(theme); + + return [...authProviderOptions].filter( + ([optionKey, { hasRoles }]) => hasRoles && authProviders.includes(optionKey as AuthProvider), + ); + }, [dom, theme]); + return ( @@ -488,9 +668,12 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati > + {roleEnabledAuthProviderOptions.length > 0 ? ( + + ) : null} - + @@ -501,6 +684,15 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati
+ + + Define mappings from authentication provider roles to Toolpad roles. + + + From 43c9af0810b8f43bc16a7fc73636e794fd53886a Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 12:32:17 +0000 Subject: [PATCH 11/35] Update schemas --- docs/schemas/v1/definitions.json | 136 ++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 30 deletions(-) diff --git a/docs/schemas/v1/definitions.json b/docs/schemas/v1/definitions.json index 46068942643..3064f62a3e4 100644 --- a/docs/schemas/v1/definitions.json +++ b/docs/schemas/v1/definitions.json @@ -27,11 +27,17 @@ "properties": { "provider": { "type": "string", - "enum": ["github", "google", "azure-ad"], + "enum": [ + "github", + "google", + "azure-ad" + ], "description": "Unique identifier for this authentication provider." } }, - "required": ["provider"], + "required": [ + "provider" + ], "additionalProperties": false }, "description": "Authentication providers to use." @@ -69,7 +75,9 @@ "description": "A description of the role." } }, - "required": ["name"], + "required": [ + "name" + ], "additionalProperties": false } ] @@ -88,7 +96,11 @@ } }, "propertyNames": { - "enum": ["github", "google", "azure-ad"] + "enum": [ + "github", + "google", + "azure-ad" + ] }, "description": "Role mapping definitions from authentication provider roles to Toolpad roles." } @@ -101,7 +113,10 @@ "description": "Defines the shape of this \"application\" object" } }, - "required": ["apiVersion", "kind"], + "required": [ + "apiVersion", + "kind" + ], "additionalProperties": false }, "Page": { @@ -191,7 +206,9 @@ "description": "The value" } }, - "required": ["name"], + "required": [ + "name" + ], "additionalProperties": false, "description": "A name/value pair." }, @@ -280,7 +297,11 @@ "type": "string" } }, - "required": ["kind", "content", "contentType"], + "required": [ + "kind", + "content", + "contentType" + ], "additionalProperties": false }, { @@ -297,7 +318,10 @@ } } }, - "required": ["kind", "content"], + "required": [ + "kind", + "content" + ], "additionalProperties": false } ], @@ -321,7 +345,9 @@ "const": "raw" } }, - "required": ["kind"], + "required": [ + "kind" + ], "additionalProperties": false, "description": "Don't interpret this body at all." }, @@ -333,7 +359,9 @@ "const": "json" } }, - "required": ["kind"], + "required": [ + "kind" + ], "additionalProperties": false, "description": "Interpret the fetch response as JSON" }, @@ -349,7 +377,10 @@ "description": "First row contains headers" } }, - "required": ["kind", "headers"], + "required": [ + "kind", + "headers" + ], "additionalProperties": false, "description": "Interpret the fetch response as CSV" }, @@ -361,7 +392,9 @@ "const": "xml" } }, - "required": ["kind"], + "required": [ + "kind" + ], "additionalProperties": false, "description": "Interpret the fetch response as XML" } @@ -369,7 +402,9 @@ "description": "How to parse the response." } }, - "required": ["kind"], + "required": [ + "kind" + ], "additionalProperties": false }, { @@ -385,7 +420,9 @@ "description": "The function to be executed on the backend by this query." } }, - "required": ["kind"], + "required": [ + "kind" + ], "additionalProperties": false } ], @@ -408,7 +445,9 @@ "description": "Time to cache before refetching" } }, - "required": ["name"], + "required": [ + "name" + ], "additionalProperties": false }, "description": "Queries that are used by the page. These will load data when the page opens." @@ -462,7 +501,10 @@ "description": "Defines the shape of this \"page\" object" } }, - "required": ["apiVersion", "kind"], + "required": [ + "apiVersion", + "kind" + ], "additionalProperties": false }, "Theme": { @@ -489,7 +531,10 @@ "properties": { "mode": { "type": "string", - "enum": ["light", "dark"] + "enum": [ + "light", + "dark" + ] }, "primary": { "$ref": "#/definitions/SimplePaletteColorOptions" @@ -509,11 +554,18 @@ "description": "Defines the shape of this \"theme\" object" } }, - "required": ["apiVersion", "kind"], + "required": [ + "apiVersion", + "kind" + ], "additionalProperties": false } }, - "required": ["Application", "Page", "Theme"], + "required": [ + "Application", + "Page", + "Theme" + ], "additionalProperties": false, "definitions": { "JsExpressionBinding": { @@ -524,7 +576,9 @@ "description": "The expression to be evaluated." } }, - "required": ["$$jsExpression"], + "required": [ + "$$jsExpression" + ], "additionalProperties": false, "description": "A binding that evaluates an expression and returns the result." }, @@ -536,7 +590,9 @@ "description": "The name of an environment variable." } }, - "required": ["$$env"], + "required": [ + "$$env" + ], "additionalProperties": false, "description": "An environment variable." }, @@ -548,7 +604,9 @@ "description": "The code to be executed." } }, - "required": ["$$jsExpressionAction"], + "required": [ + "$$jsExpressionAction" + ], "additionalProperties": false, "description": "A javascript expression to be executed when this action is triggered." }, @@ -578,11 +636,16 @@ "description": "Parameters to pass when navigating to this page" } }, - "required": ["page", "parameters"], + "required": [ + "page", + "parameters" + ], "additionalProperties": false } }, - "required": ["$$navigationAction"], + "required": [ + "$$navigationAction" + ], "additionalProperties": false, "description": "A navigation from one page to another, optionally passing parameters to the next page." }, @@ -674,7 +737,10 @@ "description": "The properties to configure this instance of the component." } }, - "required": ["component", "name"], + "required": [ + "component", + "name" + ], "additionalProperties": false, "description": "The instance of a component. Used to build user interfaces in pages." }, @@ -689,7 +755,9 @@ "description": "The subtree, that describes the UI to be rendered by the template." } }, - "required": ["$$template"], + "required": [ + "$$template" + ], "additionalProperties": false, "description": "Describes a fragment of Toolpad elements, to be used as a template." }, @@ -705,7 +773,10 @@ "description": "The value" } }, - "required": ["name", "value"], + "required": [ + "name", + "value" + ], "additionalProperties": false, "description": "a name/value pair with a string value." }, @@ -731,7 +802,10 @@ "description": "The value" } }, - "required": ["name", "value"], + "required": [ + "name", + "value" + ], "additionalProperties": false, "description": "A name/value pair where the value is dynamically bindable to strings." }, @@ -751,9 +825,11 @@ "type": "string" } }, - "required": ["main"], + "required": [ + "main" + ], "additionalProperties": false } }, "$schema": "http://json-schema.org/draft-07/schema#" -} +} \ No newline at end of file From 1c068260403f18d3745ecdce32c550db618c7bd4 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 12:34:03 +0000 Subject: [PATCH 12/35] Better name --- .../toolpad/AppEditor/AppAuthorizationEditor.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 0c08c450d44..9896682a538 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -470,17 +470,17 @@ interface RoleMappingRow extends RoleMapping { } export function AppRoleMappingsEditor({ - roleEnabledAuthProviderOptions, + roleEnabledActiveAuthProviderOptions, onRowUpdateError, }: { - roleEnabledAuthProviderOptions: [string, AuthProviderOption][]; + roleEnabledActiveAuthProviderOptions: [string, AuthProviderOption][]; onRowUpdateError: (error: Error) => void; }) { const { dom } = useAppState(); const appState = useAppStateApi(); const [activeAuthProvider, setAuthProvider] = React.useState( - (roleEnabledAuthProviderOptions[0]?.[0] as AuthProvider) ?? null, + (roleEnabledActiveAuthProviderOptions[0]?.[0] as AuthProvider) ?? null, ); const handleAuthProviderChange = React.useCallback( @@ -580,7 +580,7 @@ export function AppRoleMappingsEditor({ select sx={{ mt: 2 }} > - {roleEnabledAuthProviderOptions.map(([value, { name }]) => ( + {roleEnabledActiveAuthProviderOptions.map(([value, { name }]) => ( {name} @@ -643,7 +643,7 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati setErrorSnackbarMessage(''); }, []); - const roleEnabledAuthProviderOptions = React.useMemo(() => { + const roleEnabledActiveAuthProviderOptions = React.useMemo(() => { const appNode = appDom.getApp(dom); const authProviders = (appNode.attributes.authentication?.providers ?? []).map( @@ -668,7 +668,7 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati > - {roleEnabledAuthProviderOptions.length > 0 ? ( + {roleEnabledActiveAuthProviderOptions.length > 0 ? ( ) : null} @@ -690,7 +690,7 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati From f6fdf9559a3f016ce383af17c6d55e3c3553c690 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 16:22:58 +0000 Subject: [PATCH 13/35] Fix Azure icon --- .../src/components/icons/AzureIcon.tsx | 11 ++--- .../AppEditor/AppAuthorizationEditor.tsx | 43 +++++++------------ 2 files changed, 19 insertions(+), 35 deletions(-) diff --git a/packages/toolpad-app/src/components/icons/AzureIcon.tsx b/packages/toolpad-app/src/components/icons/AzureIcon.tsx index 6a72be449d7..cc6a290b33c 100644 --- a/packages/toolpad-app/src/components/icons/AzureIcon.tsx +++ b/packages/toolpad-app/src/components/icons/AzureIcon.tsx @@ -5,17 +5,12 @@ interface AzureIconProps { color?: string; } -export default function AzureIcon({ size = 18, color = '#fff' }: AzureIconProps) { +export default function AzureIcon({ size = 18, color = 'currentColor' }: AzureIconProps) { return ( - + ); diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 9896682a538..7a8db613e31 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -19,10 +19,8 @@ import { Stack, Tab, TextField, - Theme, Tooltip, Typography, - useTheme, } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import AddIcon from '@mui/icons-material/Add'; @@ -51,27 +49,23 @@ interface AuthProviderOption { hasRoles: boolean; } -function getAuthProviderOptions(theme: Theme) { - return new Map([ - ['github', { name: 'GitHub', icon: , hasRoles: false }], - ['google', { name: 'Google', icon: , hasRoles: false }], - [ - 'azure-ad', - { - name: 'Azure AD', - icon: , - hasRoles: true, - }, - ], - ]); -} +const AUTH_PROVIDER_OPTIONS = new Map([ + ['github', { name: 'GitHub', icon: , hasRoles: false }], + ['google', { name: 'Google', icon: , hasRoles: false }], + [ + 'azure-ad', + { + name: 'Azure AD', + icon: , + hasRoles: true, + }, + ], +]); export function AppAuthenticationEditor() { const { dom } = useAppState(); const appState = useAppStateApi(); - const theme = useTheme(); - const handleAuthProvidersChange = React.useCallback( (event: SelectChangeEvent) => { const { @@ -128,8 +122,6 @@ export function AppAuthenticationEditor() { const restrictedDomains = authentication?.restrictedDomains ?? []; - const authProviderOptions = React.useMemo(() => getAuthProviderOptions(theme), [theme]); - return ( @@ -147,11 +139,11 @@ export function AppAuthenticationEditor() { fullWidth renderValue={(selected) => selected - .map((selectedValue) => authProviderOptions.get(selectedValue)?.name ?? '') + .map((selectedValue) => AUTH_PROVIDER_OPTIONS.get(selectedValue)?.name ?? '') .join(', ') } > - {[...authProviderOptions].map(([value, { name, icon }]) => ( + {[...AUTH_PROVIDER_OPTIONS].map(([value, { name, icon }]) => ( -1} /> @@ -623,8 +615,6 @@ export interface AppAuthorizationDialogProps { export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizationDialogProps) { const { dom } = useAppState(); - const theme = useTheme(); - const [activeTab, setActiveTab] = React.useState<'authentication' | 'roles' | 'users'>( 'authentication', ); @@ -649,12 +639,11 @@ export default function AppAuthorizationDialog({ open, onClose }: AppAuthorizati const authProviders = (appNode.attributes.authentication?.providers ?? []).map( (providerConfig) => providerConfig.provider, ); - const authProviderOptions = getAuthProviderOptions(theme); - return [...authProviderOptions].filter( + return [...AUTH_PROVIDER_OPTIONS].filter( ([optionKey, { hasRoles }]) => hasRoles && authProviders.includes(optionKey as AuthProvider), ); - }, [dom, theme]); + }, [dom]); return ( From 71ea8a72e3b986306ccf239c70bf2091f25b5450 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 17:05:31 +0000 Subject: [PATCH 14/35] Disable feature flag --- packages/toolpad-app/src/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolpad-app/src/constants.ts b/packages/toolpad-app/src/constants.ts index 5d0b6d21566..9a8e5503061 100644 --- a/packages/toolpad-app/src/constants.ts +++ b/packages/toolpad-app/src/constants.ts @@ -21,4 +21,4 @@ export const VERSION_CHECK_INTERVAL = 1000 * 60 * 10; // TODO: Remove once global functions UI is ready export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; -export const FEATURE_FLAG_AUTHORIZATION = true; +export const FEATURE_FLAG_AUTHORIZATION = false; From 9cffb6a49f1e008a9ae20e4f55036ac5d31c3e33 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 17:09:08 +0000 Subject: [PATCH 15/35] Self-review --- packages/toolpad-app/src/server/toolpadAppServer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/toolpad-app/src/server/toolpadAppServer.ts b/packages/toolpad-app/src/server/toolpadAppServer.ts index 155099df7b6..7899f67aedc 100644 --- a/packages/toolpad-app/src/server/toolpadAppServer.ts +++ b/packages/toolpad-app/src/server/toolpadAppServer.ts @@ -1,4 +1,3 @@ -import 'dotenv/config'; import * as path from 'path'; import * as fs from 'fs/promises'; import { Server } from 'http'; From f550a027bf57646a4e80acba2541fa327c5b0b46 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 17:50:28 +0000 Subject: [PATCH 16/35] Fix page blocking logic and default page --- packages/toolpad-app/src/runtime/ToolpadApp.tsx | 17 +++++++++++++---- packages/toolpad-app/src/runtime/auth.tsx | 6 ++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/toolpad-app/src/runtime/ToolpadApp.tsx b/packages/toolpad-app/src/runtime/ToolpadApp.tsx index 1414e7f3480..f6536ce9df4 100644 --- a/packages/toolpad-app/src/runtime/ToolpadApp.tsx +++ b/packages/toolpad-app/src/runtime/ToolpadApp.tsx @@ -1477,15 +1477,19 @@ function PageNotFound() { interface RenderedPagesProps { pages: appDom.PageNode[]; + defaultPage: appDom.PageNode; hasAuthentication?: boolean; basename: string; } -function RenderedPages({ pages, hasAuthentication = false, basename }: RenderedPagesProps) { +function RenderedPages({ + pages, + defaultPage, + hasAuthentication = false, + basename, +}: RenderedPagesProps) { const { search } = useLocation(); - const defaultPage = pages[0]; - const defaultPageNavigation = ; return ( @@ -1596,7 +1600,12 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { clipped={SHOW_PREVIEW_HEADER} basename={basename} > - + ); } diff --git a/packages/toolpad-app/src/runtime/auth.tsx b/packages/toolpad-app/src/runtime/auth.tsx index 80efccad26f..ca945d8611e 100644 --- a/packages/toolpad-app/src/runtime/auth.tsx +++ b/packages/toolpad-app/src/runtime/auth.tsx @@ -51,16 +51,14 @@ export function RequireAuthorization({ reason = `User does not have the roles to access this page.`; } - // @TODO: Once we have roles we can add back this check. - const skipReason = true; - return !skipReason && reason ? ( + return reason ? ( Unauthorized. {reason} From f725a2129c9421b096f265e6f76c618b5e20d6ed Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:32:18 +0000 Subject: [PATCH 17/35] More fixes --- packages/toolpad-app/src/runtime/ToolpadApp.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/toolpad-app/src/runtime/ToolpadApp.tsx b/packages/toolpad-app/src/runtime/ToolpadApp.tsx index f6536ce9df4..8b2bf833164 100644 --- a/packages/toolpad-app/src/runtime/ToolpadApp.tsx +++ b/packages/toolpad-app/src/runtime/ToolpadApp.tsx @@ -1568,7 +1568,7 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { const root = appDom.getApp(dom); const { pages = [] } = appDom.getChildNodes(dom, root); - const { session, hasAuthentication } = React.useContext(AuthContext); + const { session, hasAuthentication, isSigningIn } = React.useContext(AuthContext); const pageMatch = useMatch('/pages/:slug'); const activePageSlug = pageMatch?.params.slug; @@ -1591,6 +1591,10 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { [authFilteredPages], ); + if (!IS_RENDERED_IN_CANVAS && isSigningIn && hasAuthentication) { + return ; + } + return ( Date: Tue, 16 Jan 2024 18:56:05 +0000 Subject: [PATCH 18/35] Better signout experience --- .../toolpad-app/src/runtime/ToolpadApp.tsx | 14 ++------ packages/toolpad-app/src/runtime/auth.tsx | 32 +++---------------- packages/toolpad-app/src/runtime/useAuth.ts | 10 +++--- 3 files changed, 13 insertions(+), 43 deletions(-) diff --git a/packages/toolpad-app/src/runtime/ToolpadApp.tsx b/packages/toolpad-app/src/runtime/ToolpadApp.tsx index 8b2bf833164..c618bc5be1e 100644 --- a/packages/toolpad-app/src/runtime/ToolpadApp.tsx +++ b/packages/toolpad-app/src/runtime/ToolpadApp.tsx @@ -1479,15 +1479,9 @@ interface RenderedPagesProps { pages: appDom.PageNode[]; defaultPage: appDom.PageNode; hasAuthentication?: boolean; - basename: string; } -function RenderedPages({ - pages, - defaultPage, - hasAuthentication = false, - basename, -}: RenderedPagesProps) { +function RenderedPages({ pages, defaultPage, hasAuthentication = false }: RenderedPagesProps) { const { search } = useLocation(); const defaultPageNavigation = ; @@ -1509,7 +1503,6 @@ function RenderedPages({ {pageContent} @@ -1568,7 +1561,7 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { const root = appDom.getApp(dom); const { pages = [] } = appDom.getChildNodes(dom, root); - const { session, hasAuthentication, isSigningIn } = React.useContext(AuthContext); + const { session, hasAuthentication } = React.useContext(AuthContext); const pageMatch = useMatch('/pages/:slug'); const activePageSlug = pageMatch?.params.slug; @@ -1591,7 +1584,7 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { [authFilteredPages], ); - if (!IS_RENDERED_IN_CANVAS && isSigningIn && hasAuthentication) { + if (!IS_RENDERED_IN_CANVAS && !session?.user && hasAuthentication) { return ; } @@ -1608,7 +1601,6 @@ function ToolpadAppLayout({ dom, basename }: ToolpadAppLayoutProps) { pages={pages} defaultPage={authFilteredPages[0] ?? pages[0]} hasAuthentication={hasAuthentication} - basename={basename} /> ); diff --git a/packages/toolpad-app/src/runtime/auth.tsx b/packages/toolpad-app/src/runtime/auth.tsx index ca945d8611e..73b85e6dc57 100644 --- a/packages/toolpad-app/src/runtime/auth.tsx +++ b/packages/toolpad-app/src/runtime/auth.tsx @@ -1,22 +1,20 @@ import * as React from 'react'; import { asArray } from '@mui/toolpad-utils/collections'; -import { Box, CircularProgress, Container } from '@mui/material'; -import { AUTH_SIGNIN_PATH, AuthContext } from './useAuth'; +import { Box } from '@mui/material'; +import { AuthContext } from './useAuth'; export interface RequireAuthorizationProps { children?: React.ReactNode; allowAll?: boolean; allowedRoles?: string[]; - basename: string; } export function RequireAuthorization({ children, allowAll, allowedRoles, - basename, }: RequireAuthorizationProps) { - const { session, isSigningIn } = React.useContext(AuthContext); + const { session } = React.useContext(AuthContext); const user = session?.user ?? null; const allowedRolesSet = React.useMemo>( @@ -24,30 +22,8 @@ export function RequireAuthorization({ [allowedRoles], ); - React.useEffect(() => { - if (!user && !isSigningIn) { - window.location.replace(`${basename}${AUTH_SIGNIN_PATH}`); - } - }, [basename, isSigningIn, user]); - - if (!user) { - return ( - - - - ); - } - let reason = null; - if (!allowAll && !user.roles.some((role) => allowedRolesSet.has(role))) { + if (!allowAll && !user?.roles.some((role) => allowedRolesSet.has(role))) { reason = `User does not have the roles to access this page.`; } diff --git a/packages/toolpad-app/src/runtime/useAuth.ts b/packages/toolpad-app/src/runtime/useAuth.ts index 6564f94734b..94bd41c819c 100644 --- a/packages/toolpad-app/src/runtime/useAuth.ts +++ b/packages/toolpad-app/src/runtime/useAuth.ts @@ -3,10 +3,10 @@ import * as appDom from '../appDom'; const AUTH_API_PATH = '/api/auth'; -export const AUTH_SESSION_PATH = `${AUTH_API_PATH}/session`; -export const AUTH_CSRF_PATH = `${AUTH_API_PATH}/csrf`; -export const AUTH_SIGNIN_PATH = `${AUTH_API_PATH}/signin`; -export const AUTH_SIGNOUT_PATH = `${AUTH_API_PATH}/signout`; +const AUTH_SESSION_PATH = `${AUTH_API_PATH}/session`; +const AUTH_CSRF_PATH = `${AUTH_API_PATH}/csrf`; +const AUTH_SIGNIN_PATH = `${AUTH_API_PATH}/signin`; +const AUTH_SIGNOUT_PATH = `${AUTH_API_PATH}/signout`; export type AuthProvider = 'github' | 'google' | 'azure-ad'; @@ -93,6 +93,8 @@ export function useAuth({ dom, basename }: UseAuthInput): AuthPayload { setSession(null); setIsSigningOut(false); + + window.location.replace(`${basename}${AUTH_SIGNIN_PATH}`); }, [basename, getCsrfToken]); const getSession = React.useCallback(async () => { From 78337e23a76f4a6fb76a42cf434108fec3749219 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Tue, 9 Jan 2024 18:43:37 +0000 Subject: [PATCH 19/35] Write authorization docs (authentication) --- docs/data/pages.ts | 1 + docs/data/toolpad/concepts/authorization.md | 63 ++++++++++++++++++ docs/pages/toolpad/concepts/authorization.js | 7 ++ .../authorization/authentication-settings.png | Bin 0 -> 98300 bytes .../authorization/github-callback-url.png | Bin 0 -> 7776 bytes .../authorization/google-redirect-url.png | Bin 0 -> 10626 bytes .../concepts/authorization/sign-in-page.png | Bin 0 -> 24043 bytes packages/toolpad-app/src/constants.ts | 2 +- 8 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 docs/data/toolpad/concepts/authorization.md create mode 100644 docs/pages/toolpad/concepts/authorization.js create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/authentication-settings.png create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/github-callback-url.png create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/google-redirect-url.png create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/sign-in-page.png diff --git a/docs/data/pages.ts b/docs/data/pages.ts index d4a097cd987..e6b3d1e241b 100644 --- a/docs/data/pages.ts +++ b/docs/data/pages.ts @@ -78,6 +78,7 @@ const pages: MuiPage[] = [ { pathname: '/toolpad/concepts/page-properties', }, + { pathname: '/toolpad/concepts/authorization' }, { pathname: '/toolpad/concepts/custom-server' }, ], }, diff --git a/docs/data/toolpad/concepts/authorization.md b/docs/data/toolpad/concepts/authorization.md new file mode 100644 index 00000000000..2c876e62e07 --- /dev/null +++ b/docs/data/toolpad/concepts/authorization.md @@ -0,0 +1,63 @@ +# Authorization + +

Restrict a Toolpad application or some of its pages to certain authenticated users.

+ +You can configure a Toolpad application so that users have to sign in with specific authentication providers in order to access it. + +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/sign-in-page.png", "alt": "Toolpad sign-in page", "caption": "Toolpad sign-in page", "indent": 1, "aspectRatio": 1 }} + +Authentication settings can be accessed through the **Authorization** option in the app editor header. + +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/authentication-settings.png", "alt": "Authentication settings", "caption": "Authentication settings", "indent": 1, "aspectRatio": 6 }} + +## Authentication secret + +To enable any authorization features, you must set a random string to be used as a secret in the `TOOLPAD_AUTH_SECRET` environment variable. + +This secret will be used to hash tokens, sign/encrypt cookies and generate cryptographic keys. + +You can quickly create a good value on the command line with this `openssl` command: + +```bash +openssl rand -base64 32 +``` + +## Authentication providers + +In the authentication settings, you can set up one or more authentication providers for users to be able to sign in with, such as Github and Google. + +If any authentication providers are set, only authenticated users are able to access your Toolpad application. + +Each authentication provider has its own configuration options, to be set with certain environment variables. + +### Github + +| environment variable name                       | description | +| :------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | +| `TOOLPAD_GITHUB_CLIENT_ID` | Github OAuth app client ID. | +| `TOOLPAD_GITHUB_CLIENT_SECRET` | Github OAuth app client secret. | + +Take a look at the following official instructions to [create a Github OAuth app](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app). + +In the Github OAuth app settings screen, in the **Authorization callback URL** option, use the production path of your application followed by `/api/auth/callback/github`, as in `http://mui.com/api/auth/callback/github`. + +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/github-callback-url.png", "alt": "Github callback URL configuration", "caption": "Github callback URL configuration", "zoom": false, "width": 460 }} + +### Google + +| environment variable name                  | description | +| :------------------------------------------------------------------------------------------------------------------------- | :-------------------------- | +| `TOOLPAD_GOOGLE_CLIENT_ID` | Google OAuth client ID. | +| `TOOLPAD_GOOGLE_CLIENT_SECRET` | Google OAuth client secret. | + +Take a look at the following official instructions to [create a Google OAuth client ID](https://developers.google.com/workspace/guides/create-credentials#oauth-client-id). + +In the Google OAuth client settings screen, under the **Authorized redirect URIs** option, make sure to include the production path of your application followed by `/api/auth/callback/google`, as in `http://mui.com/api/auth/callback/google`. + +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/google-redirect-url.png", "alt": "Google redirect URIs configuration", "caption": "Google redirect URIs configuration", "zoom": false, "width": 460 }} + +## Restricted domains + +In the authentication settings, you can specify one or more domains (such as `mui.com`) to restrict user authentication based on the signed-in user's email address. + +If any restricted domains are set, the user must have at least one verified email assigned to their current authentication provider that belongs to one of those domains, otherwise they will not be able to sign in. diff --git a/docs/pages/toolpad/concepts/authorization.js b/docs/pages/toolpad/concepts/authorization.js new file mode 100644 index 00000000000..2eb6cc83244 --- /dev/null +++ b/docs/pages/toolpad/concepts/authorization.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from '../../../data/toolpad/concepts/authorization.md?@mui/markdown'; + +export default function Page() { + return ; +} diff --git a/docs/public/static/toolpad/docs/concepts/authorization/authentication-settings.png b/docs/public/static/toolpad/docs/concepts/authorization/authentication-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..926e4d624d8f721d0c8cad608bbf298bb559ba86 GIT binary patch literal 98300 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 literal 0 HcmV?d00001 diff --git a/docs/public/static/toolpad/docs/concepts/authorization/github-callback-url.png b/docs/public/static/toolpad/docs/concepts/authorization/github-callback-url.png new file mode 100644 index 0000000000000000000000000000000000000000..d226ac3efa8a22f35cbc8efb1232ea337db23856 GIT binary patch literal 7776 zcmZ8`bx;&u)b`R{5`vP_AjrZJf`oL}(w)n)0s<=~(t?zP^wPDYNOyNF-7QFWw|xHI z_m6kxJAd4J=FXjG&U2q<&YYPWrm3z#g#Q8`000mvDavXC02qjWc_=Q%zqMl7rWyc1 zgKDbk$UQwhUESOMswX<2($&*JiGTw;oqt-YR+SxsHT z?d@&%*EABS$S1VT#}`=U1~=5(ecU1=!CY8p~q*Ro&Ce;*o2U8pPrG;FZAw5T%upV zS3^_Fg5sYaUEIPWqaPn1&8;A(=a3tjD6~Md<&f{};)oP51UM@Ha&M{_)UyMyL#{ zN*IWTg%S@4J)^?OwRC{k+6?r1R+*_*mXJN`zV=&%-&Lp0O=w|SgSO!U`mn~nV`etiUXGcB%vyR%Ju@lN81>T?~lDq zF1SeRk8vr~^um8Te(hUP$(P%Np1*cu)lCM$F>TwRb5b+Xp#^^I>rBW-#-s^axm-5C zzxb;K1t`=>h+_=H`8_9Zn~xZ~TIz@p<7+TNt&8tPooZatR-lHkYtPOi3lYHcNgnZ$ zI$ zV{7&}lUFP~+FYzr&5?^7?bvtHW`5G<$rXVydhWU`fO~6i@4JWD>LF^bIEh@P7__a{ z2q2hsbNu02)+Bw=DUPNIU)HW}Y{?IDi+(k8t=;&UXDll2f{-tC zgmmw0uhu)}vnA^gGiJtTmUuvEEz|JW{@N!a|4LP9@6dLwjL<#YpJ)8$ES9~p7WHZq zRQ`g0Evn=q1>M`fiI-VXIdJl*HKE&ADpI5>TfIxz8m94godFf~uNF+G-p$2I#39w- zn1qk7>|&Wvy5-=^uO6Y)-}z9?)-Xggnc-Z$1ZsvfRtSnc-!QyQ(eRi2JSDrAoa#Hr1Q*6*Jb@? zvae=*XVNz&pFqYWQ46z3PI3RK^9`_4RG+=5Zc25gI7%1*yE6kfRp|rVgCZ9DHIOu` z*z1y8wiG|Nms)AT#si#%KXb)8D7T4_p!DTBzUQ^`H(oQ{9wd1;!koF-xF#@r8 zE{JF)D4Ix4s5Rh5%F_5aw7Z`euL%%7TVPm|gZyw>#L~L~s=H|wRY9-^b!0)Mp%Cw~ zBEMa!)K`7iUKi-?mWd#^ep90?mRVOIR>0&^whf}`tX_?*qpU!<6hb!k2_lYFO731x!vgva9DJoy#&U|O2Z}`6)cwk2_IsR{FH2j zUsH?CgXV8(t2oKjfiuR;Rh-&J2e4krRzo&e0(x<*_Dh%*Iqe7g6(~HZ<447+S-$6h zrV~Yodq6_p3G_Fw@d%7gW=vnNR3f3HSXKhVdRi zzr_^TqqmS>))J2h_pHcok)Wv79yVk$z$~d@=S;)#Dt>eQB$<&qaMbJQT0PhIX!g({ zLSrLQwJ%FPkzZqXxRD%Hjgggsiz3k4?L}jeZ zUZo~H!|jTCfSRN|e6$=%qg&Dc`z(1w(6c*7d z3cJb|dHpDXa7a7Z4D*|#;IbySG?{E?!}(LM?WPX~@%(ni$gyCZM!uo%SguS48M5gp ziZpF$eqr8`#je|A>Vrj#tzaaH1_uk

XuMN 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 aYRMShSWHhUha4vVT~v}&mo1aF2>gFQfA2~F literal 0 HcmV?d00001 diff --git a/docs/public/static/toolpad/docs/concepts/authorization/google-redirect-url.png b/docs/public/static/toolpad/docs/concepts/authorization/google-redirect-url.png new file mode 100644 index 0000000000000000000000000000000000000000..c477372e7e1eb78417253442de279b25437d948e GIT binary patch literal 10626 zcmZ{JWmFtZ)Ar)-1b24{5?mJ7;J!f6h2ZY)5L|+VWpO9Lg9Hc=G%PN`b#V;@3orNm zz2A@LIp?i2XU=q2&oxz7Pu0|P$7^XS;b2l=0ssIU6=iuH000RF03h(8Bfa#1YaHBP z8i-ozdJ50a&o4b;F$so-hA1c~4-XGdPft!xPIq^A8yg!nH8ps6c!7a|uCA^>e*Cz& zxHvgEQBqQxot@p;*|D&&=_k#BU05)+Id09Qb<>S8a7d`-Ckf$orD#U*-|4*^oH*24cDFy_2-Z#c!MzW(D z{gA_-9q|)Ip&s8SJCuKZb~W}?%i!{MMrre(57~EmFAy+uvoofl1D5|s25LN1xu*GO zO%O>okUkIh0h{9nQRy&n7#RLiUdI~LwA{Xl{wahyx@$^suR|`_x`CJKta6*RwvVZG zV}hIYK@U#^#Uwj6F79rLk>vJ%ohaagkj|SV=k`EO;5zqgH{F{bBnSS{H?kI+GE`Q@+rxJc<3 zN|{ijE~y_y=}A6ENB<;DoH8W{7~pYq>DfS;;1s;P5Q^gY7^NE%r{$rLD!bKyfs;SF znRQ_hC0vi2W&H;YxX{LBaAX}p#mgmlNJUN^uspCgvrb6iuU4}%yiOXhbg;(a)$ops z%`3b;ZfKRBDaBLd=&d;6{W>}hd)Db14~tiB>M$HVEF~({F4}0PuW#5yB3vWl^jfCr zuR+{kfG{Odl<-f^I%@~ayp>L|#b-;vHhUu40j)`vgiNgBK=i87jiFSeoKsWQQszVA zqK6&h9?3E&a^l2e?;Z8gCcLU<+FXZNOodZ8Vo0X^ebH-5f1Fe=VbgwZp(F6gAn^gGuz2}iGS*{wcf3bQ@nni2l|h*9{b+$z3b zKWcUaFs3JfB9IN|A*Ps@=4{%x`DHo9^i2mTpVm7g$XaqF+Pv6QI^suIA;0X_D~S$Jzse-5;Mx{<4($GK6kTMUO)oMi`$i)Uoiu;I zil|aX|HVq$ltQS~m;+;$NG17)BgJIxat}ap8^(7pswsm)XkR*4vst7vc-uOx%YE-iz|CD zd$UDiQYCJgv?pX_hM%C*VRUfC+Wg+g&mySu0|?mpK8zy9^vOeC*WWPf^NeGC*)<4= z_9488raQ*Uh!(pN+#xBx{_UG%-2FPC;EqO6_ElV$y3G1Z(9rdf;)6MJ{N*&4oqaP%zvqxWG2-X9rUIFg7UPKR&N2{6@3E4O0 z>9FhNvx^9vf{}^{UU%zIV#yD`tr68;oh4bh>WV|UORcvhN)Rm zdUf7DWrS<`Jn)kmEDc7F?72!FCScuF_!jK6-}zI~f;9A|*oR7ACmp6U9?I;Lx$MXb9pHV6Y^={nUYG0wNiix`XLhGY2f=4<{$Zw*HM{DNjQjJ_XY z4!ja7V*YDs#^P$fAcg!YAaPg^VcO5-A0Qb|UULv!xIK!bXsBkd66w=Nm!cASU-YW& z<2tZ_tUD>ueKz%QhWglx^8<2`WAvUbc)KZxSiwLW)MKbb)J=-^mKt&*R`+_7vcb|x zR&-1^Xf4;NM;`t&z4UOs3CKL|@eiR%Mk!qJs88uj;WchKP{x|f)AI!pv%Su|D zzM<7q^N1#Oy+uIRZx7z6#O_;l0M;FnKbsrk)_Nmy8lV z7l`DEZJTKK&%7tlScpZj{O=F@lqd65NaLl!G3%M1J*FqdK75H5;>ioJuf4 z@9^|}D8K5)um+Mvz(z!5XVQs_OF^GA94sXky}rj_zb zbfsc-N``D3kwwLGPMaYagG2rVI%spP(=muosUb3UwfDJ%9)^^hi91o(3gIXLw>j^y zaH<&lhkGS}-`6DH&GHsz=*DY=cAs$y!tpeC&Jqyf46IpBRe)&8#jZ7vE1!Dz3NW}o z2fY#Jq_b{b|JVEp4Gs~c5 zpA_!Jq8&HN6$Z{sf#kg55oIsiMafA|Bwv-P!eZPM*Cffg5&b}z-|F`-Dq&~lAtgQYIX|#8(iI;mv79;&qJeIR2Gsofu#Uk-hW>X|c9&?Z*68{(+LA>O6T zXH^d>uE5dJmD&icBvGNXXaL@8Wj@PTTO~DQSpV7nhSqK5&fMCrh*B4XN8vzfS|4b6@$^#>(ank@8lm`L!AYZ=61cu)T=k5WA;zZ|1V_++_>v_K-Uj!H6c z?!u0<`VTuY-z!v{3y#Q}womT5Kr7zX-9pK@gmF^r_m#2%1cQJ5q=>m83{g}I1V_ik z2f~y64BYN`mRDMQ_eYqTLsld4_#u02u2j-Cte?apPi+b#Pq7oCy~*uqd^4cCaFN^u zinYvv5(&^T4{3GkRSa8z|CLpo?Jon2^gX|r+eXpOab|vb8^$Pq{#vf6Y~DpN;@u|M zqX;up>=-fVvCH8O$>*gD#(ZW#8`Dv#c6NLn8P7;~ve5@`92p@R=lVZU6c|ZlRZ1D$ z`3NH{niS2>U+^B;(s@MVU(fj3XjQyBrF?D) z9iPsO6>N`Y1~-K|lL@hn+DEQ^UYyoowUPT<>h7^%Y=(8uzR_5_N=Xd(w6dZ3JwzT& zNkP<8BN^e?VT^*;+@tB-$p`r;ghFt2QwptVvMNQvLiiHcs?j}X%K{&N;dn&Ng&dAh zNBPxckJ&e1Hp&1+dLA3^^1{jRF{Y1>jOV(0j9)W`O7eXO?Ox!oA2?^(#Nj;6;3*ONDhcG_{#^cW26q__>Q?I zLY3Pq7=qYC()=CDLuHxDCu ziPu+mjiUy;!|#MuU|1dqO97ljULJa%h(z6F=p)yLkVNAQkGJI)le;#tm26{JHeefA zmN9*g9>tj3H@Da%A{1^E>qauMwFt0muj#Rs%jTXzzbIt9NpGvK zM*-Qo0U!@jkOlUKKPm?JM+!na?M+5V5(WaYtQm=1WwLMaKZ{6&RD};ZK+`b9JmE_( z7TJ+4yuS}%f$y;KRugzMvQLVHq<_y>N>1HubQ7+|L|^kHvHdm4mD$BUZ;PblPa*`! zb5$%3h*KBU;8l$FzEcC5;p(0>vKL_oEM$6w4Vo&G{Gvszdu2qM86@vvwp+%08<$(t zEB{F{R^#J4P#`ZHgK`N1I^Ai+h^?F+oP!9&mj5c1-41U)V_bc+z20QgWWOC(@uNk?x$0w6^VF5{O1Zns(uW!ybXXY$;~)VL);CS zjNR67?q%{)ouop@nnfAEYrA`qcqO7pc*LPeeYfUm(wg4L(=B);ra#c+1Ymz!w9i@E z)Y{-X`cbDKKpNg2fq57@t90W1IUmG6|I>M*g zX}tDcB8v&k{)Q`c<~HIJE1uWVJs%u_HBjjdW)3@q;-U7RrDoB>aao)T4%UZ-S7JeOX-Z0kd6l#jQ$E!+tVI~vkDaV3p zV)%?6op_zJ^&)WIw)X}cCO8=??0 zFvI>cmJlqt&;9rP7$|$@UA1a4UMYK2JqveD6?!4{xF!f5P#sq##@ejX&he9z`FRts zZgG>@w~|CpOk`7tgDk}&JWPN%(>Y{AqxXsbV^A4GmkC^`a2&$PQqFTtEeYT&ekFz; z_@kpW;((?lNf0xJs%-rj;mRvqx7Zg4m?9djpcJ;W^LzvwwfiWIk1f*gFs&*S4U6Op zD;s<}i9t=J`y0Ml0Hgj==xga7P+@eg=EEMm1~Jgezw7+1zht%@W$5pL_R+o4(!Un{ zDOdIw?#M@A;@1JI9xOy$W(-jR!SU41WKf!ccYabLY5+`Na)hi(&Uu{4>p{ zp1o38@S715AtDhp%b`Xj%OB&pBo(NOKd7MT%_cZN^JS5azlJ+=o&kpjZ1$S=x6>aTxbOkWeF5xaTB2>} z_bNmveP`e7yY!Kp`0Gd#&*HJt7RSaNmOlWek@;ygGWdSf5M6N_B`eiNEv%jK$vsEP zL5t5G%vke5sQHDXcsbtlCGNnZn4||h`k7;4Sed|+0NJX+au@Te37>Isv?2NjeQB0X z(@0j}_C}i1Q-Nu5agVr9=0oKIeQv;+HuUSA@b6DOQUnyH>HE<`yKy_`AfM&7hN_9& zvGPEEa$Z-FTBbU~?U*|;UrE*B3Gqn#=%FYxTIBlUGg0x(sC~7jWW(s|D`R;;D{ql{9 zQDprX<6sfzG5EzOn>hULJoM-hbpLfc+Tr0M|5E^kJz7x8>i>sCON!wCqXJxpIwSvw z=D!=!pw1Hw3e4{!A?vFL#bw*Fe3;q%@}mYeC6uq^#k7R+_bnS^&z|*HP*Dn&ZIlnK z>eoAkgC8cnmx=#s;n-hG`=q;k>FxLnn0z7g$ zw%8R-MRqS66s$O$to<={vQ%Z@`0(ET8qKhxtj&V3x!Q!2@MYW~0%hm*hCohJX56{i z1Cypae_!XdX|4;C#pZXWI*v;k1ex}T$TiNanrKLdJ&l%(6!3= z<-;W%9k}I}%YKrF8X+KxO$2TyW#QWN2VZ|*cC7L{e-pjHe2tzA%x;wu7Jh4`48VtO zK%)0C_5uoqE#Un|WH*BL<^(9ng;GKJke==g76AIlaNZg!nzIrED{%427G^TfgH@lD zXr~1$WoEAWs)mILK>k{2Qu1xYzk04;{dV+XH_&GU`}w7O6J{lZTWA;~Ov$|^XTaB>I^1z?^f zqp%*@Jb&6DC#@#h)MhJcS>G7~6QuI&ES-ov&2ls)VhEU6!;L^)Z2Xz0kV0$=Ou1$_ zHhXK@(8{}5HO&B?@bHtkB)wOTJL3+1ZMRJ(i{!K{udR6PrCTPKGBPEUI67F?XVv)` zJMWs?CwbKvmg#>WN;=`0(h!SIVYw|f>QxwiI^8fke&pGAyz7Z!f??9aQE)aMY4CeB zxX+2|knjc3-1kF#>tlF`ymxFxRh0O9{r7^iORI|Cvu<;ik8{0Nx~7NsrJ{lC?RnDYfz=)W2XM^Nkla6>*lt zfB_9ZYumgFah+*E!jV>-z13Y`yBRI|q(^?GuVbPpXUL}1y!DWN8W_q!&~fo}o%^!r z))1oMy!E)%HKy!vcqSR_C>A25dC>F68Pt3bWg)eTVo5 zQ=#6^zHPO_srX#7pF+aOSdrh!T4qxwS#{il*zF;5v-}$>_QR> zuMH<4j|GL>mb15SlK5#l{5#<};9s}g*ul~~;in+H!hk8FKl4q6|I9mR=P-n}03+i|~ZHNT-PW(u$Op(Dn6;lTEVgN0ap3cFnGVrMl` zvj<$SpjSU>R0`>U!1o+U<(0I&9Fr5>4IV_Y0?5}{6a*a*ysBFyiZ$7r-PwMjr8)!T zkeXM|b>2v3t)~hI_{2?-L}{%O{7vtw#*c2s9pPR;YtIXDai<1b7CoKAM?7hLHB=Oe`q=WyupkseT9H zKbE$s(OTHiK3$h4mfV>OAFHiV7G9K46f#1K1UH0F z)rw2OG^CER!vG682j}7tKa+Ai^WnWgNI~2~ovz-8wu&EKFQMhoYvH55fY20dr)zlXH z#mvpfC~?A_Qqxn^F0670BIiA9P^0)N zG5sf6JgG$LcM=V%MjUVh$`*3ppmxFyR6hOODf}fyn|M>cyJtx)@k2NnC?CA4Qzt>D z0?{ZxiC1R@A^sA;Rm|ll@h5|~-NG*C%h4qArnt1S*>Js-viHyzHxwNzO$KiWv}JxR zG)A3`_Qlt|asJ`)-kE+VVbp_hRrO$n4B{JZ`lSY&~CqKwgh&8aFC2;!Y!#3?P(9ijD)3Gl-^6YDEMitM=^* z^`*N45KW6bL7Xj>$+Syyvfuth9a6B8aq7&_{^mIPwR1!5z-~>f21(`K7}<6jFRGZ@ z;aMj6#J?e8kzsDHwgLzE=`9012!+!hC{HZ& zrJ!qfnWm&*ewdJmP3GXR!L6|2*L;O7HTW2BQ+3?%vFW~`j3`I4T`TZr%; zl%*#;OmuEzCYEFBZ@WSiVk)cxVtkDx7_1mwN)wQ4qrpQLEZJY+p+sbnoUYc`-)49}j1WMn1zMQRl-SM&e~uL(o7)P#+$f}cBk;a$qT=_$$S7*re&Wv&e)b>!)hy=I;v){VN#kzI<`UMtg@lP zu$a-&h;s z$JrgBrE?2ci;P|~+3#ok@e3Z>3j&u?!m~d}0to4IzVuS4tU@*PB9&AP|43k6v#Rg< z&$Zr*^u@$6p(BB00@WV9FMY-e0X^sb%?$mig#VC?(;-mwKK$fBsS+db6_S_8%mqL+ z*fPhN`&c{={IC=-sWx6Gaf_Rh z4!_<`wr`@KsC|=+?`Pf!aQXqCXg{Ev19coR7#aJIgh|!HZ)@(3@fBnA>%?Ueu2!wN z3PQogM%Em$UyT(4b+K(Cuw~ham#oa##vSye3;F%Ouf@@yfe$p_)@me~1TJY*X>9kE z;n>VNc??!zb}ymH-uvM-WN!JX_%|;?Fv>cyoKFA)ugL&(n1nLNH0FqztKQ5%VXU4tcRSN-fbg29r*f-mnl6SA`_ExiK zytQn@9eZBt5>Xs&{*1#(WZdR|19D5|EzLFiHO8B~8!Z^Ean=HwT6F-9Ylv%jL*x8z z>!4f`Y1aN83jBx<8y3C5J5}@vE_Y~wcu%5f!V8GS1bfl$G>K-j1^BQsa+JlBZ4a*) zi1(J8L{7EFdnpvQ|Mlr;-}tgNJp_cj>S?55JJx|lj-pHjkgl%JS~H+bP0^?lBT_uL zU;IgnD#zn$0e536bK3XjYLKEG_N5cL1!}%0033aZEu={+M7npP*>*xMA%)7~&WCk0 z0l-&dN-lj|F8sgw)(i{dF}pxe17vv5$TeWto_!TBEcg`iZ&sCN9A0du2}iug49P@r zR&0_nhKj(zHt}B=u}cIL6XDnKJf~bt7U8WG=kxI{t=I!b+WWgh1RZxt z_^=E5m_YfPG9sG;#uxX$qIi8J&y~ae0RcXTDmnTS&?!5)EGMN*QR!=NnBS)y& z>G2+vH~^^f>^n?(4z)Qplgzzm5k`5$aILyta)L;&{$8glF3jrMjmD!j{Fpdx-#UbTi_?mNMiYlHH>qd1t5{6 zD>IVut83=fo|n$CTcciL+@9v}8_@zwS=Lng_!P8sGK+?212racX2F*oAKdO;)uUSy z$dg8}oIZxuVPfH(&0kkc{%m7*c+7B6GZQ$(L`9E1lLLMX!GIk65iOfWgdNIR$?BSX z*O-|8v^3|hP|DxHSdLx&)|uuxFPSY^3Dq+3PpD8ScE8BtQyH{JpJQv0{Hs!e}u$w<6xQkr0Vyl05H=h0pK zrfV!tIi{G3NP&#H1U!UB&t$(`ma1un;j*eZ%@c|c|D_2st`tea&tk#;mNVX?7}343 zXDjnS9LFT$)|QVnSM9!CFiE4yAhN}3zE5Zc>05Sm7->%LGNbOkEB4iXs=s4&& zyy!UeK)E;=K7$~3ppO$0ANqjStcUCbA$bHUiwL`+&9nY%Bt6#abzBRcAc6=~9w4k& z0iB{9T^5N{wDQW6C@dmR`b5-PqETWwD1d|tm4J_KsoePFQ4`zEBEfCoD zTIA4TmcWoa2Rv%>o4mqXOg8B6j^kpvG*m6sn4g2|G*m2Ph8zE^?5QYd%GU!eBmM^n`q*Uv literal 0 HcmV?d00001 diff --git a/docs/public/static/toolpad/docs/concepts/authorization/sign-in-page.png b/docs/public/static/toolpad/docs/concepts/authorization/sign-in-page.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9d610c96cd62393e9bd5eda4ad7635541ee455 GIT binary patch literal 24043 zcmeHvXH-U-2>@VRRYgsio0}UJc5X&S#;dEVjqUx*%ggig^W)=VaPT#P^5WtmXZ+^$ z^lWWyZE9+&y1IIIclYz>&wNSOy}i9BCnx*+`x_e@i;Ii={QM5i?i*49*4Ea1`RWR> z3-8ag{WFD@=-<>2Au>gx9L@|u~M zkylWttgK{aW}cj!jC-H(^5shd6LVQPxw*Ny(z5dWfp>adA8QM~LTJPp_M&PhWrk>gwuwGe&1; zXLC!7va<4<=;)-RBpX}1(b3WG0|T+Kv7(}){Ex&A4i1crjBs&rg+wGpC1rm6_>qyB z8U8vVATY444F-J`?&s&n`9Pqiw*LM5_j`MLdin-zY;5iA?X0YBZyjDu43LFhyO&;G%_jWV7*@) z?JX{^tPF(=cH5N=jayYEHMD3P@q2avfI-SL>BpKrlbc^c5d9B8Gp-6K3c$$M|Lie6 zhD)Mae!Hn5*3|lspHMN#Efk;qU`O=-n2VN{84)2mk`MIKg!=LS1)uSkXdomXhMO^2 z)&HE&?SJ6;JMjL2=kL(b`UjqW;Q3nw{0|w%K<(EZH5Rp(`6g@xUD}K_AC76C- z5PhHo@de}jNZB`+;2!uo7l3_eX_9kfzy$L)-YOv;ubWiHn)I-(yrn*oT9$0Oub}$S zESb33J1X|)8vqEqwK=yVh=G)VF4#D`rd4+rt3u5SPdzDTnZ6M2O&OY*sbL~vPmV)*%nq38=tL^fDvaxRq8CX|qc zl=al!$v+`@=XbLDWhjD`q;}u-@*GhoHYFncEGBF+kqExOLr99?x>UJ&ah@Nf^#&S3 zalB0@5OOaPybB#OeeglyoA&2qj3lPFvOoBrPvZXtp02BBX3A zC!PAwa)pv2t$0RYb=e{m8$8yIgA|iOsPZOQ;lU#hMAh5wTO23Hd(P}BDCKPVx_;@n zU!0`_qE5ny>Tg-Gx#}tzR^xs0XVF=H}hY{s{MhNl9Kp^nVrWhSAN7N{IUDDJ!J&q`m z#GSea-d)Q6734$+t3b7R*@_S2oBMF=J|p%9rJ2n=wB7bYlJ$CfVl#9^?@B(gxC^M1 zF8|JMw0}j6v=T=PZFlKF{Y|jF6C-fYH%ps+4__KYNeF3|EEa7y?i@f%;ts|8$rMs! zq^&Eu&MKqp0z=2QjNJLXf-TYSkJt-ikV}4x=~5VRz&|%X@fpDqdgN%0vFn_&tp1S^ z-5#aJxTo{E%EUaBZoZqhk<;TnGf$zE=&Go;>E-3;+9Ty zifXb^o>a55lPffQT$R{a)B{XtO5J~SC$F!Lxm4VOX(RpS-Y+jkXw|so*J~Xh zZ;yMW=mIpY2SSX>jHk(n23z5*Q4c(g;t7nfgYn=Rf%Y0m)fgvz0h8R;Gp?3bw?PhI zq~M2+JLoRtJUF5>Qo6*jqY_6XNV(&p%3z-b$iU;1@LQwkyJP2F**M53hx-dr&U&;* zqmAL>fr*T6oqnItcc;Z)X@M?tgI1B7XV4eb^rWyn=NcjyqMmGXo*8_4;V!nPiqt@D zGMEsaK!2u1k2K=6XO?zR5L*gFDckPRTQUw&edvLwR-_0WE|A9xJ4~^XyjueOs2Gg&Q5gxFiD`(vPhJ81RP z+mrwz_`QuRfC^!{7|^Fp9gD4*ASl!;%i7nbC#z4LR7y|7PV5qEg!a9B+L+4+z3xmOu@SG+ScrHY(Uy{51kS1}hCv zxZfjalPL%ZkZlt?{J>Qlnk;vPhv2jyc|Tyo8hq;b&15GX0l`xfVC z1pUpI1hBYJ9ca3F1ED6A=y)5BX-0_+HqC)Z=*(+xdt)S#!=I53N4zIuV7x2p_`Fef zt0cy^nv*B?Hyu>PP$IzrAqT+Ek@Iz*L)%@}CVX{s|ro#5l0!-e- zHAhHZ|LX_dLq~&+syb^Ed{OwHKjm0hsNGn}>$2#K|D4VJzxH>5w>S38`Tsc|Tz~KW zAx+9Kv(xWW@4w{Y{fdA4`scm4>L<}^C9UwwhpV-rwIn8@6{BE;zR!X2xT zkbtMr{r5n@y=DfME(3n~B4@*0mlDD}Ut7O=#9#!+aRu=wIjA{y?+W6eT3^tbN5)B?X>lb&w^p^A-}3zr2HGK1 zwqkhxhz^2T93NiT&MtWJlonweJm!Cg94m173-=G+YZ9@aMrFyBr+!L%xy<_;U$xKp`DTw)u>fUYY7gV1@M;JoyzoxF*Z5z8kIo-iPmP%jtsZw6j9M}wLka-=N{jCMXg4#F-FM#gWTeZN%JWx+e=4)m zeWaC$;d%A2&G_m=8fWyJPMBMOM9-?qtc@En3|R-X2&Ef}b9HCfiCfE)|Dn$)J=^SY zZm=sI%?Ucb`$vSC{K|&i^sYJQJJL`jDgcmg72}9;=1@v-7Z*7_0zkdsSm}$L!fQok zvOj!yolBi@my(zhensW**d|Yy;vd_WR#3SOT2ILwJ}$=L@h3}zMqE%WlgC+$BZL&jedH} zT`1o`IrWSJQS-;>dxlo1?f<9scic@V~6<0{yqS^t?8eV!%K zw}p4WG0;T}`z>h4<}e>A#EdjSvU0iqfoet_!5FU{pb}WD3+tz#*ruyUNu)(B)&{+FLq953pRM8VL;QceRjQp)3ac za?1|~fLRCK#1)4J@_@IeL*{@5Av{I=h*Qx?14V>BC7@$ZX#xxiaT?~{xeHa9I)3xg z2W|YJ7+zgGaw-KF8VLK@PWVcJv~@k{c~DBtDp{U6HvHSr1{gZGIsILQ%Ip?&ugAfL zbSU=l$I}I~PU#=G`uG(kEOvrHVV|YrUgyx=Vy+YPN>I-6PL z?Ox?YOd3$iqI}299abox@N+=Uds7hl_3kPP(OV|g=ieN+<6i_35u?NK1S zt{@2HY;*bOV-BoOneSl|7l|3eAM>h$#;Kwpw5E|WSH_CSk?K9nXyVZcBFvw zG!T@kV{p~1t^9tp>bq$Nuzh^IBNB18nP6zlMZJv%F}kY#w3ahkXj`*|jPU?N*Gj2J zz8{}}FsylKqc=nDI2W>X|#B3G0F)#v0X8Ud)v$dWz>TvU|kJKc8V@ZedxZgvpYJFvdM2U~Q7UyxA_ zkZkttZVl@@l*57NP~A@(_wx9$RSpE*omVNs<3_7zua&S{LrobB+oN>?h9{R+OMtPK zhISW$sR}27z;pvXT%p2hxSRvY3_5;LXhfjnEKL9xuveYN*o~xm7*7EINTrVIgGA7Q z1d)K|iBt#RRG10pg?5fT7D3b(QdRz`$0-VBCeV5+jSHt12=KfEdq(TQI|0lxqXxIB z?1y7P{(hqzfN*#>`OoMUm7wU%A@rub3k{?t!v^7BTCHyDEnq_-ggm4UF_NEPx7kNY zN%(zky_Cl8Xl6*62b0W$adpt~9&46Y?KK$;`u2@);SOpjKe#G8LpYXHwW~;~OoEUn z5X+>8S{jGhdH9WW>2E!|1DlF7L=|CfZsq;fwbsYneav!!iqK{v)aHBrkzUY-h6yP+QcaVuhAw!3r zIZ42%lqs146p(g;#B5vn@Z*1s-|wZ`USMU zo?d?5D@rB%nGNX)r|HUB8GBCmADPrkXD1$| zU1~o}c!=PS$vg&snNWO3nanv{mpD4^d*fPtbSSm@{or?M-Gk-(AFy^8UCCxzOG|P+ z>K;(aq7Wl@5LywK&A$a(x9|V)dvuWqIfKC3XOzs9#|q>D3EM73RQE4KY&s0}e}4c& zQc)AHcCWF-it3!g2pF=3>RIhxS)u#CO>zoB0Yl_S`-%-#cI-Klwm|Wrp5e9 zs*k_f5i@T*CAT!fLbr(1(|cxiY5s-PG@DgWqoe(%G=yby!r{R!?3Crk-c|Z(8p0jV z^GDaBuVucL25ILGi$L8+TxYscwr37Kw)a_4wi#AMpNPbdv9-xM;?Kr>+B$a${#0tS z^)>4Ib1(ixffETaiK)rNvAYNubY<$8hFDN9i{FNE5HH$4pIf3fBiW%N{bhRjB8}So89YJ ziB?88l&JA!wGiP2s=n0`+TvVhJbNkO7@&9KdMiOx2|=k^*k%xC-=xRs2?rrpTjn!1 zS$Y26NG9*?g#3iv(2%7s#O}ySEFxzG41>8SaW6zQOu}nBJrv3dz)p`o$|Qc6AIN$u zjmf_8vCnjGwKpL9Va55j_Fbpey15;HQ6m1yb-Ilb{Bi^bo5rvAhJ7}W3;oxUMH}G~ zk!mf9^u=$k)%3h2t9bK%PI1PwR@ihGJ>_yanci}nEo5+UyWOGJ%L z>A+Nf_n3-l+i~_N36_g=HqzZPCeofe)h&dl_N%yBSp^$*O!ppl*L(1D+lw2wL5hgr z+Wur3qlHeFlQU62=`mcqRYy|;v^_V#J~dZ82q!jSr5 z{!u*(`g0h&vi7s_DbMHof-J`4QCHh|?u3MkP@5qA^jDx?)X_zTCDf#^6W?b zuRdmQ8l`6**HK0n(R2v)n)iz+>%KAQ)+1LLc70f>|K_bhZ`;~Hy%>}}H_)}@(Lnmb zzRh@#8}w7y7}R}b_i(r-Psb2U9GT9@wu@q-0(z4 zBVv%|Ec%6a}F86^snmjT}q4WAJSEa2>gAjeU3A((+9OGrumYOjc_FSa>xoHXZ`OPG8 zB*UFYOfPT8d@_AW@ZeoJPujir4=JlMg&Yk>_||)%O8JzDFVY6ghRs``Unh?+cE3}} z?kCr?j`A|mcd!ljnrV84aVLG5FagY~|yI7hSCN~JtGsUcil zrJN7(-??_Rh!G+3#L{X0*;bL_Z0@kJip%kr0ZCH%O|&UKjHQIq#{;znSgMIM)Ua}o zU*DcX)w#XTS2iJ_2=A|GK27qLUW^}&UcAizrg#4XbX{|!g$Mej$Fj;^0&e1(`cmV@ zEl@qQ8ecfPcYVUG7SPEwQ|MAJ;4RKo?_)J}Z&1G~HV%oNk3abFd3SwNirDU&)(=E; zzx}bjNXwlNi*-NR@S^iUi32USCZ^zAbv+mL0?mAiZsJ5G+V5PCpZPtXRIRtEekYj7 zbz@vd^42EMDIikvxgkLRYsOtT@K@N!L(5D*x2p!@11|W~nDA15N}08Yge!UV}&<~HKZrF)ZrKgAKkp2=NSekz8 z_W|0q3v9!@*FV+2IR9o1Eok<%e?;h{xz+yN;37E-UpEY`F13!3f!y%nDZYzS%gww> zpA_3_Nbq@_!SU7)Jh(8~j1|S=isRSk7rDA&OD)!pQq-#6Z64TTg3R#-zdZZbtf6BW zOWfq{-#Y0C;WD~@j7DRR>@sIhbg~02gVvIKJeK%iWOEZT)-3?x8~?TXgSY<7Mn9RR zkGo5sjdifI96mPvW6Cg}J6?%r8CMHg+RbAwVQy$@K28g6N@Nkn(Y(MX1|fDqhzK(p z#Qdf6kn9NNrElF(wGUONxsf4-YLFsO*WpR{8=*R*?I#|*Gh$GHi#MhxpNJu+)3ZTo z>Q!T#&-1E=W$xST1DX-ij>|FlaGMYGUL%|iqBO7~ZxiravTX49XmNAs zT^=afBAxJdv);D=osm0y$3JLH*D$sJJ#s#r3D!`ba+bq7HE}H05==bQp40tvak?pF1LwO!X7}#EIM7qdorj` zSMZdECS^ljzvhIUjmJLz6!zwu(bH{FN|@YRva!CtKAeLa{NUFdxIGp0FUc6UQv*z= z*A{ELt)|-xgEz6hy+)2^#E=%_Ne9}^Ibj95?5F4B0O8lTdM`%4X4%-x(MjLwRbYy` ztG4!yOqEdjkEv`AzXMy4VHh5c;_>YnCK^H_xGf|uBOz*P{Sb7yMf5$niSh$sGsVQq zkqS@%o^yx(%fpu-8aIXp5%#c_Tzjp1ZwO4o3%&P4T$y91=wU-H^VIgrs{alxZT6~0 zWQ$;Z^UjO|5i}nrB9|&J!Lxjz^+ha`C+1zNA5je}L~q!zTuk?w(R@f_meV>9s77-o z_!seo-S{A4g3vN}l&JQ>^Yvj4@|PT7 z=TF|c0A1pyhfUR%bz|<5^hed;vJqjGHxEiHer=*iov%82^)HDrkAF#MGf7MT%fuv$ zW`}~W6}oaRh&|tNeQ{-3Xn)fl$nb?s9J%GnHb16`0rVizBlll2Jrl{(Z6S#ltVW?1 z5@6a$)#L*YHcz;X0}wu+r^{7ONedg*W;Ov*2ATFTBHhy>*w9^Ere7}-qVL|ZytFWB z54rcRvBF0Qvwlm#fl=4S2QBG&gw-4Ci<#){q>=hf)v9X51RoAtlEd6>~+KSAXXP#ad?^r{opy?3DJJmpX7v?V3j!fl}h+BMOD-hGUITtR!B1yv(d}R(`b)UuhTLS4{ zQ-U3|=P>mDfO~{bfa#JCG}THnFMZA_k_~7lGnvN$8HRtXUtw@?W}L;VVCtVEf}dv9 zbDL^Qv)+G8ZegvCX*hFxf_({1A%?*8X6YwLbf+n(^2xS@tAMG>lFHM`sD%)KTk2Wy zo%M6w+*&JlgxtZph#SUIzWO-Og?G`FjsR%$ZBuiTxP4mc_5H5C6BPnDy#8l*YB6(%pq3xxz!)Q&0if4xI`t4=6M zrC(phXJ$(7)p5{t<^y~K-O25aLLUQJf{it>ZKAOGb_?q+D? zxGyzkZxS6}kls$ViyQrU^gJ#Peb*8!A3YwfNPsDYKE`taRCmmNWe2&$y}N#B82-QObZk_EF}`iOfovF z{{#&P?%g_nl80H&DWpAdgoOI%UTIZE11R%1FGbH}TpO z7rg_~oe7RtF-7xvL|8SYQQ=4YiP3*2rDmq!a0N8nxxZ!af$*Ye@oiDnsp(n0HgM1} z8la8Gyguj^Kb6OHH19Yl=MQ+6^b|9Bd=J zZmWC7+5z0;-cIUJshx{**|y@CDVx&(;bLbK!s}u`&3iD3_Pr*Ds{up&;r``@j2pFR&|2800k=ro{M5)Q>#bH_W;CMnRr<2#M>F6+|g5pKKj}&49GA~ z*oX47W-@NaHer=_2W)t@rBq$T38cz)UyDBWnzhgS?N7-UP1D?lm!B3i2sGdEmw1z- zqEq!EXc9-QU!Vq{=vI>0{^^=4XYj1jdpIhVe2o5ilfAGzuIN?!5AeVEQA4@PE>h1_zR(>Dl5C{KCinLC)VGX z@jq0JkwqhR1fh$k(E@4M2u#MQw|;}2xNak_x|DyPo0C!ycxs9u_|W@iF5%;IbUEa; zl7P*b7Q3&!lwoSpukmF=@a3B@&1}F%$;nSMJO&d*c1O9qjZ@MyO|9!7tK4+Pfyb{p zzqbT3^Ldt;rhi3jJNVSxi0=z^smq&xlxKfHh*OO08dlNOIZ6fjN2_6XdLQNSv+TO9 z-$op!!lJI~94(&Z^=0DqYkJqGs7E;3qahTftnoQ^ZpD1Q{mvP~0gNo5hlZaFHk{%1 z&&tJz>-=CvsvQA>eD1n72vvwT=RgYS!h&Z82ZOavHDL%Ccrf7sf`HD#q&0H;jkggX zLfdscpw4eMbEjc7MV9T(SpeI0*TI?*PE&t~g1{-Cz8ho^&NvORIAMbIH6ne*{>ZcPL)E^PPg?Y-C96gBTs6F_?} zZhy6@0pU=-PQ?94!a+>pkE4Ojz0eDN%e{|>`z|;`Vkn-E^dKoFX*6-T^TOf$uDg;q zPq-pr+J#d-*G9H`gR%)R!udgj@#$hDCi}+EK|*#-o$>{=^}0gogF@Zw$1HPGwnx-X zIc3Rc2|lGfOsf%x(E~Qb=U7Kqbi>ihdk?A7IVn@yWA-MTl&*%3%8sUK-G}Gyf819| z*%y!9+Nz@7I6axGrqwc_xDL*q?+PCi_Cx{)00T~78Xc##_V$V%=X+gO&sr)uSDYr2 z2#i*ZvLtR*O;dZ$y=$FxkH~7Zfv9NA-J7)abgft)XJ>YA>MI*Lhaqe%Cp4DfD+%l+5 zT7c6Jym{h0G8$@^d5dtpogi8rV&u)h+;`Rk5Z+%jHn5FBJM~{g2Nl=8ltAD8H0o+u zq#gjpEsby(pn`>$SuL3d(}5f?mHx8F9842g(5Ok`UXaC;<){yFC|N#i|4jQ{~wmdekvdl80(Io@o;q$fblj2lW;WiA>w zvuo!dLkZrmQ#Y1Hy#;8erF1pEe0fF5#7H*+0Bc@Qsj}m=?ckS6;Q-5uv9sbH$}4hM z(WKwYTF-rjq9GQj){Q0TvL%iVMmsZF`S4Qo5*Gclr20xD@yGESD@>PNEtWc`BCeVG z9gOmu>hc)AJVLmD(6G@jtEb4Z0Ko1jLap?H@S$3LkYK8BS>Gr6H{>s@tg~*X7W;uN znR@X}-QUu|zKpQ2^<^#eZLL*5`os<`(XKOem{S%C2fPA}wi_w`Xp5Hugx>*)I-*~y z^H4k*GS<_ZICxo66y=!U!}_j>4J7)e-q;J63c9KWYDJCQ>=Z2D(o{G`h-msCdLd5?pOzPmNh+yz}OmW;Zvi9m&F9LwYi zK+PXs)uk2Ou5)pDT;x{^#0===bTPHeXE&g`7$gY%={j-=P-$er^>>|DIx+^ew{kIe z{p2+bfVnO1r~v$jXg-cUh4T7XybvEYOeBt+^UScpyG^I-IibY`Ip~p zIPjP1S-f{(0)2}^m@Z}Secs=OISUF3>R(XZP`o?%bHZN!4aX(%4ot&){5Ib`FSZvy zg?Z(P;P5Ez12r#zEqj3l8c4qd(klyNo+1#*v1zizDjy_*vuI!B;hUOh1F_RvkiRSy z0Ue{AI^#VGU}n{M6GYT?rH17c{5rG^JYFNPv~7*$B6?pL4<7kCs2PjN(c97l+{*6e z+y%_iVz?|zZH@$hA>M5Yf1D#20vedk9J*kYGTG>6g&hx2MEHUn)^+>v;g*`480G1e zM>cxm-3RlsE(%M#(xB!!h0Po#=t0ofu`&s))7YGk16oHkvK=D0S;zXPTip|ZK>?`J ztqxJKn-$Jb5`qr#FlvbGK9QJ!Hia78vr=9RmRePcPgGWcCLPJvJ z4!=vaN@sVi@Zi3p7>%F%rv4h^*X%z?I4o}zfAP~QO&cy@S@iI9k4ggu+}aP(Aa`!F zfi^Gh?-$0Q)F@wnO}v2ZK%kO6xJ^M2M7Tz!jP+_cSSnee-13~$GNBuq^FERMGnc=tgdbZ3>p zf`rNaavu*9P;Cc`J^@y>oU?zPW~AMWW@}Tv8BMSW0z{PJdI#r0qUp+=sb7FuvWb$J z4x6jcV#fxPC`=di+YJFP0CCsw+S&T!vK<0=$#x0qI19Mv4>}GD01J;k<|3XLqF%kG zLAT)NP#0?yf|jv%P?Nw~Ijnf0Dl)U&J;f3{ksi{mWCW%XGqsUeySBUu=@FbVfry)k z`}fttky9MvB!BW6;udTx@|%@gLj8r9P+8fvO9ec z56h+RhOMj}ah-62CQyLg?T2@I(Ve&xd6a`luH%)*8LWJ#lawL-wbH9hizK60C9ogw%}OD`pvAN!R@>u!^4X6JX*~1Dx*78Fym|< z=u5Nut=Jv~?_%3Mpfs4=+OOtVnBaRME#exWiuaANgHsNL=+JiHeJwe4jfl^v(>~yy zC+JwsT5&U|Yt#-#)zk5*sO5f=)fQ1#)a{<(NhYFuJA3`Giw{bpPu6p$YCe}Q?Jp4AKGGLCg9kg+b5LHMEeLT@E~}oE(ub-VFkK0 zKi)M`X!^IV+N9*=IP~8;{MsyM((0I7i#E)>?-1w&xScq z^Bw8q+)JbRGvcgxV0KQ_V^kLW%-+T3=zj*yq0cqOI7RtS@plg*$>wAm=X@joM zxjz2WxfK`?%Z>nF&-% zaGS_f>Lvya(PlTcMWh-;85VM{P&p0*w>^8iP2V=;!;5#lCv*qcCRq4DfG$*FOn>m} zNp>)5CB=isD~7Zi>IWi+eMcdH=Ym>+nSx?a3pY*}F;W&31M&jt&*gv|sv$Z2&w33^ zgVKMK9L^4Hf^?(KaXZ1B&}5XE{}Yu11>E(=OC+0o3RBSZ8vxVkcw4u|@gDwHURhnR z>u~+BcF*%De03U8$`|i?G}v+p(McXsKBVwGcrUrrQkkjxV#{d7cY9%RBp4llMSz>x z+e`=`cr(B(B@8jvuy9@8cbREu)1wWv%V{}1Ns+}wE>3T<0>QHc@IH|BytS5-lrTSX zK`MS5eg!yvj-^1*mUY{b27nNk+gx_B>uqH9xIpQleZtfNp~yaU*}b#IWP32O-wmC; zXfa%NG)HzAjW~F=?L|#u3;tR|!i4z^=0{Q_j4$P2t~Q_bu3Cdy0}q69W*hyQ0*%{l zdOj61<=DnKOxY%_-f4Nix?DZOD)Z?NCXtQ@drzRT9i%1)%?+V9k#5*BMeV>)far(%bA|XNLh2CHufH1K>9awE0mgcQFoS?QrNSVTM znaz7Z+z;78h8Va$Oe$gU=qb8;vGq14%Go7Avm{>}P)Q-Tcshd?h-N_B1Vw8N;`V%o zj=G&xiteJTz=bS@foal_a>@ZAR2DxO#&Ixz5hqds=2mf;kzfnD<%MQh9!9;$xEEg{ zjOwChy1B39F2q)s_fj6X3jTaNH~4+Px7K~M;qq9-`XT6=2PFh>c}@zK&(-Ai_WIbD z`z~YRuToh=X#-yvrjsC2HsSt_qN zjcz8xg-(ZEM3E-_S=)2uCc^Q)Jgr_vhMsvpEEd{Ny7-cKNc4VndKGwCu?O=)ZW=bC zLrT8v&|es^%+G$;!JD|uXE{15LtM;sQ7T@O|J>n*=SurWtCU4_$VA(*3d4t9&*PmV zoW%q3$qpfN#k#(^6rAa#50bLpvRRGIg(7$)Cr@>Rr9IcXgm7AZq*Az9DxQRQ3R(6` z?QN|sd=v?#)5ukjZj5eViNi43jL#Wvv<~PDh=LHYws*#|y9$$Qzgcck?2Ah$Wqn(P zLu2&pR*w^-(?_Ha0MLUJK*#QKL#rU|nwEcHwq*lo_3VL6+=Grh7XuY{#p1x#yjwqB ztpR5l21NvzyCY(Yht^WE$qDf)Mo>1LdV1q6DTnpcQ)RV~7 zvfL9;YarCv#){@MTor|P@Y`LMfF7efp_B(I$IXT|&Q8Tg#!{AZTClw5HHvEXc!&*;-_r`YlW;Tby9PdS~2Q zE|v(MX~?34nw4RXl%X8qrNJtzsSh|5vL+q8OWDwT^b+W5BF{H%iE0}GL1%R~tnwOP zMWAhDD5AzmQ|C~{ms~_9pY1Y7_!0D=(an02=sWQY=j)oabpi2PHTuJy5B379n0Kff zTBH7h24E9RQ zel-4`z`Z7A5O%PN{L@uAcA~#jNNMwBT#Yn z!Y7a+wsU}!!B0zqn8cd7QC*;{VNGjF7@yqpYn2&&V^R8e1YKYdcZkV(gjfZ)?cwa} z83HlXoj^eHmy8OOgKyN#dVSa=_oyMzAVnHzd+_;Q+{lypXJjxzwYgDZn4nOd9cDSf z+~YvnAM!?o`aUz1J8~AF<^sIfyNC6vx{+ya15HJ*g@dG3mZ&_G+ZxA|-yY3a;nYyz zhT8raf$zBez?art-uDJ}?9>egDETThM4$pO{w& z1aAhK91R#4lvKlyPM60WXS)yT*qnFx&WnDvQN!r(dhoBjWN8W{E>sn67K7@5I9ae< zN^x^olQDO{Ndb!ypyoBlGefjU=awUNm^=r_kPBmf4;TPyJGg+gk5B^qwfTT03LZ2_ zK{p+6qK^k(y{nQ0Qbha<9BJv{FbO)CJQbxV;aI`X7+v55jZ&V_blr2-o(|@QE~%mp zq@(e2u;Ei;rD8PY4xT;51JMxU!SBCKsONy*wp}VbDI2S255WUIUW%0u)R4g#lmFse z9Zw3k9qdv8pQiHf?uX%w{Wj-^a(uzmqfi|Dzzc0D4wx2&x(mM5SHgxTY+HQ{`2_h8 zplu95rk^7YyMR^2^r6E8C?jK_)wzh%2NoABSPGp2u>G3qp;*El7)p8R;E_3OQ(Fg5 zkMS3ky;H2PZfT=X>mUUnmQs>+h95d}XrzE`dI!*6!rUFc>VMFHpOf#`O_LYg=;!e=Rpkh zl)#2FFk4HfDir7feU#9M70~8kp4KzOsF0j3n2O}y=7gX%zY`StLIo(QU1;>~qMdr= zm?$wUde|(Tt>6G+LF|r-bV_LwjHCu3B+oPr2W4BRy} z9H!#Mg1a_>nz7+_qR<_5#@{|5)BZLgi?-8;(20U>Ew;0N0WY#Dgm!9Q%RSXBvEj!P zu@5EA(Iwzz0yU$X-g^N3O6b4{6~T2eioZu)9#WZ4$AFQz?uF(GLYO<+*SBN9RSy*gw11*uWh;MpYof7ic4$BVU_PFVWg6}RlfOs zTUaigVBYGDrOU*5bQj7Eyz{z%M`j@Ho0a{Mw3c_<-i2qQAMKQBZ;eR&3;9W>F*X>r zNmZJk+fC40OxBFevpwITM})Fy5HU2XC3_04{0fBcDB2^eQO1Q|sLFNJU~4%@Ky%T% zVY^U}Knl6s&pdWmgT)4` zOgkFMzWVLY6a8KZz3_GfX1PZ(qb2tCow_i5byPy=x5AbWR6Y zSBZ;KmBN}kJx&)WiWmj!KFP|Oz4|(4h zSAM@up2G%2?`0*X(+82zzrqAr)di_(fwfS{*hnKE+4ZO>bOe62ut{f|VQ<+`DR<4h zj-^55PBJD`6ClF%fQ|b$J^j0SG3Q8U;T#-sv_Clppyd&}Ik0golDhui`GfLnE_@VSCe7MnsEr{st-Rxd$(*|{^*WL!Abh=_NsesR| z(fr8866`C;mFCS_JzRiqE@w7^{50I4kVzK!ZdIaBtIycAu54( zfhwRDqVZ?}*zm1pbaO>6QwNWB4exv=50C@sk0MSmsgI)5#}%l^vLO;FngyTPDY9QZ6wY^O3R znS3?MpzI}cNA6JGki3b7?$2?{0p|HFn38lEztvtEz7tYkNj4g^`hig^>9Y5~iHoM_rR9wC+WJ! z>{ZAzIszs*3zFe4yEdxt-FE8>p?d+I&MyOmfwM(`< z)IP{)tRi@dPgGfug=X^NW{1d;ociAR%v-RmHJMZ60do36tJ@fy_$rCLgP~SsprPor z9)P{9j^yUS5TzN+^S#b8KL`+}56=yDr#MF@!0TXT;@q~m<8WK5{7HV=<2rv6Ce%;Z z#?PVIOV@6+-Oh!AF=Gnp3a7|>&S|+TJRu4LO=*Q&Zrt|Q=g2a_91}-Q;X?8#ZB$w; z9-_mgrEo)qM62A2fK@#F5|MrTe1I{XGV|{vWkzGyp8w5}DIyX4FLurOzuJ!^|AFUk zF2Cdc<2`?aPT@cB{2e;~!1K50`~%NF@cdu>y#Jq>>u((BpV0g_;1vE7d;S)kf8hE5 u6P~RvjEEcz@t?JC%8bkqDdqq9Q;$B{?n3c1pYb`e%`+Kg>Cz{rFa8^7vBQD@ literal 0 HcmV?d00001 diff --git a/packages/toolpad-app/src/constants.ts b/packages/toolpad-app/src/constants.ts index 9a8e5503061..5d0b6d21566 100644 --- a/packages/toolpad-app/src/constants.ts +++ b/packages/toolpad-app/src/constants.ts @@ -21,4 +21,4 @@ export const VERSION_CHECK_INTERVAL = 1000 * 60 * 10; // TODO: Remove once global functions UI is ready export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; -export const FEATURE_FLAG_AUTHORIZATION = false; +export const FEATURE_FLAG_AUTHORIZATION = true; From 2af7023c3c325d0cd2595c2651e72904fdb41a05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 14:53:13 +0100 Subject: [PATCH 20/35] Bump prettier (major) (#2320) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: MUI bot <2109932+Janpot@users.noreply.github.com> --- docs/package.json | 2 +- docs/src/components/landing/Hero.js | 19 +- package.json | 6 +- packages/toolpad-app/package.json | 2 +- .../toolpad-app/src/components/ColorTool.tsx | 43 ++- packages/toolpad-app/src/theme.ts | 2 +- .../AppEditor/AppAuthorizationEditor.tsx | 2 +- .../PageEditor/RenderPanel/OverlayGrid.tsx | 103 ++++--- packages/toolpad-app/src/toolpad/index.html | 2 +- packages/toolpad-app/src/utils/prettier.ts | 6 +- packages/toolpad-app/src/utils/types.ts | 32 +- packages/toolpad-core/src/types.ts | 24 +- packages/toolpad-utils/package.json | 2 +- pnpm-lock.yaml | 289 ++++++++++-------- prettier.config.js | 7 + renovate.json | 5 - scripts/docs/utils.ts | 6 +- 17 files changed, 299 insertions(+), 253 deletions(-) diff --git a/docs/package.json b/docs/package.json index 005e0dd38aa..8c16581e7b5 100644 --- a/docs/package.json +++ b/docs/package.json @@ -30,7 +30,7 @@ "@mui/lab": "5.0.0-alpha.160", "@mui/material": "5.15.4", "@mui/material-nextjs": "^5.15.4", - "@mui/monorepo": "https://github.com/mui/material-ui.git", + "@mui/monorepo": "github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2", "@mui/styles": "5.15.4", "@mui/toolpad": "workspace:*", "@mui/utils": "5.15.4", diff --git a/docs/src/components/landing/Hero.js b/docs/src/components/landing/Hero.js index 66fb5cbc89d..87810130308 100644 --- a/docs/src/components/landing/Hero.js +++ b/docs/src/components/landing/Hero.js @@ -92,14 +92,17 @@ function TypingAnimation({ wordIndex, setWordIndex }) { setLetterIndex(letterIndex + 1); }, LETTER_DELAY); } else { - timer = setTimeout(() => { - const nextIndex = (wordIndex + 1) % words.length; - setWordIndex(nextIndex); - setFullText(words[nextIndex]); - setText(''); - setLetterIndex(0); - count.current += 1; - }, 2 * FRAME_DELAY - (count.current ? LETTER_DELAY * fullText.length : 0)); + timer = setTimeout( + () => { + const nextIndex = (wordIndex + 1) % words.length; + setWordIndex(nextIndex); + setFullText(words[nextIndex]); + setText(''); + setLetterIndex(0); + count.current += 1; + }, + 2 * FRAME_DELAY - (count.current ? LETTER_DELAY * fullText.length : 0), + ); } return () => clearTimeout(timer); }, [letterIndex, wordIndex, fullText, text, setWordIndex]); diff --git a/package.json b/package.json index edfb09caa4f..0f469fc2904 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ }, "devDependencies": { "@argos-ci/core": "1.4.1", - "@mui/monorepo": "github:mui/material-ui", + "@mui/monorepo": "github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2", "@mui/x-charts": "6.18.7", "@next/eslint-plugin-next": "14.0.4", "@playwright/test": "1.40.1", @@ -69,8 +69,8 @@ "jsdom": "23.2.0", "lerna": "8.0.2", "markdownlint-cli2": "0.12.1", - "prettier": "2.8.8", - "pretty-quick": "3.1.3", + "prettier": "3.2.3", + "pretty-quick": "4.0.0", "react-inspector": "6.0.2", "recharts": "2.10.4", "regenerator-runtime": "0.14.1", diff --git a/packages/toolpad-app/package.json b/packages/toolpad-app/package.json index 6a014bbc2f3..d5d69063871 100644 --- a/packages/toolpad-app/package.json +++ b/packages/toolpad-app/package.json @@ -112,7 +112,7 @@ "perf-cascade": "3.0.3", "pg": "8.11.3", "piscina": "4.2.1", - "prettier": "2.8.8", + "prettier": "3.2.3", "pretty-bytes": "6.1.1", "react": "18.2.0", "react-dev-utils": "12.0.1", diff --git a/packages/toolpad-app/src/components/ColorTool.tsx b/packages/toolpad-app/src/components/ColorTool.tsx index 6d0b7b565fe..4a0e2a595ac 100644 --- a/packages/toolpad-app/src/components/ColorTool.tsx +++ b/packages/toolpad-app/src/components/ColorTool.tsx @@ -73,29 +73,28 @@ interface TooltipRadioProps extends RadioProps { inputProps?: RadioProps['inputProps']; } -const TooltipRadio = React.forwardRef(function TooltipRadio( - props, - ref, -) { - const { - 'aria-labelledby': ariaLabelledBy, - 'aria-label': ariaLabel, - inputProps, - ...other - } = props; +const TooltipRadio = React.forwardRef( + function TooltipRadio(props, ref) { + const { + 'aria-labelledby': ariaLabelledBy, + 'aria-label': ariaLabel, + inputProps, + ...other + } = props; - return ( - - ); -}); + return ( + + ); + }, +); export interface ColorToolProps { label?: string; diff --git a/packages/toolpad-app/src/theme.ts b/packages/toolpad-app/src/theme.ts index 899193769e6..a346e151376 100644 --- a/packages/toolpad-app/src/theme.ts +++ b/packages/toolpad-app/src/theme.ts @@ -287,7 +287,7 @@ export const getDesignTokens = (mode: 'light' | 'dark') => scrollMarginTop: 'calc(var(--MuiDocs-header-height) + 32px)', }, }, - } as ThemeOptions); + }) as ThemeOptions; export function getThemedComponents(theme: Theme): { components: Theme['components'] } { return { diff --git a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx index 7a8db613e31..ad0f5fee6f7 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/AppAuthorizationEditor.tsx @@ -78,7 +78,7 @@ export function AppAuthenticationEditor() { draft = appDom.setNodeNamespacedProp(draft, app, 'attributes', 'authentication', { ...app.attributes?.authentication, providers: (typeof providers === 'string' ? providers.split(',') : providers).map( - (provider) => ({ provider } as AuthProviderConfig), + (provider) => ({ provider }) as AuthProviderConfig, ), }); diff --git a/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/RenderPanel/OverlayGrid.tsx b/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/RenderPanel/OverlayGrid.tsx index dc796f82013..875b0be1196 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/RenderPanel/OverlayGrid.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/RenderPanel/OverlayGrid.tsx @@ -32,64 +32,63 @@ const StyledGridColumn = styled('div')(({ theme }) => ({ opacity: 0.2, })); -export const OverlayGrid = React.forwardRef(function OverlayGrid( - props, - forwardedRef, -) { - const gridRef = React.useRef(null); +export const OverlayGrid = React.forwardRef( + function OverlayGrid(props, forwardedRef) { + const gridRef = React.useRef(null); - const { dom } = useAppState(); - const { viewState, nodeId: pageNodeId } = usePageEditorState(); + const { dom } = useAppState(); + const { viewState, nodeId: pageNodeId } = usePageEditorState(); - const { nodes: nodesInfo } = viewState; + const { nodes: nodesInfo } = viewState; - const pageNode = nodesInfo[pageNodeId]; + const pageNode = nodesInfo[pageNodeId]; - const appTheme = React.useMemo(() => createToolpadAppTheme(dom), [dom]); + const appTheme = React.useMemo(() => createToolpadAppTheme(dom), [dom]); - React.useImperativeHandle( - forwardedRef, - () => { - const gridElement = gridRef.current; - invariant(gridElement, 'Overlay grid ref not bound'); + React.useImperativeHandle( + forwardedRef, + () => { + const gridElement = gridRef.current; + invariant(gridElement, 'Overlay grid ref not bound'); - let columnEdges: number[] = []; - const gridColumnContainers = Array.from(gridElement.children); - const gridColumnEdges = gridColumnContainers.map((container: Element) => { - const containerRect = container.firstElementChild?.getBoundingClientRect(); - return containerRect - ? [Math.round(containerRect.x), Math.round(containerRect.x + containerRect.width)] - : []; - }); - columnEdges = gridColumnEdges.flat(); + let columnEdges: number[] = []; + const gridColumnContainers = Array.from(gridElement.children); + const gridColumnEdges = gridColumnContainers.map((container: Element) => { + const containerRect = container.firstElementChild?.getBoundingClientRect(); + return containerRect + ? [Math.round(containerRect.x), Math.round(containerRect.x + containerRect.width)] + : []; + }); + columnEdges = gridColumnEdges.flat(); - return { - gridElement: gridRef.current, - getMinColumnWidth() { - return columnEdges[1] - columnEdges[0]; - }, - getLeftColumnEdges() { - return columnEdges.filter((column, index) => index % 2 === 0); - }, - getRightColumnEdges() { - return columnEdges.filter((column, index) => index % 2 === 1); - }, - }; - }, - [], - ); + return { + gridElement: gridRef.current, + getMinColumnWidth() { + return columnEdges[1] - columnEdges[0]; + }, + getLeftColumnEdges() { + return columnEdges.filter((column, index) => index % 2 === 0); + }, + getRightColumnEdges() { + return columnEdges.filter((column, index) => index % 2 === 1); + }, + }; + }, + [], + ); - const pageChildrenSlotRect = pageNode?.slots?.children?.rect; + const pageChildrenSlotRect = pageNode?.slots?.children?.rect; - return pageChildrenSlotRect ? ( - - - {[...Array(GRID_NUMBER_OF_COLUMNS)].map((column, index) => ( - - - - ))} - - - ) : null; -}); + return pageChildrenSlotRect ? ( + + + {[...Array(GRID_NUMBER_OF_COLUMNS)].map((column, index) => ( + + + + ))} + + + ) : null; + }, +); diff --git a/packages/toolpad-app/src/toolpad/index.html b/packages/toolpad-app/src/toolpad/index.html index 41f51b55163..e228a56ba8c 100644 --- a/packages/toolpad-app/src/toolpad/index.html +++ b/packages/toolpad-app/src/toolpad/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/toolpad-app/src/utils/prettier.ts b/packages/toolpad-app/src/utils/prettier.ts index 6fb7f0ccff7..13f1468744b 100644 --- a/packages/toolpad-app/src/utils/prettier.ts +++ b/packages/toolpad-app/src/utils/prettier.ts @@ -1,5 +1,5 @@ import prettier from 'prettier'; -import parserBabel from 'prettier/parser-babel.js'; +import parserBabel from 'prettier/parser-babel'; const DEFAULT_OPTIONS = { parser: 'babel-ts', @@ -32,7 +32,7 @@ export async function formatExpression( code: string, config?: prettier.Options | null, ): Promise { - const formatted = prettier.format(code, { + const formatted = await prettier.format(code, { ...config, ...DEFAULT_OPTIONS, semi: false, @@ -51,7 +51,7 @@ export async function tryFormatExpression( config?: prettier.Options, ): Promise { try { - return formatExpression(code, config); + return await formatExpression(code, config); } catch (err) { return code; } diff --git a/packages/toolpad-app/src/utils/types.ts b/packages/toolpad-app/src/utils/types.ts index f1dca7a8470..ee36a78725f 100644 --- a/packages/toolpad-app/src/utils/types.ts +++ b/packages/toolpad-app/src/utils/types.ts @@ -20,10 +20,10 @@ export type Awaitable = T | Promise | PromiseLike; export type Join = T extends [] ? '' : T extends [string | number | boolean | bigint] - ? `${T[0]}` - : T extends [string | number | boolean | bigint, ...infer U] - ? `${T[0]}${D}${Join}` - : string; + ? `${T[0]}` + : T extends [string | number | boolean | bigint, ...infer U] + ? `${T[0]}${D}${Join}` + : string; /** * @example @@ -34,10 +34,10 @@ export type Join = T extends [] export type Split = string extends S ? string[] : S extends '' - ? [] - : S extends `${infer T}${D}${infer U}` - ? [T, ...Split] - : [S]; + ? [] + : S extends `${infer T}${D}${infer U}` + ? [T, ...Split] + : [S]; /** * @example @@ -47,10 +47,10 @@ export type Split = string extends S export type CapitalizeAll = T extends [] ? [] : T extends [string, ...infer U] - ? U extends string[] - ? [Capitalize, ...CapitalizeAll] - : never - : never; + ? U extends string[] + ? [Capitalize, ...CapitalizeAll] + : never + : never; /** * @example @@ -61,10 +61,10 @@ export type CapitalizeAll = T extends [] export type CapitalizeTail = T extends [] ? [] : T extends [string, ...infer U] - ? U extends string[] - ? [T[0], ...CapitalizeAll] - : never - : never; + ? U extends string[] + ? [T[0], ...CapitalizeAll] + : never + : never; /** * sString template type that converts snake-case to camel-case diff --git a/packages/toolpad-core/src/types.ts b/packages/toolpad-core/src/types.ts index 30aaa2c38c5..05bb5f88a0a 100644 --- a/packages/toolpad-core/src/types.ts +++ b/packages/toolpad-core/src/types.ts @@ -239,18 +239,18 @@ export type JsonSchemaToTs = T extends { [K in keyof T['properties']]?: JsonSchemaToTs[K]>; } : T extends { type: 'array'; items?: JSONSchema7 } - ? T['items'] extends undefined - ? unknown[] - : JsonSchemaToTs>[] - : T extends { type: 'string' } - ? string - : T extends { type: 'number' | 'integer' } - ? number - : T extends { type: 'boolean' } - ? boolean - : T extends { type: 'null' } - ? null - : unknown; + ? T['items'] extends undefined + ? unknown[] + : JsonSchemaToTs>[] + : T extends { type: 'string' } + ? string + : T extends { type: 'number' | 'integer' } + ? number + : T extends { type: 'boolean' } + ? boolean + : T extends { type: 'null' } + ? null + : unknown; export type InferParameterType = T extends { type: 'object' | 'array'; diff --git a/packages/toolpad-utils/package.json b/packages/toolpad-utils/package.json index 6107fcff86d..9bbbeb7b6e3 100644 --- a/packages/toolpad-utils/package.json +++ b/packages/toolpad-utils/package.json @@ -53,7 +53,7 @@ }, "dependencies": { "invariant": "2.2.4", - "prettier": "2.8.8", + "prettier": "3.2.3", "react-is": "18.2.0", "title": "3.5.3", "yaml": "2.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f06bda32e2a..4a3e3360e39 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: 1.4.1 version: 1.4.1 '@mui/monorepo': - specifier: github:mui/material-ui - version: github.com/mui/material-ui/a8102f8a8739b5d935278e4a572b84e641a682ba + specifier: github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 + version: github.com/mui/material-ui/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 '@mui/x-charts': specifier: 6.18.7 version: 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0) @@ -148,11 +148,11 @@ importers: specifier: 0.12.1 version: 0.12.1 prettier: - specifier: 2.8.8 - version: 2.8.8 + specifier: 3.2.3 + version: 3.2.3 pretty-quick: - specifier: 3.1.3 - version: 3.1.3(prettier@2.8.8) + specifier: 4.0.0 + version: 4.0.0(prettier@3.2.3) react-inspector: specifier: 6.0.2 version: 6.0.2(react@18.2.0) @@ -194,7 +194,7 @@ importers: version: 3.0.0(date-fns-jalali@2.29.3-0) '@docsearch/react': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.22.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) + version: 3.5.2(@algolia/client-search@4.22.1)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) '@emotion/cache': specifier: 11.11.0 version: 11.11.0 @@ -220,8 +220,8 @@ importers: specifier: ^5.15.4 version: 5.15.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.4)(next@13.4.19)(react@18.2.0) '@mui/monorepo': - specifier: https://github.com/mui/material-ui.git - version: github.com/mui/material-ui/a8102f8a8739b5d935278e4a572b84e641a682ba + specifier: github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 + version: github.com/mui/material-ui/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 '@mui/styles': specifier: 5.15.4 version: 5.15.4(react@18.2.0) @@ -629,7 +629,7 @@ importers: version: 10.3.10 google-auth-library: specifier: '*' - version: 9.4.1 + version: 9.4.2 http-proxy-middleware: specifier: 2.0.6 version: 2.0.6(@types/express@4.17.21) @@ -682,8 +682,8 @@ importers: specifier: 4.2.1 version: 4.2.1 prettier: - specifier: 2.8.8 - version: 2.8.8 + specifier: 3.2.3 + version: 3.2.3 pretty-bytes: specifier: 6.1.1 version: 6.1.1 @@ -955,8 +955,8 @@ importers: specifier: 2.2.4 version: 2.2.4 prettier: - specifier: 2.8.8 - version: 2.8.8 + specifier: 3.2.3 + version: 3.2.3 react: specifier: ^18.0.0 version: 18.2.0 @@ -1022,47 +1022,47 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0)(search-insights@2.13.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0)(search-insights@2.13.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: false - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0): + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0): resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) - '@algolia/client-search': 4.22.0 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0) + '@algolia/client-search': 4.22.1 algoliasearch: 4.22.0 dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0): + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0): resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.22.0 + '@algolia/client-search': 4.22.1 algoliasearch: 4.22.0 dev: false @@ -1076,6 +1076,10 @@ packages: resolution: {integrity: sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA==} dev: false + /@algolia/cache-common@4.22.1: + resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} + dev: false + /@algolia/cache-in-memory@4.22.0: resolution: {integrity: sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA==} dependencies: @@ -1106,6 +1110,13 @@ packages: '@algolia/transporter': 4.22.0 dev: false + /@algolia/client-common@4.22.1: + resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + dependencies: + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + dev: false + /@algolia/client-personalization@4.22.0: resolution: {integrity: sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow==} dependencies: @@ -1122,10 +1133,22 @@ packages: '@algolia/transporter': 4.22.0 dev: false + /@algolia/client-search@4.22.1: + resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + dev: false + /@algolia/logger-common@4.22.0: resolution: {integrity: sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ==} dev: false + /@algolia/logger-common@4.22.1: + resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} + dev: false + /@algolia/logger-console@4.22.0: resolution: {integrity: sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ==} dependencies: @@ -1142,6 +1165,10 @@ packages: resolution: {integrity: sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ==} dev: false + /@algolia/requester-common@4.22.1: + resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} + dev: false + /@algolia/requester-node-http@4.22.0: resolution: {integrity: sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA==} dependencies: @@ -1156,6 +1183,14 @@ packages: '@algolia/requester-common': 4.22.0 dev: false + /@algolia/transporter@4.22.1: + resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + dependencies: + '@algolia/cache-common': 4.22.1 + '@algolia/logger-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -1590,7 +1625,7 @@ packages: resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} dev: false - /@docsearch/react@3.5.2(@algolia/client-search@4.22.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): + /@docsearch/react@3.5.2(@algolia/client-search@4.22.1)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -1607,8 +1642,8 @@ packages: search-insights: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.0)(algoliasearch@4.22.0) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.0) '@docsearch/css': 3.5.2 algoliasearch: 4.22.0 react: 18.2.0 @@ -2188,8 +2223,8 @@ packages: '@floating-ui/core': 1.5.3 '@floating-ui/utils': 0.2.1 - /@floating-ui/react-dom@2.0.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==} + /@floating-ui/react-dom@2.0.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -2415,7 +2450,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.8 - '@floating-ui/react-dom': 2.0.5(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.6(react-dom@18.2.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) '@popperjs/core': 2.11.8 @@ -2425,8 +2460,30 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@mui/core-downloads-tracker@5.15.4: - resolution: {integrity: sha512-0OZN9O6hAtBpx70mMNFOPaAIol/ytwZYPY+z7Rf9dK3+1Xlzwvj5/IeShJKvtp76S1qJyhPuvZg0+BGqQaUnUw==} + /@mui/base@5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4VptvYeLUYMJhZapWBkD50GmKfOc0XT381KJcTK3ncZYIl8MdBhpR6l8jOyeP5cixUPBJhstjrnmQEAHjCLriw==} + engines: {node: '>=12.0.0'} + 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 + dependencies: + '@babel/runtime': 7.23.8 + '@floating-ui/react-dom': 2.0.6(react-dom@18.2.0)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.48) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) + '@popperjs/core': 2.11.8 + '@types/react': 18.2.48 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /@mui/core-downloads-tracker@5.15.5: + resolution: {integrity: sha512-VhT8klyXy8GrWrARqLMoM6Nzz809Jc3Wn5wd7WOZfre2vFO1rBV1dBANAPBhBqpaQI0HCMRTWEYoSyOFgRnz4A==} /@mui/icons-material@5.15.4(@mui/material@5.15.4)(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-q/Yk7aokN8qGMpR7bwoDpBSeaNe6Bv7vaY9yHYodP37c64TM6ime05ueb/wgksOVszrKkNXC67E/XYbRWOoUFA==} @@ -2572,7 +2629,7 @@ packages: '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.4 + '@mui/core-downloads-tracker': 5.15.5 '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) @@ -2608,7 +2665,7 @@ packages: '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.4 + '@mui/core-downloads-tracker': 5.15.5 '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) @@ -2621,8 +2678,8 @@ packages: react-is: 18.2.0 react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) - /@mui/private-theming@5.15.4(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-9N5myIMEEQTM5WYWPGvvYADzjFo12LgJ7S+2iTZkBNOcJpUxQYM1tvYjkHCDV+t1ocMOEgjR2EfJ9Dus30dBlg==} + /@mui/private-theming@5.15.5(@types/react@18.2.48)(react@18.2.0): + resolution: {integrity: sha512-HU1KCyGNcJFsUamTbOM539ZDZJNI/XU7sZFdsN29glktUf+T6hNvDuO2ISinBiLTZy7Ab3R6DSSoYXRrLc4uwQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2632,13 +2689,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.8 - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react': 18.2.48 prop-types: 15.8.1 react: 18.2.0 - /@mui/styled-engine@5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-vtrZUXG5XI8CNiNLcxjIirW4dEbOloR+ikfm6ePBo7jXpJdpXjVzBWetrfE+5eI0cHkKWlTptnJ2voKV8pBRfw==} + /@mui/styled-engine@5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-xoMUd8h270thNL7ZsOzmlluIAMsQg/HT7SCdRjPBVle+XHgTKaiWiRy1ekDOsrrF0rhjME3T7xeeUq2G269UUw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 @@ -2670,7 +2727,7 @@ packages: dependencies: '@babel/runtime': 7.23.8 '@emotion/hash': 0.9.1 - '@mui/private-theming': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/private-theming': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 @@ -2707,8 +2764,8 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/private-theming': 5.15.4(@types/react@18.2.48)(react@18.2.0) - '@mui/styled-engine': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/private-theming': 5.15.5(@types/react@18.2.48)(react@18.2.0) + '@mui/styled-engine': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) '@types/react': 18.2.48 @@ -2737,8 +2794,8 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/private-theming': 5.15.4(@types/react@18.2.48)(react@18.2.0) - '@mui/styled-engine': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/private-theming': 5.15.5(@types/react@18.2.48)(react@18.2.0) + '@mui/styled-engine': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 @@ -2773,6 +2830,23 @@ packages: react: 18.2.0 react-is: 18.2.0 + /@mui/utils@5.15.5(@types/react@18.2.48)(react@18.2.0): + resolution: {integrity: sha512-jEywgaMGZWPSlVFO7ZZAyXxNeLmq5XBp5At9Ne/sGohRJdesUcdxvyi8TP3odJxwQuL5L6PJV+JQ4DyIDM849A==} + 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 + dependencies: + '@babel/runtime': 7.23.8 + '@types/prop-types': 15.7.11 + '@types/react': 18.2.48 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + /@mui/x-charts@6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-s7a24H0vEnOGjLv4DNHsjLAScu6rLHOLDUV5LFe22Kv0//Xl4r8bjmX7BXzy3ma3z9Uy2gw5Ey9ASpi0sQKjeg==} engines: {node: '>=14.0.0'} @@ -2792,7 +2866,7 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@react-spring/rafz': 9.7.3 @@ -2825,7 +2899,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.8 - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@react-spring/rafz': 9.7.3 @@ -2975,7 +3049,7 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) @@ -3031,7 +3105,7 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) @@ -3073,7 +3147,7 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) @@ -3798,7 +3872,7 @@ packages: path-to-regexp: 6.2.1 please-upgrade-node: 3.2.0 promise.allsettled: 1.0.7 - raw-body: 2.5.1 + raw-body: 2.5.2 tsscmp: 1.0.6 transitivePeerDependencies: - bufferutil @@ -5414,7 +5488,7 @@ packages: /axios@1.6.5(debug@4.3.4): resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} dependencies: - follow-redirects: 1.15.4(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -5801,7 +5875,7 @@ packages: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + set-function-length: 1.2.0 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -5863,14 +5937,6 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chalk@4.1.0: resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} engines: {node: '>=10'} @@ -7684,21 +7750,6 @@ packages: strip-eof: 1.0.0 dev: false - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - /execa@5.0.0: resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} engines: {node: '>=10'} @@ -7727,7 +7778,6 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: false /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} @@ -7977,8 +8027,8 @@ packages: /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - /follow-redirects@1.15.4(debug@4.3.4): - resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} + /follow-redirects@1.15.5(debug@4.3.4): + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8249,13 +8299,6 @@ packages: engines: {node: '>=4'} dev: false - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - /get-stream@6.0.0: resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} engines: {node: '>=10'} @@ -8499,8 +8542,8 @@ packages: - supports-color dev: true - /google-auth-library@9.4.1: - resolution: {integrity: sha512-Chs7cuzDuav8W/BXOoRgSXw4u0zxYtuqAHETDR5Q6dG1RwNwz7NUKjsDDHAsBV3KkiiJBtJqjbzy1XU1L41w1g==} + /google-auth-library@9.4.2: + resolution: {integrity: sha512-rTLO4gjhqqo3WvYKL5IdtlCvRqeQ4hxUx/p4lObobY2xotFW3bCQC+Qf1N51CYOfiqfMecdMwW9RIo7dFWYjqw==} engines: {node: '>=14'} dependencies: base64-js: 1.5.1 @@ -8519,7 +8562,7 @@ packages: dependencies: extend: 3.0.2 gaxios: 6.1.1 - google-auth-library: 9.4.1 + google-auth-library: 9.4.2 qs: 6.11.2 url-template: 2.0.8 uuid: 9.0.1 @@ -8807,7 +8850,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.4(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -8844,11 +8887,6 @@ packages: transitivePeerDependencies: - supports-color - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true - /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -10569,17 +10607,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /multimatch@4.0.0: - resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} - engines: {node: '>=8'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - /multimatch@5.0.0: resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} engines: {node: '>=10'} @@ -11739,6 +11766,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + dev: true + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -11955,9 +11987,9 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + /prettier@3.2.3: + resolution: {integrity: sha512-QNhUTBq+mqt1oH1dTfY3phOKNhcDdJkfttHI6u0kj7M2+c+7fmNKlgh2GhnHiqMcbxJ+a0j2igz/2jfl9QKLuw==} + engines: {node: '>=14'} hasBin: true /pretty-bytes@6.1.1: @@ -11986,20 +12018,21 @@ packages: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false - /pretty-quick@3.1.3(prettier@2.8.8): - resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==} - engines: {node: '>=10.13'} + /pretty-quick@4.0.0(prettier@3.2.3): + resolution: {integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==} + engines: {node: '>=14'} hasBin: true peerDependencies: - prettier: '>=2.0.0' + prettier: ^3.0.0 dependencies: - chalk: 3.0.0 - execa: 4.1.0 - find-up: 4.1.0 + execa: 5.1.1 + find-up: 5.0.0 ignore: 5.3.0 mri: 1.2.0 - multimatch: 4.0.0 - prettier: 2.8.8 + picocolors: 1.0.0 + picomatch: 3.0.1 + prettier: 3.2.3 + tslib: 2.6.2 dev: true /prismjs@1.29.0: @@ -12207,6 +12240,15 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + /raw-loader@4.0.2(webpack@5.89.0): resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} @@ -12971,11 +13013,12 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.1 + function-bind: 1.1.2 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 @@ -15045,15 +15088,15 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - github.com/mui/material-ui/a8102f8a8739b5d935278e4a572b84e641a682ba: - resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/a8102f8a8739b5d935278e4a572b84e641a682ba} + github.com/mui/material-ui/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2: + resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2} name: '@mui/monorepo' - version: 5.15.4 + version: 5.15.5 requiresBuild: true dependencies: '@googleapis/sheets': 5.0.5 '@slack/bolt': 3.17.1 - google-auth-library: 9.4.1 + google-auth-library: 9.4.2 transitivePeerDependencies: - bufferutil - debug diff --git a/prettier.config.js b/prettier.config.js index 2622601bc7a..e7f26146b08 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -1,3 +1,10 @@ const baseline = require('@mui/monorepo/prettier.config'); +baseline.overrides.push({ + files: ['**/*.json'], + options: { + trailingComma: 'none', + }, +}); + module.exports = baseline; diff --git a/renovate.json b/renovate.json index bf268ccf24b..cd38b01914c 100644 --- a/renovate.json +++ b/renovate.json @@ -62,11 +62,6 @@ "matchPackageNames": ["core-js"], "allowedVersions": "< 2.0.0" }, - { - "groupName": "prettier", - "matchPackageNames": ["prettier", "pretty-quick"], - "description": "prettier made breaking changes in v3, pretty-quick needs to catch up before we can upgrade. https://github.com/azz/pretty-quick/issues/164" - }, { "groupName": "next", "matchPackageNames": ["next"], diff --git a/scripts/docs/utils.ts b/scripts/docs/utils.ts index 3b278e29c62..9a80dde2c12 100644 --- a/scripts/docs/utils.ts +++ b/scripts/docs/utils.ts @@ -24,7 +24,7 @@ export async function writePrettifiedFile( ); } - await fs.writeFile(filename, prettier.format(data, { ...prettierConfig, filepath: filename }), { - encoding: 'utf8', - }); + const content = await prettier.format(data, { ...prettierConfig, filepath: filename }); + + await fs.writeFile(filename, content, { encoding: 'utf8' }); } From 68c27a29e02b0d773ce532940a2a535392bcfa5b Mon Sep 17 00:00:00 2001 From: Jan Potoms <2109932+Janpot@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:11:20 +0100 Subject: [PATCH 21/35] [code-infra] Add monorepo update script (#3091) --- package.json | 1 + scripts/updateMonorepo.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 scripts/updateMonorepo.ts diff --git a/package.json b/package.json index 0f469fc2904..5f5fb47cbc2 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "check-types": "lerna run check-types", "toolpad": "node --enable-source-maps packages/toolpad-app/cli.mjs", "jsonSchemas": "tsx ./scripts/docs/generateJsonSchemas.ts", + "update-monorepo": "tsx ./scripts/updateMonorepo.ts", "check-changes": "git add -A && git diff --exit-code --staged", "test:rest:start": "tsx ./scripts/restTestServer.ts" }, diff --git a/scripts/updateMonorepo.ts b/scripts/updateMonorepo.ts new file mode 100644 index 00000000000..90debe5aed9 --- /dev/null +++ b/scripts/updateMonorepo.ts @@ -0,0 +1,32 @@ +import * as execa from 'execa'; + +const $ = execa.$({ stdio: 'inherit' }); + +async function updateToLatest(dependency: string, repo: string, branch: string = 'master') { + const url = new URL(`https://api.github.com/repos/${repo}/commits`); + url.searchParams.set('sha', branch); + url.searchParams.set('per_page', '1'); + const res = await fetch(url); + if (!res.ok) { + throw new Error(`HTTP ${res.status} while fetching "${url}"`); + } + const commits = await res.json(); + + if (commits.length <= 0) { + throw new Error(`No commits found for "${branch}"`); + } + + const latestCommit: string = commits[0].sha; + + // eslint-disable-next-line no-console + console.log(`Updating "${repo}" to latest commit ${latestCommit}...`); + + await $`pnpm update -r ${dependency}@github:mui/material-ui#${latestCommit}`; + + // eslint-disable-next-line no-console + console.log(`Deduping...`); + + await $({ stdio: 'inherit' })`pnpm dedupe`; +} + +updateToLatest('@mui/monorepo', 'mui/material-ui'); From 54b3456f388f60a987027616a036abb72b6b26fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 06:59:58 -0800 Subject: [PATCH 22/35] Bump MUI Core (#3089) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package.json | 12 +- examples/react-pages/package.json | 2 +- package.json | 2 +- packages/toolpad-app/package.json | 8 +- packages/toolpad-components/package.json | 4 +- packages/toolpad-core/package.json | 2 +- pnpm-lock.yaml | 287 ++++++++++------------- test/package.json | 2 +- 8 files changed, 140 insertions(+), 179 deletions(-) diff --git a/docs/package.json b/docs/package.json index 8c16581e7b5..c3f41ed4ec8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -27,13 +27,13 @@ "@emotion/server": "11.11.0", "@emotion/styled": "11.11.0", "@mui/icons-material": "5.15.4", - "@mui/lab": "5.0.0-alpha.160", - "@mui/material": "5.15.4", - "@mui/material-nextjs": "^5.15.4", - "@mui/monorepo": "github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2", - "@mui/styles": "5.15.4", + "@mui/lab": "5.0.0-alpha.161", + "@mui/material": "5.15.5", + "@mui/material-nextjs": "^5.15.5", + "@mui/monorepo": "github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2", + "@mui/styles": "5.15.5", "@mui/toolpad": "workspace:*", - "@mui/utils": "5.15.4", + "@mui/utils": "5.15.5", "@mui/x-data-grid-pro": "6.18.7", "@trendmicro/react-interpolate": "0.5.5", "@types/lodash": "4.14.202", diff --git a/examples/react-pages/package.json b/examples/react-pages/package.json index c6b66588b6a..0b8fb7348f4 100644 --- a/examples/react-pages/package.json +++ b/examples/react-pages/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/material": "5.15.4", + "@mui/material": "5.15.5", "@mui/toolpad": "0.1.45", "@mui/x-data-grid": "6.18.7", "@tanstack/react-query": "5.17.10" diff --git a/package.json b/package.json index 5f5fb47cbc2..3cceb0ead08 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@argos-ci/core": "1.4.1", - "@mui/monorepo": "github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2", + "@mui/monorepo": "github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2", "@mui/x-charts": "6.18.7", "@next/eslint-plugin-next": "14.0.4", "@playwright/test": "1.40.1", diff --git a/packages/toolpad-app/package.json b/packages/toolpad-app/package.json index d5d69063871..c72ae6ce44d 100644 --- a/packages/toolpad-app/package.json +++ b/packages/toolpad-app/package.json @@ -54,14 +54,14 @@ "@googleapis/drive": "8.5.0", "@googleapis/sheets": "5.0.5", "@mui/icons-material": "5.15.4", - "@mui/lab": "5.0.0-alpha.160", - "@mui/material": "5.15.4", - "@mui/system": "5.15.4", + "@mui/lab": "5.0.0-alpha.161", + "@mui/material": "5.15.5", + "@mui/system": "5.15.5", "@mui/toolpad-components": "workspace:*", "@mui/toolpad-core": "workspace:*", "@mui/toolpad-utils": "workspace:*", "@mui/types": "7.2.13", - "@mui/utils": "5.15.4", + "@mui/utils": "5.15.5", "@mui/x-charts": "6.18.7", "@mui/x-data-grid": "6.18.7", "@mui/x-data-grid-pro": "6.18.7", diff --git a/packages/toolpad-components/package.json b/packages/toolpad-components/package.json index 5a8f1e0d7cb..2c8cb54f348 100644 --- a/packages/toolpad-components/package.json +++ b/packages/toolpad-components/package.json @@ -39,8 +39,8 @@ }, "dependencies": { "@mui/icons-material": "5.15.4", - "@mui/lab": "5.0.0-alpha.160", - "@mui/material": "5.15.4", + "@mui/lab": "5.0.0-alpha.161", + "@mui/material": "5.15.5", "@mui/toolpad-core": "workspace:*", "@mui/toolpad-utils": "workspace:*", "@mui/x-charts": "6.18.7", diff --git a/packages/toolpad-core/package.json b/packages/toolpad-core/package.json index 96a3968c679..4cfa55b2bc8 100644 --- a/packages/toolpad-core/package.json +++ b/packages/toolpad-core/package.json @@ -40,7 +40,7 @@ "url": "https://github.com/mui/mui-toolpad/issues" }, "dependencies": { - "@mui/material": "5.15.4", + "@mui/material": "5.15.5", "@mui/toolpad-utils": "workspace:*", "@tanstack/react-query": "5.17.10", "@types/json-schema": "7.0.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4a3e3360e39..150853c9da9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,11 +55,11 @@ importers: specifier: 1.4.1 version: 1.4.1 '@mui/monorepo': - specifier: github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 - version: github.com/mui/material-ui/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 + specifier: github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 + version: github.com/mui/material-ui/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 '@mui/x-charts': specifier: 6.18.7 - version: 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0) '@next/eslint-plugin-next': specifier: 14.0.4 version: 14.0.4 @@ -209,31 +209,31 @@ importers: version: 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/icons-material': specifier: 5.15.4 - version: 5.15.4(@mui/material@5.15.4)(react@18.2.0) + version: 5.15.4(@mui/material@5.15.5)(react@18.2.0) '@mui/lab': - specifier: 5.0.0-alpha.160 - version: 5.0.0-alpha.160(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.0.0-alpha.161 + version: 5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(react-dom@18.2.0)(react@18.2.0) '@mui/material': - specifier: 5.15.4 - version: 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@mui/material-nextjs': - specifier: ^5.15.4 - version: 5.15.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.4)(next@13.4.19)(react@18.2.0) + specifier: ^5.15.5 + version: 5.15.5(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.5)(next@13.4.19)(react@18.2.0) '@mui/monorepo': - specifier: github:mui/material-ui#85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 - version: github.com/mui/material-ui/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2 + specifier: github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 + version: github.com/mui/material-ui/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 '@mui/styles': - specifier: 5.15.4 - version: 5.15.4(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(react@18.2.0) '@mui/toolpad': specifier: workspace:* version: link:../packages/toolpad-app '@mui/utils': - specifier: 5.15.4 - version: 5.15.4(@types/react@18.2.48)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@types/react@18.2.48)(react@18.2.0) '@mui/x-data-grid-pro': specifier: 6.18.7 - version: 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0) '@trendmicro/react-interpolate': specifier: 0.5.5 version: 0.5.5(react@18.2.0) @@ -506,16 +506,16 @@ importers: version: 5.0.5 '@mui/icons-material': specifier: 5.15.4 - version: 5.15.4(@mui/material@5.15.4)(@types/react@18.2.48)(react@18.2.0) + version: 5.15.4(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0) '@mui/lab': - specifier: 5.0.0-alpha.160 - version: 5.0.0-alpha.160(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.0.0-alpha.161 + version: 5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': - specifier: 5.15.4 - version: 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/system': - specifier: 5.15.4 - version: 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/toolpad-components': specifier: workspace:* version: link:../toolpad-components @@ -529,26 +529,26 @@ importers: specifier: 7.2.13 version: 7.2.13(@types/react@18.2.48) '@mui/utils': - specifier: 5.15.4 - version: 5.15.4(@types/react@18.2.48)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@types/react@18.2.48)(react@18.2.0) '@mui/x-charts': specifier: 6.18.7 - version: 6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/x-data-grid': specifier: 6.18.7 - version: 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/x-data-grid-pro': specifier: 6.18.7 - version: 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: 6.19.0 - version: 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers-pro': specifier: 6.19.0 - version: 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mui/x-tree-view': specifier: 6.17.0 - version: 6.17.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 6.17.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': specifier: 5.17.10 version: 5.17.10(react@18.2.0) @@ -843,13 +843,13 @@ importers: dependencies: '@mui/icons-material': specifier: 5.15.4 - version: 5.15.4(@mui/material@5.15.4)(@types/react@18.2.48)(react@18.2.0) + version: 5.15.4(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0) '@mui/lab': - specifier: 5.0.0-alpha.160 - version: 5.0.0-alpha.160(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.0.0-alpha.161 + version: 5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/material': - specifier: 5.15.4 - version: 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/toolpad-core': specifier: workspace:* version: link:../toolpad-core @@ -858,13 +858,13 @@ importers: version: link:../toolpad-utils '@mui/x-charts': specifier: 6.18.7 - version: 6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/x-data-grid-pro': specifier: 6.18.7 - version: 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/x-date-pickers': specifier: 6.19.0 - version: 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + version: 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mui/x-license-pro': specifier: 6.10.2 version: 6.10.2(@types/react@18.2.48)(react@18.2.0) @@ -900,8 +900,8 @@ importers: packages/toolpad-core: dependencies: '@mui/material': - specifier: 5.15.4 - version: 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/toolpad-utils': specifier: workspace:* version: link:../toolpad-utils @@ -992,8 +992,8 @@ importers: test: devDependencies: '@mui/material': - specifier: 5.15.4 - version: 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@mui/toolpad': specifier: workspace:* version: link:../packages/toolpad-app @@ -2438,28 +2438,6 @@ packages: call-bind: 1.0.5 dev: false - /@mui/base@5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+uNbP3OHJuZVI00WyMg7xfLZotaEY7LgvYXDfONVJbrS+K9wyjCIPNfjy8r9XJn4fbHo/5ibiZqjWnU9LMNv+A==} - engines: {node: '>=12.0.0'} - 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 - dependencies: - '@babel/runtime': 7.23.8 - '@floating-ui/react-dom': 2.0.6(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) - '@popperjs/core': 2.11.8 - '@types/react': 18.2.48 - clsx: 2.1.0 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - /@mui/base@5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-4VptvYeLUYMJhZapWBkD50GmKfOc0XT381KJcTK3ncZYIl8MdBhpR6l8jOyeP5cixUPBJhstjrnmQEAHjCLriw==} engines: {node: '>=12.0.0'} @@ -2485,7 +2463,7 @@ packages: /@mui/core-downloads-tracker@5.15.5: resolution: {integrity: sha512-VhT8klyXy8GrWrARqLMoM6Nzz809Jc3Wn5wd7WOZfre2vFO1rBV1dBANAPBhBqpaQI0HCMRTWEYoSyOFgRnz4A==} - /@mui/icons-material@5.15.4(@mui/material@5.15.4)(@types/react@18.2.48)(react@18.2.0): + /@mui/icons-material@5.15.4(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-q/Yk7aokN8qGMpR7bwoDpBSeaNe6Bv7vaY9yHYodP37c64TM6ime05ueb/wgksOVszrKkNXC67E/XYbRWOoUFA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2497,12 +2475,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.8 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.48 react: 18.2.0 dev: false - /@mui/icons-material@5.15.4(@mui/material@5.15.4)(react@18.2.0): + /@mui/icons-material@5.15.4(@mui/material@5.15.5)(react@18.2.0): resolution: {integrity: sha512-q/Yk7aokN8qGMpR7bwoDpBSeaNe6Bv7vaY9yHYodP37c64TM6ime05ueb/wgksOVszrKkNXC67E/XYbRWOoUFA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2514,17 +2492,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.8 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@mui/lab@5.0.0-alpha.160(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hMCOyjfpCHrb/ELs45baCHXICaZf3ygKY0R/phBKxxCxAX6V6Y3O9hxu2fS/Uw3LflZqUuv9TFkwVEWzq3OUkQ==} + /@mui/lab@5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dLWWZrJAi44av+iiqEHpZHfPhZ4DM42ItS31yqBwboroawumG2GUyYvHVTyEFXM1Zr8+kufiZ9t28rqHXVf5+w==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material': '>=5.10.11' + '@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 @@ -2539,11 +2517,11 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react': 18.2.48 clsx: 2.1.0 prop-types: 15.8.1 @@ -2551,13 +2529,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/lab@5.0.0-alpha.160(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hMCOyjfpCHrb/ELs45baCHXICaZf3ygKY0R/phBKxxCxAX6V6Y3O9hxu2fS/Uw3LflZqUuv9TFkwVEWzq3OUkQ==} + /@mui/lab@5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dLWWZrJAi44av+iiqEHpZHfPhZ4DM42ItS31yqBwboroawumG2GUyYvHVTyEFXM1Zr8+kufiZ9t28rqHXVf5+w==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@mui/material': '>=5.10.11' + '@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 @@ -2572,19 +2550,19 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@mui/material-nextjs@5.15.4(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.4)(next@13.4.19)(react@18.2.0): - resolution: {integrity: sha512-KhnCThgtneJJFtyX+HM3XF40j6vBSD0BqArHSNr5JMiI/BocepsruyZtA+1xrunzzAQZ7rO4MYm1nHtKhlM5vQ==} + /@mui/material-nextjs@5.15.5(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.5)(next@13.4.19)(react@18.2.0): + resolution: {integrity: sha512-YNgqCB4Agz37jf1CBuktvQifKjXfcBtrM4BGaYPqbg8mDmvzXwMMYlSTHdJhzE4ORKzImiCpHV5MSJHpHVMVRA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/cache': ^11.11.0 @@ -2603,13 +2581,13 @@ packages: dependencies: '@emotion/cache': 11.11.0 '@emotion/server': 11.11.0 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) next: 13.4.19(@babel/core@7.23.7)(babel-plugin-macros@3.1.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@mui/material@5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-T/LGRAC+M0c+D3+y67eHwIN5bSje0TxbcJCWR0esNvU11T0QwrX3jedXItPNBwMupF2F5VWCDHBVLlFnN3+ABA==} + /@mui/material@5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2KfA39f/UWeQl0O22UJs3x1nG3chYlyu9wnux5vTnxUTLzkgYIzQIHaH+ZOGpv5JiZBMKktAPNfhqyhSaQ49qQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2628,11 +2606,11 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/core-downloads-tracker': 5.15.5 - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react': 18.2.48 '@types/react-transition-group': 4.4.10 clsx: 2.1.0 @@ -2644,8 +2622,8 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /@mui/material@5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-T/LGRAC+M0c+D3+y67eHwIN5bSje0TxbcJCWR0esNvU11T0QwrX3jedXItPNBwMupF2F5VWCDHBVLlFnN3+ABA==} + /@mui/material@5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2KfA39f/UWeQl0O22UJs3x1nG3chYlyu9wnux5vTnxUTLzkgYIzQIHaH+ZOGpv5JiZBMKktAPNfhqyhSaQ49qQ==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2664,11 +2642,11 @@ packages: '@babel/runtime': 7.23.8 '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) - '@mui/base': 5.0.0-beta.31(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/core-downloads-tracker': 5.15.5 - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 csstype: 3.1.3 @@ -2715,8 +2693,8 @@ packages: prop-types: 15.8.1 react: 18.2.0 - /@mui/styles@5.15.4(react@18.2.0): - resolution: {integrity: sha512-cbeopHIq559GHQe4EusyI0GOYZq6aj8IAum8d8SKA5AoerLXTpYNabREFdP0melLiX6l0e6AHuTnTv8Fg2lTgQ==} + /@mui/styles@5.15.5(react@18.2.0): + resolution: {integrity: sha512-oKhGfhIf5lYxWeT6LWodHCyV834cUnU/xUp2LAevwT6Jay2U0q1H8RVUzPBuSyp/U+7ZZnxZ+NQfyHqNpQAJqg==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -2729,7 +2707,7 @@ packages: '@emotion/hash': 0.9.1 '@mui/private-theming': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 csstype: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -2745,8 +2723,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-KCwkHajGBXPs2TK1HJjIyab4NDk0cZoBDYN/TTlXVo1qBAmCjY0vjqrlsjeoG+wrwwcezXMLs/e6OGP66fPCog==} + /@mui/system@5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0): + resolution: {integrity: sha512-DMv2vGjUKaDt/m0RlzvLjpKiS5V0LoBhiMUHf5pWdj6uoNlN4FuKUe4pFeYmQMIO5DnVZKybmpPepfkdfEH+Og==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2767,7 +2745,7 @@ packages: '@mui/private-theming': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@mui/styled-engine': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react': 18.2.48 clsx: 2.1.0 csstype: 3.1.3 @@ -2775,8 +2753,8 @@ packages: react: 18.2.0 dev: false - /@mui/system@5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-KCwkHajGBXPs2TK1HJjIyab4NDk0cZoBDYN/TTlXVo1qBAmCjY0vjqrlsjeoG+wrwwcezXMLs/e6OGP66fPCog==} + /@mui/system@5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-DMv2vGjUKaDt/m0RlzvLjpKiS5V0LoBhiMUHf5pWdj6uoNlN4FuKUe4pFeYmQMIO5DnVZKybmpPepfkdfEH+Og==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2797,7 +2775,7 @@ packages: '@mui/private-theming': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@mui/styled-engine': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@mui/types': 7.2.13(@types/react@18.2.48) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 csstype: 3.1.3 prop-types: 15.8.1 @@ -2813,23 +2791,6 @@ packages: dependencies: '@types/react': 18.2.48 - /@mui/utils@5.15.4(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-E2wLQGBcs3VR52CpMRjk46cGscC4cbf3Q2uyHNaAeL36yTTm+aVNbtsTCazXtjOP4BDd8lu6VtlTpVC8Rtl4mg==} - 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 - dependencies: - '@babel/runtime': 7.23.8 - '@types/prop-types': 15.7.11 - '@types/react': 18.2.48 - prop-types: 15.8.1 - react: 18.2.0 - react-is: 18.2.0 - /@mui/utils@5.15.5(@types/react@18.2.48)(react@18.2.0): resolution: {integrity: sha512-jEywgaMGZWPSlVFO7ZZAyXxNeLmq5XBp5At9Ne/sGohRJdesUcdxvyi8TP3odJxwQuL5L6PJV+JQ4DyIDM849A==} engines: {node: '>=12.0.0'} @@ -2847,7 +2808,7 @@ packages: react: 18.2.0 react-is: 18.2.0 - /@mui/x-charts@6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-charts@6.18.7(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-s7a24H0vEnOGjLv4DNHsjLAScu6rLHOLDUV5LFe22Kv0//Xl4r8bjmX7BXzy3ma3z9Uy2gw5Ey9ASpi0sQKjeg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2867,8 +2828,8 @@ packages: '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) '@react-spring/rafz': 9.7.3 '@react-spring/web': 9.7.3(react-dom@18.2.0)(react@18.2.0) clsx: 2.1.0 @@ -2882,7 +2843,7 @@ packages: - '@types/react' dev: false - /@mui/x-charts@6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-charts@6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-s7a24H0vEnOGjLv4DNHsjLAScu6rLHOLDUV5LFe22Kv0//Xl4r8bjmX7BXzy3ma3z9Uy2gw5Ey9ASpi0sQKjeg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2900,8 +2861,8 @@ packages: dependencies: '@babel/runtime': 7.23.8 '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) '@react-spring/rafz': 9.7.3 '@react-spring/web': 9.7.3(react-dom@18.2.0)(react@18.2.0) clsx: 2.1.0 @@ -2915,7 +2876,7 @@ packages: - '@types/react' dev: true - /@mui/x-data-grid-pro@6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-data-grid-pro@6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NuL3o7sHmbx85mYRMW5UG8E3I3ogBtLp1xPBzpNrsrkbzpH6Ec45OzGzu1y9NljC2GfNpdbZhKirYLqFkQt7+A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2925,10 +2886,10 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.23.8 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) - '@mui/x-data-grid': 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) + '@mui/x-data-grid': 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@mui/x-license-pro': 6.10.2(@types/react@18.2.48)(react@18.2.0) '@types/format-util': 1.0.4 clsx: 2.1.0 @@ -2940,7 +2901,7 @@ packages: - '@types/react' dev: false - /@mui/x-data-grid-pro@6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-data-grid-pro@6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NuL3o7sHmbx85mYRMW5UG8E3I3ogBtLp1xPBzpNrsrkbzpH6Ec45OzGzu1y9NljC2GfNpdbZhKirYLqFkQt7+A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2950,10 +2911,10 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.23.8 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) - '@mui/x-data-grid': 6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) + '@mui/x-data-grid': 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0) '@mui/x-license-pro': 6.10.2(@types/react@18.2.48)(react@18.2.0) '@types/format-util': 1.0.4 clsx: 2.1.0 @@ -2965,7 +2926,7 @@ packages: - '@types/react' dev: false - /@mui/x-data-grid@6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-data-grid@6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-K1A3pMUPxI4/Mt5A4vrK45fBBQK5rZvBVqRMrB5n8zX++Bj+WLWKvLTtfCmlriUtzuadr/Hl7Z+FDRXUJAx6qg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2975,9 +2936,9 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.23.8 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -2987,7 +2948,7 @@ packages: - '@types/react' dev: false - /@mui/x-data-grid@6.18.7(@mui/material@5.15.4)(@mui/system@5.15.4)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-data-grid@6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-K1A3pMUPxI4/Mt5A4vrK45fBBQK5rZvBVqRMrB5n8zX++Bj+WLWKvLTtfCmlriUtzuadr/Hl7Z+FDRXUJAx6qg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2997,9 +2958,9 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.23.8 - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -3009,7 +2970,7 @@ packages: - '@types/react' dev: false - /@mui/x-date-pickers-pro@6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-date-pickers-pro@6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+wOvgROI1MkdF4H9XJ7hRpee0i+OvY+JW/fytGTJeAZy/VHBCdF8IMBhwrE5NctR369LjDwtNykIxRg0yIgwWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3050,10 +3011,10 @@ packages: '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) - '@mui/x-date-pickers': 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) + '@mui/x-date-pickers': 6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mui/x-license-pro': 6.10.2(@types/react@18.2.48)(react@18.2.0) clsx: 2.1.0 dayjs: 1.11.10 @@ -3065,7 +3026,7 @@ packages: - '@types/react' dev: false - /@mui/x-date-pickers@6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-date-pickers@6.19.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/GccT+iFJTKjI6b9b0MWojyRKnizL/VYYAfPnR1q0wSVVXjYv7a1NK0uQlan4JbnovqoQCNVeTOCy/0bUJyD2Q==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3106,9 +3067,9 @@ packages: '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 dayjs: 1.11.10 @@ -3127,13 +3088,13 @@ packages: react: ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.23.8 - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) react: 18.2.0 transitivePeerDependencies: - '@types/react' dev: false - /@mui/x-tree-view@6.17.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.4)(@mui/system@5.15.4)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): + /@mui/x-tree-view@6.17.0(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@mui/system@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-09dc2D+Rjg2z8KOaxbUXyPi0aw7fm2jurEtV8Xw48xJ00joLWd5QJm1/v4CarEvaiyhTQzHImNqdgeJW8ZQB6g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -3148,9 +3109,9 @@ packages: '@emotion/react': 11.11.3(@types/react@18.2.48)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/base': 5.0.0-beta.32(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.4(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) - '@mui/utils': 5.15.4(@types/react@18.2.48)(react@18.2.0) + '@mui/material': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.5(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.48)(react@18.2.0) + '@mui/utils': 5.15.5(@types/react@18.2.48)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 prop-types: 15.8.1 @@ -15088,8 +15049,8 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - github.com/mui/material-ui/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2: - resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/85b24e9ada2bdf4c041d9d8271a17e84a1a11bc2} + github.com/mui/material-ui/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2: + resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2} name: '@mui/monorepo' version: 5.15.5 requiresBuild: true diff --git a/test/package.json b/test/package.json index d0d4fc8c436..8c16e4edd2a 100644 --- a/test/package.json +++ b/test/package.json @@ -2,7 +2,7 @@ "name": "@mui/toolpad-tests", "private": true, "devDependencies": { - "@mui/material": "5.15.4", + "@mui/material": "5.15.5", "@mui/toolpad": "workspace:*", "@mui/toolpad-utils": "workspace:*", "express": "4.18.2", From aa370d0389cde3583842954392439677b5df67e8 Mon Sep 17 00:00:00 2001 From: Jan Potoms <2109932+Janpot@users.noreply.github.com> Date: Wed, 17 Jan 2024 18:07:08 +0100 Subject: [PATCH 23/35] [code-infra] Replace hardcoded repository in monorepo update script (#3092) --- scripts/updateMonorepo.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/updateMonorepo.ts b/scripts/updateMonorepo.ts index 90debe5aed9..c65ad75daa9 100644 --- a/scripts/updateMonorepo.ts +++ b/scripts/updateMonorepo.ts @@ -2,7 +2,7 @@ import * as execa from 'execa'; const $ = execa.$({ stdio: 'inherit' }); -async function updateToLatest(dependency: string, repo: string, branch: string = 'master') { +async function updateGithubDependency(dependency: string, repo: string, branch: string = 'master') { const url = new URL(`https://api.github.com/repos/${repo}/commits`); url.searchParams.set('sha', branch); url.searchParams.set('per_page', '1'); @@ -21,7 +21,7 @@ async function updateToLatest(dependency: string, repo: string, branch: string = // eslint-disable-next-line no-console console.log(`Updating "${repo}" to latest commit ${latestCommit}...`); - await $`pnpm update -r ${dependency}@github:mui/material-ui#${latestCommit}`; + await $`pnpm update -r ${dependency}@github:${repo}#${latestCommit}`; // eslint-disable-next-line no-console console.log(`Deduping...`); @@ -29,4 +29,4 @@ async function updateToLatest(dependency: string, repo: string, branch: string = await $({ stdio: 'inherit' })`pnpm dedupe`; } -updateToLatest('@mui/monorepo', 'mui/material-ui'); +updateGithubDependency('@mui/monorepo', 'mui/material-ui'); From 4698dfaf1a7cb1a48d7f9184b25f2f4f5b83eabe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 09:50:38 -0800 Subject: [PATCH 24/35] Bump MUI Core (#3093) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package.json | 4 +-- package.json | 2 +- packages/toolpad-app/package.json | 2 +- packages/toolpad-components/package.json | 2 +- pnpm-lock.yaml | 32 ++++++++++++------------ 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/package.json b/docs/package.json index c3f41ed4ec8..b5fec883336 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,11 +26,11 @@ "@emotion/react": "11.11.3", "@emotion/server": "11.11.0", "@emotion/styled": "11.11.0", - "@mui/icons-material": "5.15.4", + "@mui/icons-material": "5.15.5", "@mui/lab": "5.0.0-alpha.161", "@mui/material": "5.15.5", "@mui/material-nextjs": "^5.15.5", - "@mui/monorepo": "github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2", + "@mui/monorepo": "github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed", "@mui/styles": "5.15.5", "@mui/toolpad": "workspace:*", "@mui/utils": "5.15.5", diff --git a/package.json b/package.json index 3cceb0ead08..5a5a0c8356c 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@argos-ci/core": "1.4.1", - "@mui/monorepo": "github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2", + "@mui/monorepo": "github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed", "@mui/x-charts": "6.18.7", "@next/eslint-plugin-next": "14.0.4", "@playwright/test": "1.40.1", diff --git a/packages/toolpad-app/package.json b/packages/toolpad-app/package.json index c72ae6ce44d..05905926909 100644 --- a/packages/toolpad-app/package.json +++ b/packages/toolpad-app/package.json @@ -53,7 +53,7 @@ "@emotion/styled": "11.11.0", "@googleapis/drive": "8.5.0", "@googleapis/sheets": "5.0.5", - "@mui/icons-material": "5.15.4", + "@mui/icons-material": "5.15.5", "@mui/lab": "5.0.0-alpha.161", "@mui/material": "5.15.5", "@mui/system": "5.15.5", diff --git a/packages/toolpad-components/package.json b/packages/toolpad-components/package.json index 2c8cb54f348..db00dc9ad5d 100644 --- a/packages/toolpad-components/package.json +++ b/packages/toolpad-components/package.json @@ -38,7 +38,7 @@ "url": "https://github.com/mui/mui-toolpad/issues" }, "dependencies": { - "@mui/icons-material": "5.15.4", + "@mui/icons-material": "5.15.5", "@mui/lab": "5.0.0-alpha.161", "@mui/material": "5.15.5", "@mui/toolpad-core": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 150853c9da9..69e56267137 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: 1.4.1 version: 1.4.1 '@mui/monorepo': - specifier: github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 - version: github.com/mui/material-ui/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 + specifier: github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed + version: github.com/mui/material-ui/b6705ec218180021e2740d3b8244aca7f393a2ed '@mui/x-charts': specifier: 6.18.7 version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0) @@ -208,8 +208,8 @@ importers: specifier: 11.11.0 version: 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.48)(react@18.2.0) '@mui/icons-material': - specifier: 5.15.4 - version: 5.15.4(@mui/material@5.15.5)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@mui/material@5.15.5)(react@18.2.0) '@mui/lab': specifier: 5.0.0-alpha.161 version: 5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(react-dom@18.2.0)(react@18.2.0) @@ -220,8 +220,8 @@ importers: specifier: ^5.15.5 version: 5.15.5(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.5)(next@13.4.19)(react@18.2.0) '@mui/monorepo': - specifier: github:mui/material-ui#23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 - version: github.com/mui/material-ui/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2 + specifier: github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed + version: github.com/mui/material-ui/b6705ec218180021e2740d3b8244aca7f393a2ed '@mui/styles': specifier: 5.15.5 version: 5.15.5(react@18.2.0) @@ -505,8 +505,8 @@ importers: specifier: 5.0.5 version: 5.0.5 '@mui/icons-material': - specifier: 5.15.4 - version: 5.15.4(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0) '@mui/lab': specifier: 5.0.0-alpha.161 version: 5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) @@ -842,8 +842,8 @@ importers: packages/toolpad-components: dependencies: '@mui/icons-material': - specifier: 5.15.4 - version: 5.15.4(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0) + specifier: 5.15.5 + version: 5.15.5(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0) '@mui/lab': specifier: 5.0.0-alpha.161 version: 5.0.0-alpha.161(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@mui/material@5.15.5)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) @@ -2463,8 +2463,8 @@ packages: /@mui/core-downloads-tracker@5.15.5: resolution: {integrity: sha512-VhT8klyXy8GrWrARqLMoM6Nzz809Jc3Wn5wd7WOZfre2vFO1rBV1dBANAPBhBqpaQI0HCMRTWEYoSyOFgRnz4A==} - /@mui/icons-material@5.15.4(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-q/Yk7aokN8qGMpR7bwoDpBSeaNe6Bv7vaY9yHYodP37c64TM6ime05ueb/wgksOVszrKkNXC67E/XYbRWOoUFA==} + /@mui/icons-material@5.15.5(@mui/material@5.15.5)(@types/react@18.2.48)(react@18.2.0): + resolution: {integrity: sha512-qiql0fd1JY7TZ1wm1RldvU7sL8QUatE9OC12i/qm5rnm/caTFyAfOyTIR7qqxorsJvoZGyrzwoMkal6Ij9kM0A==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -2480,8 +2480,8 @@ packages: react: 18.2.0 dev: false - /@mui/icons-material@5.15.4(@mui/material@5.15.5)(react@18.2.0): - resolution: {integrity: sha512-q/Yk7aokN8qGMpR7bwoDpBSeaNe6Bv7vaY9yHYodP37c64TM6ime05ueb/wgksOVszrKkNXC67E/XYbRWOoUFA==} + /@mui/icons-material@5.15.5(@mui/material@5.15.5)(react@18.2.0): + resolution: {integrity: sha512-qiql0fd1JY7TZ1wm1RldvU7sL8QUatE9OC12i/qm5rnm/caTFyAfOyTIR7qqxorsJvoZGyrzwoMkal6Ij9kM0A==} engines: {node: '>=12.0.0'} peerDependencies: '@mui/material': ^5.0.0 @@ -15049,8 +15049,8 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - github.com/mui/material-ui/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2: - resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/23a9e24d1088cd5f680d53fe60ef6d4a3da5e9f2} + github.com/mui/material-ui/b6705ec218180021e2740d3b8244aca7f393a2ed: + resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/b6705ec218180021e2740d3b8244aca7f393a2ed} name: '@mui/monorepo' version: 5.15.5 requiresBuild: true From f61ce2d9e507c0bae2332af823fdc96e39b582c3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:15:48 -0800 Subject: [PATCH 25/35] Bump @mui/monorepo digest to 35a1472 (#3095) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/package.json b/docs/package.json index b5fec883336..c51d741bd7f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -30,7 +30,7 @@ "@mui/lab": "5.0.0-alpha.161", "@mui/material": "5.15.5", "@mui/material-nextjs": "^5.15.5", - "@mui/monorepo": "github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed", + "@mui/monorepo": "github:mui/material-ui#35a1472bec5d34f5a439cd4f73ddc44eaab95df3", "@mui/styles": "5.15.5", "@mui/toolpad": "workspace:*", "@mui/utils": "5.15.5", diff --git a/package.json b/package.json index 5a5a0c8356c..caf3f1373f1 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@argos-ci/core": "1.4.1", - "@mui/monorepo": "github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed", + "@mui/monorepo": "github:mui/material-ui#35a1472bec5d34f5a439cd4f73ddc44eaab95df3", "@mui/x-charts": "6.18.7", "@next/eslint-plugin-next": "14.0.4", "@playwright/test": "1.40.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69e56267137..980b30adf54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: 1.4.1 version: 1.4.1 '@mui/monorepo': - specifier: github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed - version: github.com/mui/material-ui/b6705ec218180021e2740d3b8244aca7f393a2ed + specifier: github:mui/material-ui#35a1472bec5d34f5a439cd4f73ddc44eaab95df3 + version: github.com/mui/material-ui/35a1472bec5d34f5a439cd4f73ddc44eaab95df3 '@mui/x-charts': specifier: 6.18.7 version: 6.18.7(@mui/material@5.15.5)(@mui/system@5.15.5)(react-dom@18.2.0)(react@18.2.0) @@ -220,8 +220,8 @@ importers: specifier: ^5.15.5 version: 5.15.5(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.5)(next@13.4.19)(react@18.2.0) '@mui/monorepo': - specifier: github:mui/material-ui#b6705ec218180021e2740d3b8244aca7f393a2ed - version: github.com/mui/material-ui/b6705ec218180021e2740d3b8244aca7f393a2ed + specifier: github:mui/material-ui#35a1472bec5d34f5a439cd4f73ddc44eaab95df3 + version: github.com/mui/material-ui/35a1472bec5d34f5a439cd4f73ddc44eaab95df3 '@mui/styles': specifier: 5.15.5 version: 5.15.5(react@18.2.0) @@ -15049,8 +15049,8 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - github.com/mui/material-ui/b6705ec218180021e2740d3b8244aca7f393a2ed: - resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/b6705ec218180021e2740d3b8244aca7f393a2ed} + github.com/mui/material-ui/35a1472bec5d34f5a439cd4f73ddc44eaab95df3: + resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/35a1472bec5d34f5a439cd4f73ddc44eaab95df3} name: '@mui/monorepo' version: 5.15.5 requiresBuild: true From 145e9a37d801b6f33e977e4e2b9a78cd08fb7c7e Mon Sep 17 00:00:00 2001 From: Bharat Kashyap Date: Thu, 18 Jan 2024 14:01:53 +0900 Subject: [PATCH 26/35] [release] v0.1.46 (#3094) --- CHANGELOG.md | 21 +++++++++++++++++++ docs/package.json | 2 +- lerna.json | 2 +- packages/create-toolpad-app/package.json | 2 +- .../eslint-plugin-material-ui/package.json | 2 +- packages/toolpad-app/package.json | 2 +- packages/toolpad-components/package.json | 2 +- packages/toolpad-core/package.json | 2 +- packages/toolpad-utils/package.json | 2 +- 9 files changed, 29 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3d85c6c37a..68828dd7160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 0.1.46 + + + +_Jan 17, 2024_ + +A big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: + +Improvements to authorization and data providers, and some behind-the-scenes clean up! + +- ​Fix screenshot flakeyness (#3087) @Janpot +- ​Load dotenv/config before reading the config (#3085) @Janpot +- ​Tweak data providers UI in the grid (#3084) @Janpot +- ​Improve authorization middleware (#3048) @apedroferreira +- ​Add universal required email configuration for authentication (#3047) @apedroferreira +- ​[code-infra] Replace hardcoded repository in monorepo update script (#3092) @Janpot +- ​[code-infra] Add monorepo update script (#3091) @Janpot +- ​[core] Use pnpm (#3065) @Janpot + +All contributors of this release in alphabetical order: @apedroferreira, @Janpot + ## 0.1.45 diff --git a/docs/package.json b/docs/package.json index c51d741bd7f..5f1bf47a26a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "0.1.45", + "version": "0.1.46", "private": true, "author": "MUI Toolpad", "license": "MIT", diff --git a/lerna.json b/lerna.json index 3d6a29da86e..f40bbe767a8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "0.1.45", + "version": "0.1.46", "npmClient": "pnpm" } diff --git a/packages/create-toolpad-app/package.json b/packages/create-toolpad-app/package.json index 53ed252460d..a600ccce87d 100644 --- a/packages/create-toolpad-app/package.json +++ b/packages/create-toolpad-app/package.json @@ -1,6 +1,6 @@ { "name": "create-toolpad-app", - "version": "0.1.45", + "version": "0.1.46", "keywords": [ "react", "toolpad", diff --git a/packages/eslint-plugin-material-ui/package.json b/packages/eslint-plugin-material-ui/package.json index c632d0d3de6..40c3eeb0a03 100644 --- a/packages/eslint-plugin-material-ui/package.json +++ b/packages/eslint-plugin-material-ui/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-material-ui", - "version": "0.1.45", + "version": "0.1.46", "private": true, "description": "Custom eslint rules for MUI.", "main": "src/index.js", diff --git a/packages/toolpad-app/package.json b/packages/toolpad-app/package.json index 05905926909..31c6278d7f6 100644 --- a/packages/toolpad-app/package.json +++ b/packages/toolpad-app/package.json @@ -1,6 +1,6 @@ { "name": "@mui/toolpad", - "version": "0.1.45", + "version": "0.1.46", "license": "MIT", "bin": { "toolpad": "./cli.mjs" diff --git a/packages/toolpad-components/package.json b/packages/toolpad-components/package.json index db00dc9ad5d..1818c0cd803 100644 --- a/packages/toolpad-components/package.json +++ b/packages/toolpad-components/package.json @@ -1,6 +1,6 @@ { "name": "@mui/toolpad-components", - "version": "0.1.45", + "version": "0.1.46", "description": "Build MUI apps quickly", "author": "MUI Toolpad team", "homepage": "https://github.com/mui/mui-toolpad#readme", diff --git a/packages/toolpad-core/package.json b/packages/toolpad-core/package.json index 4cfa55b2bc8..5ebef5ca657 100644 --- a/packages/toolpad-core/package.json +++ b/packages/toolpad-core/package.json @@ -1,6 +1,6 @@ { "name": "@mui/toolpad-core", - "version": "0.1.45", + "version": "0.1.46", "description": "Build MUI apps quickly", "author": "MUI Toolpad team", "homepage": "https://github.com/mui/mui-toolpad#readme", diff --git a/packages/toolpad-utils/package.json b/packages/toolpad-utils/package.json index 9bbbeb7b6e3..6d26bc68f63 100644 --- a/packages/toolpad-utils/package.json +++ b/packages/toolpad-utils/package.json @@ -1,6 +1,6 @@ { "name": "@mui/toolpad-utils", - "version": "0.1.45", + "version": "0.1.46", "description": "Build MUI apps quickly", "author": "MUI Toolpad team", "homepage": "https://github.com/mui/mui-toolpad#readme", From 15a7510d4a31c084ab7e43ffe1e482b06c402254 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 00:03:13 -0800 Subject: [PATCH 27/35] Bump @mui/toolpad to 0.1.46 (#3096) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- examples/basic-crud-app/package.json | 2 +- examples/charts/package.json | 2 +- examples/custom-datagrid-column/package.json | 2 +- examples/custom-server-nextjs/package.json | 2 +- examples/custom-server/package.json | 2 +- examples/datagrid-columns/package.json | 2 +- examples/dog-app/package.json | 2 +- examples/google-sheet/package.json | 2 +- examples/graphql/package.json | 2 +- examples/npm-stats/package.json | 2 +- examples/qr-generator/package.json | 2 +- examples/react-pages/package.json | 2 +- examples/stripe-script/package.json | 2 +- examples/supabase/package.json | 2 +- examples/with-prisma-data-provider/package.json | 2 +- examples/with-prisma/package.json | 2 +- examples/with-wasm/package.json | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/basic-crud-app/package.json b/examples/basic-crud-app/package.json index 20b61f97da8..c2e9d9c257f 100644 --- a/examples/basic-crud-app/package.json +++ b/examples/basic-crud-app/package.json @@ -8,6 +8,6 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" } } diff --git a/examples/charts/package.json b/examples/charts/package.json index 9aa3d621972..1cdde0772fa 100644 --- a/examples/charts/package.json +++ b/examples/charts/package.json @@ -8,6 +8,6 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" } } diff --git a/examples/custom-datagrid-column/package.json b/examples/custom-datagrid-column/package.json index 29302d98f11..d1f3f828358 100644 --- a/examples/custom-datagrid-column/package.json +++ b/examples/custom-datagrid-column/package.json @@ -8,6 +8,6 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" } } diff --git a/examples/custom-server-nextjs/package.json b/examples/custom-server-nextjs/package.json index 083d788cc7a..0a2425215d7 100644 --- a/examples/custom-server-nextjs/package.json +++ b/examples/custom-server-nextjs/package.json @@ -9,7 +9,7 @@ "edit": "toolpad editor http://localhost:3001/my-toolpad-app" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "next": "14.0.2" }, "devDependencies": {} diff --git a/examples/custom-server/package.json b/examples/custom-server/package.json index 516199e4917..f839277c256 100644 --- a/examples/custom-server/package.json +++ b/examples/custom-server/package.json @@ -9,7 +9,7 @@ "edit": "toolpad editor http://localhost:3001/my-app" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "express": "4.18.2" }, "devDependencies": {} diff --git a/examples/datagrid-columns/package.json b/examples/datagrid-columns/package.json index afc39ef8419..70d2b53eecc 100644 --- a/examples/datagrid-columns/package.json +++ b/examples/datagrid-columns/package.json @@ -8,6 +8,6 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" } } diff --git a/examples/dog-app/package.json b/examples/dog-app/package.json index 040824c6bd6..7ae5fc1b63a 100644 --- a/examples/dog-app/package.json +++ b/examples/dog-app/package.json @@ -8,6 +8,6 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" } } diff --git a/examples/google-sheet/package.json b/examples/google-sheet/package.json index bb25d1e0693..166bf624fb1 100644 --- a/examples/google-sheet/package.json +++ b/examples/google-sheet/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "googleapis": "130.0.0" } } diff --git a/examples/graphql/package.json b/examples/graphql/package.json index 80d4a611b5f..4c60776e984 100644 --- a/examples/graphql/package.json +++ b/examples/graphql/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "graphql": "16.8.1", "graphql-request": "6.1.0", "graphql-tag": "2.12.6" diff --git a/examples/npm-stats/package.json b/examples/npm-stats/package.json index 9988b77f0e4..176ba100efb 100644 --- a/examples/npm-stats/package.json +++ b/examples/npm-stats/package.json @@ -8,6 +8,6 @@ "start": "NODE_OPTIONS='--max-old-space-size=396' toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" } } diff --git a/examples/qr-generator/package.json b/examples/qr-generator/package.json index 4426bdf236a..f05dcc223ae 100644 --- a/examples/qr-generator/package.json +++ b/examples/qr-generator/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "qrcode": "^1.5.3" }, "devDependencies": { diff --git a/examples/react-pages/package.json b/examples/react-pages/package.json index 0b8fb7348f4..9cb3d1c1f2f 100644 --- a/examples/react-pages/package.json +++ b/examples/react-pages/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@mui/material": "5.15.5", - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "@mui/x-data-grid": "6.18.7", "@tanstack/react-query": "5.17.10" }, diff --git a/examples/stripe-script/package.json b/examples/stripe-script/package.json index 6b5a57ca653..584c28634b7 100644 --- a/examples/stripe-script/package.json +++ b/examples/stripe-script/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "archiver": "6.0.1", "stripe": "^14.12.0" } diff --git a/examples/supabase/package.json b/examples/supabase/package.json index d80e25d1392..dda9a3a5b76 100644 --- a/examples/supabase/package.json +++ b/examples/supabase/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "@supabase/supabase-js": "2.39.3" } } diff --git a/examples/with-prisma-data-provider/package.json b/examples/with-prisma-data-provider/package.json index 82b40e04ec2..4e95d7de7fd 100644 --- a/examples/with-prisma-data-provider/package.json +++ b/examples/with-prisma-data-provider/package.json @@ -9,7 +9,7 @@ "prisma": "prisma" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "@prisma/client": "5.8.0", "qrcode": "^1.5.3" }, diff --git a/examples/with-prisma/package.json b/examples/with-prisma/package.json index 5259f7af413..ddd2d2602fd 100644 --- a/examples/with-prisma/package.json +++ b/examples/with-prisma/package.json @@ -9,7 +9,7 @@ "prisma": "prisma" }, "dependencies": { - "@mui/toolpad": "0.1.45", + "@mui/toolpad": "0.1.46", "@prisma/client": "5.8.0", "qrcode": "^1.5.3" }, diff --git a/examples/with-wasm/package.json b/examples/with-wasm/package.json index 85e19b0ae51..0acdfed8e0f 100644 --- a/examples/with-wasm/package.json +++ b/examples/with-wasm/package.json @@ -8,7 +8,7 @@ "start": "toolpad start" }, "dependencies": { - "@mui/toolpad": "0.1.45" + "@mui/toolpad": "0.1.46" }, "devDependencies": { "assemblyscript": "0.27.22" From 0a99b104cc20b7f35eee3a566edbd884b16a98ff Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Thu, 18 Jan 2024 23:04:48 +0000 Subject: [PATCH 28/35] Roles docs without images --- docs/data/pages.ts | 15 +++++- .../{authorization.md => authentication.md} | 30 ++++++++++-- docs/data/toolpad/concepts/rbac.md | 43 ++++++++++++++++++ docs/pages/toolpad/concepts/authentication.js | 7 +++ .../concepts/{authorization.js => rbac.js} | 2 +- .../authorization/azure-ad-redirect-url.png | Bin 0 -> 18093 bytes 6 files changed, 92 insertions(+), 5 deletions(-) rename docs/data/toolpad/concepts/{authorization.md => authentication.md} (65%) create mode 100644 docs/data/toolpad/concepts/rbac.md create mode 100644 docs/pages/toolpad/concepts/authentication.js rename docs/pages/toolpad/concepts/{authorization.js => rbac.js} (67%) create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/azure-ad-redirect-url.png diff --git a/docs/data/pages.ts b/docs/data/pages.ts index e6b3d1e241b..a5a19e705c2 100644 --- a/docs/data/pages.ts +++ b/docs/data/pages.ts @@ -78,7 +78,20 @@ const pages: MuiPage[] = [ { pathname: '/toolpad/concepts/page-properties', }, - { pathname: '/toolpad/concepts/authorization' }, + { + pathname: '/toolpad/concepts/authorization', + title: 'Authorization', + children: [ + { + pathname: '/toolpad/concepts/authentication', + title: 'Authentication', + }, + { + pathname: '/toolpad/concepts/rbac', + title: 'Role-based access control', + }, + ], + }, { pathname: '/toolpad/concepts/custom-server' }, ], }, diff --git a/docs/data/toolpad/concepts/authorization.md b/docs/data/toolpad/concepts/authentication.md similarity index 65% rename from docs/data/toolpad/concepts/authorization.md rename to docs/data/toolpad/concepts/authentication.md index 2c876e62e07..b1ad0c0d903 100644 --- a/docs/data/toolpad/concepts/authorization.md +++ b/docs/data/toolpad/concepts/authentication.md @@ -1,6 +1,6 @@ -# Authorization +# Authentication -

Restrict a Toolpad application or some of its pages to certain authenticated users.

+

Restrict a Toolpad application to authenticated users only, under certain authentication providers.

You can configure a Toolpad application so that users have to sign in with specific authentication providers in order to access it. @@ -56,8 +56,32 @@ In the Google OAuth client settings screen, under the **Authorized redirect URIs {{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/google-redirect-url.png", "alt": "Google redirect URIs configuration", "caption": "Google redirect URIs configuration", "zoom": false, "width": 460 }} +### Azure Active Directory (now Entra ID) + +| environment variable name                  | description | +| :------------------------------------------------------------------------------------------------------------------------- | :-------------------------- | +| `TOOLPAD_AZURE_AD_CLIENT_ID` | Azure AD application (client) ID. | +| `TOOLPAD_AZURE_AD_CLIENT_SECRET` | Azure AD application client secret. | +| `TOOLPAD_AZURE_AD_TENANT_ID` | Azure AD application directory (tenant) ID | + +Follow these steps to configure your Azure AD client and get the necessary environment variables: + +1. Go to https://portal.azure.com, search for "Microsoft Entra ID" and go to it. + +2. In the left-side menu, go to **App registrations** and create a new app by choosing **New registration**. + +3. When registering your application, under the **Redirect URI** option, make sure to include the production path of your application followed by `/api/auth/callback/azure-ad`, as in `http://mui.com/api/auth/callback/azure-ad`. + +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/azure-ad-redirect-url.png", "alt": "Azure AD redirect URI configuration", "caption": "Azure AD redirect URI configuration", "aspectRatio": 6 }} + +4. Once your application has ben created, go to its page in **App registrations** where you can find the client and tenant IDs under the **Overview** option in the left-side menu. + +5. Go to **Certificates & secrets** and use the option **New client secret** to generate a client secret. + +With the Azure AD provider, only existing users of your Azure AD application will be able to sign in. + ## Restricted domains In the authentication settings, you can specify one or more domains (such as `mui.com`) to restrict user authentication based on the signed-in user's email address. -If any restricted domains are set, the user must have at least one verified email assigned to their current authentication provider that belongs to one of those domains, otherwise they will not be able to sign in. +If any restricted domains are set, the user must have at least one email address assigned to their current authentication provider that belongs to one of those domains, otherwise they will not be able to sign in. diff --git a/docs/data/toolpad/concepts/rbac.md b/docs/data/toolpad/concepts/rbac.md new file mode 100644 index 00000000000..9566a7414b6 --- /dev/null +++ b/docs/data/toolpad/concepts/rbac.md @@ -0,0 +1,43 @@ +# Role-based access control + +

Restrict pages in Toolpad application to users with certain roles only.

+ +:::warning +This will be a paid feature of Toolpad very soon, so it's only available for free for a limited time. +::: + +You can configure pages in a Toolpad application so that users must have certain roles within specific authentication providers in order to access them. + +Before using these features, make sure that you have [authentication](/toolpad/concepts/authentication/) enabled for the authenticated providers you are using. + +## Defining roles + +Role settings can be accessed through the **Authorization** option in the app editor header, under the **Roles** tab, where you can view, create, edit and delete roles for the whole application. + +## Restricting pages + +By default, all pages are viewable by users with any roles (or even no roles). + +You can change this for any individual page in the editor screen, under the **Page** settings in the right sidebar, where you can select/deselect **Allow access to all roles** and add one or multiple roles under the list of **Allowed roles** for the page. + +## Authorization providers + +In order for Toolpad users to have roles, you need to have those roles configured in the authentication provider they sign in with. Each authentication provider has its own configuration settings for roles. + +Not all available authentication providers in Toolpad support roles, so you must use one that does if you want to use this feature. + +### Azure Active Directory (now Entra ID) + +Follow these steps to assign roles to users in an Azure AD application: + +1. From the Azure AD home screen, go to **App registrations** in the left-side menu, then in your application go to **App roles** on the left, where you can create new roles with the **Create app role** option. + +2. To assign your created roles to a user, from the Azure AD home screen go to **Enterprise applications** in the left-side menu, then in your application go to **Users and groups** on the left, where you can assign/unassign roles to selected users with the **Edit assignment** option. + +## Role mapping + +By default, Toolpad will expect an exact match between the names of your Toolpad roles and the roles in the authentication provider being used. + +If you don't want these to match, you can assign each Toolpad role to one or more provider roles under the **Role mappings** tab in the Authorization options in the editor. + +To assign more than one provider role to a Toolpad role, you can separate the values with commas under the **Provider role** column (as in `viewer, editor, admin`). diff --git a/docs/pages/toolpad/concepts/authentication.js b/docs/pages/toolpad/concepts/authentication.js new file mode 100644 index 00000000000..b98015c07c6 --- /dev/null +++ b/docs/pages/toolpad/concepts/authentication.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from '../../../data/toolpad/concepts/authentication.md?@mui/markdown'; + +export default function Page() { + return ; +} diff --git a/docs/pages/toolpad/concepts/authorization.js b/docs/pages/toolpad/concepts/rbac.js similarity index 67% rename from docs/pages/toolpad/concepts/authorization.js rename to docs/pages/toolpad/concepts/rbac.js index 2eb6cc83244..4976230b6bb 100644 --- a/docs/pages/toolpad/concepts/authorization.js +++ b/docs/pages/toolpad/concepts/rbac.js @@ -1,6 +1,6 @@ import * as React from 'react'; import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; -import * as pageProps from '../../../data/toolpad/concepts/authorization.md?@mui/markdown'; +import * as pageProps from '../../../data/toolpad/concepts/rbac.md?@mui/markdown'; export default function Page() { return ; diff --git a/docs/public/static/toolpad/docs/concepts/authorization/azure-ad-redirect-url.png b/docs/public/static/toolpad/docs/concepts/authorization/azure-ad-redirect-url.png new file mode 100644 index 0000000000000000000000000000000000000000..011175db0dfb178f011412c8d0d308e991f41fe5 GIT binary patch literal 18093 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 z09o{ojsO4v0000000000008)J4-N?c00004{eSHX6951J00000000000000000000 Zz$G_jvzCOrkKzCT002ovPDHLkV1o2z$^-xa literal 0 HcmV?d00001 From 6c84d3fce9c7c673b1240a56c39070295568225a Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Thu, 18 Jan 2024 23:24:38 +0000 Subject: [PATCH 29/35] Add documentation for Azure AD and roles/RBAC --- docs/data/toolpad/concepts/rbac.md | 8 ++++++++ .../concepts/authorization/azure-ad-roles.png | Bin 0 -> 75842 bytes .../authorization/restricting-pages.png | Bin 0 -> 8805 bytes .../authorization/role-mapping-settings.png | Bin 0 -> 105587 bytes .../concepts/authorization/roles-settings.png | Bin 0 -> 103902 bytes 5 files changed, 8 insertions(+) create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/azure-ad-roles.png create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/restricting-pages.png create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/role-mapping-settings.png create mode 100644 docs/public/static/toolpad/docs/concepts/authorization/roles-settings.png diff --git a/docs/data/toolpad/concepts/rbac.md b/docs/data/toolpad/concepts/rbac.md index 9566a7414b6..74f11501765 100644 --- a/docs/data/toolpad/concepts/rbac.md +++ b/docs/data/toolpad/concepts/rbac.md @@ -14,12 +14,16 @@ Before using these features, make sure that you have [authentication](/toolpad/c Role settings can be accessed through the **Authorization** option in the app editor header, under the **Roles** tab, where you can view, create, edit and delete roles for the whole application. +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/roles-settings.png", "alt": "Roles settings", "caption": "Roles settings", "indent": 1, "aspectRatio": 6 }} + ## Restricting pages By default, all pages are viewable by users with any roles (or even no roles). You can change this for any individual page in the editor screen, under the **Page** settings in the right sidebar, where you can select/deselect **Allow access to all roles** and add one or multiple roles under the list of **Allowed roles** for the page. +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/restricting-pages.png", "alt": "Page authorization settings", "caption": "Page authorization settings", "zoom": false, "width": 380 }} + ## Authorization providers In order for Toolpad users to have roles, you need to have those roles configured in the authentication provider they sign in with. Each authentication provider has its own configuration settings for roles. @@ -32,6 +36,8 @@ Follow these steps to assign roles to users in an Azure AD application: 1. From the Azure AD home screen, go to **App registrations** in the left-side menu, then in your application go to **App roles** on the left, where you can create new roles with the **Create app role** option. +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/azure-ad-roles.png", "alt": "Azure AD app roles", "caption": "Azure AD app roles", "indent": 1, "aspectRatio": 6 }} + 2. To assign your created roles to a user, from the Azure AD home screen go to **Enterprise applications** in the left-side menu, then in your application go to **Users and groups** on the left, where you can assign/unassign roles to selected users with the **Edit assignment** option. ## Role mapping @@ -41,3 +47,5 @@ By default, Toolpad will expect an exact match between the names of your Toolpad If you don't want these to match, you can assign each Toolpad role to one or more provider roles under the **Role mappings** tab in the Authorization options in the editor. To assign more than one provider role to a Toolpad role, you can separate the values with commas under the **Provider role** column (as in `viewer, editor, admin`). + +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/role-mapping-settings.png", "alt": "Role mapping settings", "caption": "Role mapping settings", "indent": 1, "aspectRatio": 6 }} \ No newline at end of file diff --git a/docs/public/static/toolpad/docs/concepts/authorization/azure-ad-roles.png b/docs/public/static/toolpad/docs/concepts/authorization/azure-ad-roles.png new file mode 100644 index 0000000000000000000000000000000000000000..d8497253e6c08a4194301bbfbc9a286caab712ec GIT binary patch literal 75842 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 literal 0 HcmV?d00001 From 2e271be911f4fad760caa8b3c2e403fa116a7fdd Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Thu, 18 Jan 2024 23:31:06 +0000 Subject: [PATCH 30/35] Run prettier, disable feature flag --- docs/data/toolpad/concepts/authentication.md | 10 +++++----- docs/data/toolpad/concepts/rbac.md | 2 +- packages/toolpad-app/src/constants.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/data/toolpad/concepts/authentication.md b/docs/data/toolpad/concepts/authentication.md index b1ad0c0d903..62cc43fc507 100644 --- a/docs/data/toolpad/concepts/authentication.md +++ b/docs/data/toolpad/concepts/authentication.md @@ -58,11 +58,11 @@ In the Google OAuth client settings screen, under the **Authorized redirect URIs ### Azure Active Directory (now Entra ID) -| environment variable name                  | description | -| :------------------------------------------------------------------------------------------------------------------------- | :-------------------------- | -| `TOOLPAD_AZURE_AD_CLIENT_ID` | Azure AD application (client) ID. | -| `TOOLPAD_AZURE_AD_CLIENT_SECRET` | Azure AD application client secret. | -| `TOOLPAD_AZURE_AD_TENANT_ID` | Azure AD application directory (tenant) ID | +| environment variable name                  | description | +| :------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------- | +| `TOOLPAD_AZURE_AD_CLIENT_ID` | Azure AD application (client) ID. | +| `TOOLPAD_AZURE_AD_CLIENT_SECRET` | Azure AD application client secret. | +| `TOOLPAD_AZURE_AD_TENANT_ID` | Azure AD application directory (tenant) ID | Follow these steps to configure your Azure AD client and get the necessary environment variables: diff --git a/docs/data/toolpad/concepts/rbac.md b/docs/data/toolpad/concepts/rbac.md index 74f11501765..94ebe102c42 100644 --- a/docs/data/toolpad/concepts/rbac.md +++ b/docs/data/toolpad/concepts/rbac.md @@ -48,4 +48,4 @@ If you don't want these to match, you can assign each Toolpad role to one or mor To assign more than one provider role to a Toolpad role, you can separate the values with commas under the **Provider role** column (as in `viewer, editor, admin`). -{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/role-mapping-settings.png", "alt": "Role mapping settings", "caption": "Role mapping settings", "indent": 1, "aspectRatio": 6 }} \ No newline at end of file +{{"component": "modules/components/DocsImage.tsx", "src": "/static/toolpad/docs/concepts/authorization/role-mapping-settings.png", "alt": "Role mapping settings", "caption": "Role mapping settings", "indent": 1, "aspectRatio": 6 }} diff --git a/packages/toolpad-app/src/constants.ts b/packages/toolpad-app/src/constants.ts index 5d0b6d21566..9a8e5503061 100644 --- a/packages/toolpad-app/src/constants.ts +++ b/packages/toolpad-app/src/constants.ts @@ -21,4 +21,4 @@ export const VERSION_CHECK_INTERVAL = 1000 * 60 * 10; // TODO: Remove once global functions UI is ready export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; -export const FEATURE_FLAG_AUTHORIZATION = true; +export const FEATURE_FLAG_AUTHORIZATION = false; From 04c406ac7c8d0d256a96586b8da33fe7484c103e Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:55:46 +0000 Subject: [PATCH 31/35] Fix merge --- docs/schemas/v1/definitions.json | 20 -------------------- packages/toolpad-core/src/appDom.ts | 1 - 2 files changed, 21 deletions(-) diff --git a/docs/schemas/v1/definitions.json b/docs/schemas/v1/definitions.json index 2b1342606b3..07d00be8a46 100644 --- a/docs/schemas/v1/definitions.json +++ b/docs/schemas/v1/definitions.json @@ -91,26 +91,6 @@ ] }, "description": "Available roles for this application. These can be assigned to users." - }, - "roleMappings": { - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "propertyNames": { - "enum": [ - "github", - "google", - "azure-ad" - ] - }, - "description": "Role mapping definitions from authentication provider roles to Toolpad roles." } }, "additionalProperties": false, diff --git a/packages/toolpad-core/src/appDom.ts b/packages/toolpad-core/src/appDom.ts index 62363db5da6..6a5c0cd4c66 100644 --- a/packages/toolpad-core/src/appDom.ts +++ b/packages/toolpad-core/src/appDom.ts @@ -75,7 +75,6 @@ export interface AppNode extends AppDomNodeBase { readonly name: string; readonly description?: string; }[]; - readonly roleMappings?: Partial>>; }; }; } From b150070f4824cbe9e054cc350916727e292db1ba Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:56:45 +0000 Subject: [PATCH 32/35] Fix merge more --- package.json | 5 ----- packages/toolpad-app/src/server/schema.ts | 8 -------- 2 files changed, 13 deletions(-) diff --git a/package.json b/package.json index 5020d1578e2..16420e6db73 100644 --- a/package.json +++ b/package.json @@ -98,12 +98,7 @@ }, "engines": { "npm": "please-use-yarn", -<<<<<<< HEAD - "node": ">=18", - "pnpm": ">=8.7.0" -======= "node": ">=18" ->>>>>>> upstream/master }, "resolutions": { "google-auth-library": "*" diff --git a/packages/toolpad-app/src/server/schema.ts b/packages/toolpad-app/src/server/schema.ts index a330284cace..d6387d0c39a 100644 --- a/packages/toolpad-app/src/server/schema.ts +++ b/packages/toolpad-app/src/server/schema.ts @@ -256,8 +256,6 @@ elementSchema = baseElementSchema }) .describe('The instance of a component. Used to build user interfaces in pages.'); -const authProviderSchema = z.enum(['github', 'google', 'azure-ad']); - export const applicationSchema = toolpadObjectSchema( 'application', z.object({ @@ -305,12 +303,6 @@ export const applicationSchema = toolpadObjectSchema( ) .optional() .describe('Available roles for this application. These can be assigned to users.'), - roleMappings: z - .record(authProviderSchema, z.record(z.array(z.string()))) - .optional() - .describe( - 'Role mapping definitions from authentication provider roles to Toolpad roles.', - ), }) .optional() .describe('Authorization configuration for this application.'), From 8cf02eaee18b70f93280f6c0c5c1f140ffb93e8c Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:43:21 +0000 Subject: [PATCH 33/35] Remove feature flag --- packages/toolpad-app/src/constants.ts | 4 +- .../AppEditor/PageEditor/PageOptionsPanel.tsx | 41 +++++++++---------- packages/toolpad-app/src/toolpad/Toolpad.tsx | 4 +- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/packages/toolpad-app/src/constants.ts b/packages/toolpad-app/src/constants.ts index 9a8e5503061..47d7ea40066 100644 --- a/packages/toolpad-app/src/constants.ts +++ b/packages/toolpad-app/src/constants.ts @@ -19,6 +19,4 @@ export const TOOLPAD_BRIDGE_GLOBAL = '__TOOLPAD_BRIDGE__'; export const VERSION_CHECK_INTERVAL = 1000 * 60 * 10; // TODO: Remove once global functions UI is ready -export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; - -export const FEATURE_FLAG_AUTHORIZATION = false; +export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; \ No newline at end of file diff --git a/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx b/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx index 13215ed038a..6bf6a10473c 100644 --- a/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx +++ b/packages/toolpad-app/src/toolpad/AppEditor/PageEditor/PageOptionsPanel.tsx @@ -20,7 +20,6 @@ import UrlQueryEditor from './UrlQueryEditor'; import NodeNameEditor from '../NodeNameEditor'; import PageTitleEditor from '../PageTitleEditor'; import PageDisplayNameEditor from '../PageDisplayNameEditor'; -import { FEATURE_FLAG_AUTHORIZATION } from '../../../constants'; const PAGE_DISPLAY_OPTIONS: { value: appDom.PageDisplayMode; label: string }[] = [ { value: 'shell', label: 'App shell' }, @@ -119,27 +118,25 @@ export default function PageOptionsPanel() { - {FEATURE_FLAG_AUTHORIZATION ? ( -

- ) : null} +
+ Authorization: + } + label="Allow access to all roles" + /> + ( + + )} + /> +
{appDom.isCodePage(page) ? null : (
diff --git a/packages/toolpad-app/src/toolpad/Toolpad.tsx b/packages/toolpad-app/src/toolpad/Toolpad.tsx index b7c4803b92b..2d70f7001d3 100644 --- a/packages/toolpad-app/src/toolpad/Toolpad.tsx +++ b/packages/toolpad-app/src/toolpad/Toolpad.tsx @@ -15,7 +15,7 @@ import { APP_FUNCTIONS_ROUTE } from '../routes'; import ToolpadShell from './ToolpadShell'; import { getViewFromPathname } from '../utils/domView'; import AppProvider, { AppState, useAppStateContext } from './AppState'; -import { FEATURE_FLAG_AUTHORIZATION, FEATURE_FLAG_GLOBAL_FUNCTIONS } from '../constants'; +import { FEATURE_FLAG_GLOBAL_FUNCTIONS } from '../constants'; import { ProjectProvider } from '../project'; import AppAuthorizationDialog from './AppEditor/AppAuthorizationEditor'; @@ -104,11 +104,9 @@ function EditorShell({ children }: EditorShellProps) { return ( - ) : null } actions={ previewPath ? ( From b26127f22755a81c2c54509a8943e3134bcd2ad9 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:48:18 +0000 Subject: [PATCH 34/35] Prettier --- packages/toolpad-app/src/constants.ts | 2 +- packages/toolpad-app/src/toolpad/Toolpad.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/toolpad-app/src/constants.ts b/packages/toolpad-app/src/constants.ts index 47d7ea40066..8d99c2b1e05 100644 --- a/packages/toolpad-app/src/constants.ts +++ b/packages/toolpad-app/src/constants.ts @@ -19,4 +19,4 @@ export const TOOLPAD_BRIDGE_GLOBAL = '__TOOLPAD_BRIDGE__'; export const VERSION_CHECK_INTERVAL = 1000 * 60 * 10; // TODO: Remove once global functions UI is ready -export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; \ No newline at end of file +export const FEATURE_FLAG_GLOBAL_FUNCTIONS = false; diff --git a/packages/toolpad-app/src/toolpad/Toolpad.tsx b/packages/toolpad-app/src/toolpad/Toolpad.tsx index 2d70f7001d3..a597fe9e349 100644 --- a/packages/toolpad-app/src/toolpad/Toolpad.tsx +++ b/packages/toolpad-app/src/toolpad/Toolpad.tsx @@ -15,7 +15,7 @@ import { APP_FUNCTIONS_ROUTE } from '../routes'; import ToolpadShell from './ToolpadShell'; import { getViewFromPathname } from '../utils/domView'; import AppProvider, { AppState, useAppStateContext } from './AppState'; -import { FEATURE_FLAG_GLOBAL_FUNCTIONS } from '../constants'; +import { FEATURE_FLAG_GLOBAL_FUNCTIONS } from '../constants'; import { ProjectProvider } from '../project'; import AppAuthorizationDialog from './AppEditor/AppAuthorizationEditor'; @@ -104,9 +104,9 @@ function EditorShell({ children }: EditorShellProps) { return ( - - + + + } actions={ previewPath ? ( From dd63fe6fb55d1db70965a389c37e09816821a19c Mon Sep 17 00:00:00 2001 From: Pedro Ferreira <10789765+apedroferreira@users.noreply.github.com> Date: Thu, 1 Feb 2024 18:11:55 +0000 Subject: [PATCH 35/35] Add recommended warnings --- docs/data/toolpad/concepts/authentication.md | 8 ++++++++ docs/data/toolpad/concepts/rbac.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/data/toolpad/concepts/authentication.md b/docs/data/toolpad/concepts/authentication.md index 62cc43fc507..8c2026998fa 100644 --- a/docs/data/toolpad/concepts/authentication.md +++ b/docs/data/toolpad/concepts/authentication.md @@ -22,6 +22,10 @@ You can quickly create a good value on the command line with this `openssl` comm openssl rand -base64 32 ``` +:::warning +Please make sure to keep this secret safe and do not share it with anyone! +::: + ## Authentication providers In the authentication settings, you can set up one or more authentication providers for users to be able to sign in with, such as Github and Google. @@ -58,6 +62,10 @@ In the Google OAuth client settings screen, under the **Authorized redirect URIs ### Azure Active Directory (now Entra ID) +:::warning +The Azure AD authentication provider will be a paid feature of Toolpad very soon, so it's only available for free for a limited time. +::: + | environment variable name                  | description | | :------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------- | | `TOOLPAD_AZURE_AD_CLIENT_ID` | Azure AD application (client) ID. | diff --git a/docs/data/toolpad/concepts/rbac.md b/docs/data/toolpad/concepts/rbac.md index 94ebe102c42..260140ec291 100644 --- a/docs/data/toolpad/concepts/rbac.md +++ b/docs/data/toolpad/concepts/rbac.md @@ -3,7 +3,7 @@

Restrict pages in Toolpad application to users with certain roles only.

:::warning -This will be a paid feature of Toolpad very soon, so it's only available for free for a limited time. +Role-based access control will be a paid feature of Toolpad very soon, so it's only available for free for a limited time. ::: You can configure pages in a Toolpad application so that users must have certain roles within specific authentication providers in order to access them.