Compare commits

..

25 Commits

Author SHA1 Message Date
Szilárd Dóró
21fb316655 Merge pull request #1554 from nhost/changeset-release/main
chore: update versions
2023-01-30 15:39:36 +01:00
github-actions[bot]
9c4f350508 chore: update versions 2023-01-30 11:18:24 +00:00
Szilárd Dóró
eb3ba21afc Merge pull request #1556 from nhost/renovate-changesets
chore: create changesest from Renovate bumps
2023-01-30 12:16:59 +01:00
Szilárd Dóró
a84ac62999 Merge pull request #1546 from nhost/roles-iagsd9ahsd
fix(dashboard): allowed roles
2023-01-30 11:38:27 +01:00
Szilárd Dóró
f32bfed9a9 Merge pull request #1558 from nhost/fix/pnpm-lock
fix pnpm-lock.yaml
2023-01-30 10:49:40 +01:00
Szilárd Dóró
55632506e4 fix pnpm-lock.yaml 2023-01-30 10:49:21 +01:00
szilarddoro
e146d32e69 chore(deps): update dependency @types/react to v18.0.27 2023-01-30 09:44:29 +00:00
Szilárd Dóró
df8a13997c Merge pull request #1487 from nhost/renovate/jsdom-21.x
chore(deps): update dependency jsdom to v21
2023-01-30 10:43:48 +01:00
Szilárd Dóró
c488fd4c0c Merge pull request #1533 from nhost/renovate/react-18.x
chore(deps): update dependency @types/react to v18.0.27
2023-01-30 10:43:20 +01:00
Johan Eliasson
a6e8569822 Merge pull request #1544 from nhost/docs-auth-uba9sdasd
docs(auth): improvements
2023-01-30 10:37:56 +01:00
Johan Eliasson
a8023c9a3f Merge pull request #1552 from jonorossi/patch-1
docs: fix link to sign-in with security keys
2023-01-30 10:37:32 +01:00
Johan Eliasson
59347fcd4b added changeset 2023-01-30 10:18:05 +01:00
Johan Eliasson
5b65cac91e added changeset 2023-01-30 10:16:46 +01:00
Johan Eliasson
331ae02e2d revert 2023-01-30 10:15:34 +01:00
Johan Eliasson
3b8b3be393 Update docs/docs/authentication/sign-in-methods/3-security-keys.mdx
Co-authored-by: Szilárd Dóró <doroszilard@icloud.com>
2023-01-30 10:12:30 +01:00
Johan Eliasson
9fb4d82d86 Apply suggestions from code review
Co-authored-by: Szilárd Dóró <doroszilard@icloud.com>
2023-01-30 10:12:13 +01:00
Szilárd Dóró
37d836b9b6 Merge pull request #1553 from nhost/chore/enhanced-feedback
feat(dashboard): include project info in feedback
2023-01-30 10:08:50 +01:00
Szilárd Dóró
963f9b5e85 feat(dashboard): include project info in feedback 2023-01-30 09:56:56 +01:00
Jonathon Rossi
260997c6fe docs: fix link to sign-in with security keys 2023-01-30 12:25:29 +10:00
Johan Eliasson
a711727e94 wording 2023-01-28 14:13:14 +01:00
Johan Eliasson
8e8f6fd9c9 updates 2023-01-28 09:41:15 +01:00
Johan Eliasson
a1c2e5d8ee docs updates 2023-01-27 21:42:40 +01:00
Johan Eliasson
5c276ae844 improved docs for auth 2023-01-27 20:16:58 +01:00
renovate[bot]
2de904c865 chore(deps): update dependency @types/react to v18.0.27 2023-01-18 20:06:28 +00:00
renovate[bot]
a21aa05b5a chore(deps): update dependency jsdom to v21 2023-01-12 08:53:01 +00:00
31 changed files with 380 additions and 245 deletions

View File

@@ -1,5 +1,14 @@
# @nhost/dashboard
## 0.10.1
### Patch Changes
- e146d32e: chore(deps): update dependency @types/react to v18.0.27
- 59347fcd: correct allowed role name
- 5b65cac9: updated authentication documentation
- 963f9b5e: feat(dashboard): include project info in feedback
## 0.10.0
### Minor Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/dashboard",
"version": "0.10.0",
"version": "0.10.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
@@ -104,7 +104,7 @@
"@types/lodash.debounce": "^4.0.7",
"@types/node": "^16.11.7",
"@types/pluralize": "^0.0.29",
"@types/react": "18.0.25",
"@types/react": "18.0.27",
"@types/react-dom": "18.0.10",
"@types/react-table": "^7.7.12",
"@types/testing-library__jest-dom": "^5.14.5",
@@ -126,7 +126,7 @@
"eslint-plugin-jsx-a11y": "^6.6.1",
"eslint-plugin-react": "^7.31.11",
"eslint-plugin-react-hooks": "^4.6.0",
"jsdom": "^20.0.3",
"jsdom": "^21.0.0",
"lint-staged": ">=13",
"msw": "^0.49.0",
"msw-storybook-addon": "^1.6.3",

View File

@@ -1,22 +1,33 @@
import { useInsertFeedbackOneMutation } from '@/generated/graphql';
import { useCurrentWorkspaceAndApplication } from '@/hooks/useCurrentWorkspaceAndApplication';
import { Avatar } from '@/ui/Avatar';
import Button from '@/ui/v2/Button';
import Input from '@/ui/v2/Input';
import Text from '@/ui/v2/Text';
import { nhost } from '@/utils/nhost';
import { useUserData } from '@nhost/nextjs';
import * as React from 'react';
export function SendFeedback({ setFeedbackSent, feedback, setFeedback }: any) {
const { currentApplication } = useCurrentWorkspaceAndApplication();
const [insertFeedback, { loading }] = useInsertFeedbackOneMutation();
const user = nhost.auth.getUser();
const user = useUserData();
async function handleSubmit(e: React.SyntheticEvent<HTMLFormElement>) {
e.preventDefault();
const feedbackWithProjectInfo = [
currentApplication && `Project ID: ${currentApplication.id}`,
typeof window !== 'undefined' && `URL: ${window.location.href}`,
feedback,
]
.filter(Boolean)
.join('\n\n');
try {
await insertFeedback({
variables: {
feedback: {
feedback,
feedback: feedbackWithProjectInfo,
},
},
});

View File

@@ -119,7 +119,7 @@ export default function AllowedEmailDomainsSettings() {
loading: formState.isSubmitting,
},
}}
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#allowed-emails-and-domains"
enabled={enabled}
onEnabledChange={(switchEnabled) =>
setValue('enabled', switchEnabled, { shouldDirty: true })

View File

@@ -84,7 +84,7 @@ export default function AllowedRedirectURLsSettings() {
disabled: !formState.isValid || !formState.isDirty,
loading: formState.isSubmitting,
}}
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#allowed-redirect-urls"
className="grid grid-flow-row px-4 lg:grid-cols-5"
>
<Input

View File

@@ -118,7 +118,7 @@ export default function BlockedEmailSettings() {
loading: formState.isSubmitting,
},
}}
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#blocked-emails-and-domains"
enabled={enabled}
onEnabledChange={(switchEnabled) =>
setValue('enabled', switchEnabled, { shouldDirty: true })

View File

@@ -82,7 +82,7 @@ export default function ClientURLSettings() {
disabled: !formState.isValid || !formState.isDirty,
loading: formState.isSubmitting,
}}
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#client-url"
className="grid grid-flow-row lg:grid-cols-5"
>
<Input

View File

@@ -89,7 +89,7 @@ export default function DisableNewUsersSettings() {
<SettingsContainer
title="Disable New Users"
description="If set, newly registered users are disabled and wont be able to sign in."
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#disable-new-users"
switchId="authDisableNewUsers"
showSwitch
enabled={authDisableNewUsers}

View File

@@ -110,7 +110,7 @@ export default function GravatarSettings() {
disabled: !formState.isValid || !formState.isDirty,
loading: formState.isSubmitting,
}}
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#gravatar"
switchId="authGravatarEnabled"
showSwitch
enabled={authGravatarEnabled}

View File

@@ -99,7 +99,7 @@ export default function MFASettings() {
disabled: !formState.isValid || !formState.isDirty,
loading: formState.isSubmitting,
}}
docsLink="https://docs.nhost.io/platform/authentication"
docsLink="https://docs.nhost.io/authentication#multi-factor-authentication"
switchId="authMfaEnabled"
enabled={authMfaEnabled}
showSwitch

View File

@@ -58,10 +58,10 @@ export default function BaseRoleForm({
return (
<div className="grid grid-flow-row gap-3 px-6 pb-6">
<Text variant="subtitle1" component="span">
Enter the name for the role below.
Enter the name for the allowed role below.
</Text>
{submitButtonText !== 'Create' && (
{submitButtonText !== 'Add' && (
<Alert severity="warning" className="text-left">
<span className="text-left">
<strong>Note:</strong> Changing the name of the role will lose the

View File

@@ -85,11 +85,7 @@ export default function CreateRoleForm({
return (
<FormProvider {...form}>
<BaseRoleForm
submitButtonText="Create"
onSubmit={handleSubmit}
{...props}
/>
<BaseRoleForm submitButtonText="Add" onSubmit={handleSubmit} {...props} />
</FormProvider>
);
}

View File

@@ -8,18 +8,18 @@ import Chip from '@/ui/v2/Chip';
import Divider from '@/ui/v2/Divider';
import { Dropdown } from '@/ui/v2/Dropdown';
import IconButton from '@/ui/v2/IconButton';
import List from '@/ui/v2/List';
import { ListItem } from '@/ui/v2/ListItem';
import Text from '@/ui/v2/Text';
import DotsVerticalIcon from '@/ui/v2/icons/DotsVerticalIcon';
import LockIcon from '@/ui/v2/icons/LockIcon';
import PlusIcon from '@/ui/v2/icons/PlusIcon';
import {
useGetRolesQuery,
useUpdateAppMutation
} from '@/utils/__generated__/graphql';
import List from '@/ui/v2/List';
import { ListItem } from '@/ui/v2/ListItem';
import Text from '@/ui/v2/Text';
import getUserRoles from '@/utils/settings/getUserRoles';
import { toastStyleProps } from '@/utils/settings/settingsConstants';
import {
useGetRolesQuery,
useUpdateAppMutation,
} from '@/utils/__generated__/graphql';
import { Fragment } from 'react';
import toast from 'react-hot-toast';
import { twMerge } from 'tailwind-merge';
@@ -98,9 +98,9 @@ export default function RoleSettings() {
await toast.promise(
updateAppPromise,
{
loading: 'Deleting role...',
success: 'Role has been deleted successfully.',
error: 'An error occurred while trying to delete the role.',
loading: 'Deleting allowed role...',
success: 'Allowed Role has been deleted successfully.',
error: 'An error occurred while trying to delete the allowed role.',
},
toastStyleProps,
);
@@ -108,7 +108,7 @@ export default function RoleSettings() {
function handleOpenCreator() {
openDialog('CREATE_ROLE', {
title: 'Create Role',
title: 'Create Allowed Role',
props: {
titleProps: { className: '!pb-0' },
PaperProps: { className: 'max-w-sm' },
@@ -118,7 +118,7 @@ export default function RoleSettings() {
function handleOpenEditor(originalRole: Role) {
openDialog('EDIT_ROLE', {
title: 'Edit Role',
title: 'Edit Allowed Role',
payload: { originalRole },
props: {
titleProps: { className: '!pb-0' },
@@ -129,12 +129,11 @@ export default function RoleSettings() {
function handleConfirmDelete(originalRole: Role) {
openAlertDialog({
title: 'Delete Role',
title: 'Delete Allowed Role',
payload: (
<Text>
Are you sure you want to delete the &quot;
<strong>{originalRole.name}</strong>&quot; role? This cannot be
undone.
Are you sure you want to delete the allowed role &quot;
<strong>{originalRole.name}</strong>&quot;?.
</Text>
),
props: {
@@ -145,13 +144,15 @@ export default function RoleSettings() {
});
}
const availableRoles = getUserRoles(data?.app?.authUserDefaultAllowedRoles);
const availableAllowedRoles = getUserRoles(
data?.app?.authUserDefaultAllowedRoles,
);
return (
<SettingsContainer
title="Roles"
description="Roles are used to control access to your application."
docsLink="https://docs.nhost.io/authentication/users#roles"
title="Allowed Roles"
description="Allowed roles are roles users get automatically when they sign up."
docsLink="https://docs.nhost.io/authentication/users#allowed-roles"
rootClassName="gap-0"
className="px-0 my-2"
slotProps={{ submitButton: { className: 'invisible' } }}
@@ -162,7 +163,7 @@ export default function RoleSettings() {
<div className="grid grid-flow-row gap-2">
<List>
{availableRoles.map((role, index) => (
{availableAllowedRoles.map((role, index) => (
<Fragment key={role.name}>
<ListItem.Root
className="px-4"
@@ -249,7 +250,9 @@ export default function RoleSettings() {
<Divider
component="li"
className={twMerge(
index === availableRoles.length - 1 ? '!mt-4' : '!my-4',
index === availableAllowedRoles.length - 1
? '!mt-4'
: '!my-4',
)}
/>
</Fragment>
@@ -262,7 +265,7 @@ export default function RoleSettings() {
startIcon={<PlusIcon />}
onClick={handleOpenCreator}
>
Create Role
Create Allowed Role
</Button>
</div>
</SettingsContainer>

View File

@@ -80,7 +80,7 @@ export default function MagicLinkSettings() {
<Form onSubmit={handleMagicLinkSettingsUpdate}>
<SettingsContainer
title="Magic Link"
description="Allow users to sign in with a magic link."
description="Allow users to sign in with a Magic Link."
primaryActionButtonProps={{
disabled: !formState.isValid || !formState.isDirty,
loading: formState.isSubmitting,

View File

@@ -90,7 +90,7 @@ export default function SMSSettings() {
<FormProvider {...form}>
<Form onSubmit={handleSMSSettingsChange}>
<SettingsContainer
title="SMS"
title="Phone Number (SMS)"
description="Allow users to sign in with Phone Number (SMS)."
primaryActionButtonProps={{
disabled: !formState.isValid || !formState.isDirty,

View File

@@ -1,5 +1,12 @@
# @nhost/docs
## 0.0.12
### Patch Changes
- e146d32e: chore(deps): update dependency @types/react to v18.0.27
- 5b65cac9: updated authentication documentation
## 0.0.11
### Patch Changes

View File

@@ -3,7 +3,7 @@ title: Email Templates
sidebar_position: 4
---
Nhost Authentication sends out transactional emails as part of the authentication service. These emails can be modified using email templates.
Nhost Auth sends out transactional emails as part of the authentication service. These emails can be modified using email templates.
The following email templates are available:
@@ -70,8 +70,6 @@ As you see, the format is:
nhost/emails/{two-letter-language-code}/{email-template}/[subject.txt, body.html]
```
Default templates for English (`en`) and French (`fr`) are automatically generated when the project is initialized with the [CLI](/cli).
## Languages
The user's language is what decides what template to send. The user's language is stored in the `auth.users` table in the `locale` column. This `locale` column contains a two-letter language code in [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format.

View File

@@ -22,3 +22,65 @@ Nhost Authentication lets you authenticate users using different sign-in methods
- [Spotify](/authentication/sign-in-with-spotify)
- [Twitch](/authentication/sign-in-with-twitch)
- [WorkOS](/authentication/sign-in-with-workos)
## Client URL
Client URL is the URL of your frontend application. The Client URL is used to redirect the user after interacting with any authentication operation, like signing in or resetting their password.
## Allowed Redirect URLs
Allowed Redirect URLs are the URLs of your frontend application that are allowed to redirect the user after interacting with any authentication operation, like signing in or resetting their password. This is useful if you have multiple frontend applications that are using the same Nhost backend or if you want to redirect the user to a specific URL after interacting with an authentication operation.
As an example, for a staging project, you can set the Client URL to `https://staging.example.com` and Allowed Redirect URLs to `https://*.vercel.app`. This way, the user can be redirected to any Vercel deployment of your frontend application.
## Allowed Emails and Domains
Allowed Emails and Domains are used to restrict the sign-up an sign-in process to specific email addresses and domains.
If both allowed emails and allowed domains are set a user can only sign up if their email address matches one of the allowed emails or one of the allowed domains.
## Blocked Emails and Domains
Blocked Emails and Domains are used to block specific email addresses and domains from signing up and singin in.
Note that even if a user's email address matches any allowed email or domain, they will still be blocked if their email address matches any blocked email or domain.
## Multi-factor Authentication
By enabling Multi-factor Authentication (MFA), you can allow users to verify their identity using a second factor during the sign-in process. We currently support Authenticator Apps (TOTP) for MFA.
Once MFA is enabled, a user can enable MFA for their account by scanning a QR code with their Authenticator App. After that, they will be prompted to enter a code generated by their Authenticator App during the sign-in process.
We'll be adding more support in our SDKs and documentation around MFA soon.
## Gravatar
If Gravatar is enabled, Nhost Auth will use the user's email address to fetch their Gravatar profile picture. If the user doesn't have a Gravatar profile picture, a default image will be used.
There are two options for Gravatars:
### Default Image
If the user doesn't have a Gravatar profile picture, a default image will be used. You can choose between the following options:
- `404`: Do not load any image if none is associated with the email hash, instead return an HTTP 404 (File Not Found) response.
- `mp`: (mystery-person) a simple, cartoon-style silhouetted outline of a person (does not vary by email hash).
- `identicon`: a geometric pattern based on an email hash.
- `monsterid`: a generated 'monster' with different colors, faces, etc.
- `wavatar`: generated faces with differing features and backgrounds.
- `retro`: awesome generated, 8-bit arcade-style pixelated faces.
- `robohash`: a generated robot with different colors, faces, etc.
- `blank`: a transparent PNG image.
### Rating
Gravatar images are rated by default. You can choose between the following options:
- `g`: suitable for display on all websites with any audience type.
- `pg`: may contain rude gestures, provocatively dressed individuals, lesser swear words or mild violence.
- `r`: may contain such things as harsh profanity, intense violence, nudity, or hard drug use.
- `x`: may contain hardcore sexual imagery or extremely disturbing violence.
## Disable New Users
If set, newly registered users are disabled and won't be able to sign in. This is useful if you want to manually approve new users before they can sign in.

View File

@@ -5,13 +5,11 @@ slug: /authentication/sign-in-with-email-and-password
image: /img/og/sign-in-with-email-and-password.png
---
Follow this guide to sign in users with email and password.
The email and password sign-in method is enabled by default for all Nhost projects.
The Email and Password sign-in method is always enabled for all Nhost projects.
## Sign Up
Users must first sign up to be able to sign in with Email and Password.
Users must first sign up to be able to sign in.
**Example:** Sign up users using the [Nhost JavaScript client](/reference/javascript).
@@ -26,7 +24,7 @@ If you've turned on email verification in your project's **Authentication Settin
## Sign In
Once a user has been signed up (and optionally verified), you can sign them in.
After the user has successfully signed up, they can sign in.
**Example:** Sign in users using the [Nhost JavaScript client](/reference/javascript).
@@ -37,8 +35,10 @@ await nhost.auth.signIn({
})
```
## Verified Emails
## Email Verification
You can decide if only verified emails should be able to sign in or not. Modify the **Only allow users with verified emails to sign in.** setting in the **Authentication Settings** section under **Users** in your Nhost project.
If you want to require users to verify their email before they can sign in, you can enable this under **Settings -> Sign-In Methods -> Email and Password** by checking the **Require Verified Emails** checkbox.
An email-verification email is automatically sent to the user during sign-up if your project only allows to sign in users with verified emails. You can also manually send the verification email to the user using [`nhost.auth.sendVerificationEmail()`](/reference/javascript/auth/send-verification-email).
If **Require Verified Emails** is enabled, users automatically get a verification email when they sign up. The user must click the verification link in the email before they can sign in. It's possible to edit the ["email-verify" email template](/authentication/email-templates).
It's possible to manually send a verification email to the user using [`nhost.auth.sendVerificationEmail()`](/reference/javascript/auth/send-verification-email).

View File

@@ -5,15 +5,15 @@ slug: /authentication/sign-in-with-magic-link
image: /img/og/sign-in-with-magic-link.png
---
Follow this guide to sign in users with Magic Link, also called passwordless email.
Nhost allows you to sign in users with a Magic Link, which is a way to sign in users so they don't have to remember a password.
The Magic Link sign-in method enables you to sign in users using an email address, without requiring a password.
When users sign in using this sign-in method, they'll enter their email address and then receive an email with a (magic) link. When the user clicks on the (magic) link, they get automatically signed in to your app.
## Setup
The sign-in method is called Magic Link because the user gets "magically" signed in without having to enter a password.
Enable the Magic Link sign-in method in the Nhost dashboard under **Users** -> **Authentication Settings** -> **Magic Link**.
## Configuration
![Magic Link Setup with Nhost](/img/authentication/magic-link/magic-link-setup.png)
Enable the Magic Link sign-in method in the Nhost dashboard under **Settings -> Sign-In Methods -> Magic Link**.
## Sign In
@@ -30,4 +30,10 @@ nhost.auth.signIn({
})
```
If you want to change the email for your magic link emails, you can do so by changing the [email templates](/authentication/email-templates).
There is no sign up method for Magic Link. Users will be automatically created when they sign in for the first time.
Users who have signed up with email and password can also sign in with Magic Link.
## Email
It's possible to edit the ["signin-passwordless" email template](/authentication/email-templates).

View File

@@ -7,11 +7,11 @@ image: /img/og/sign-in-with-phone-number-sms.png
Follow this guide to sign in users with a phone number (SMS).
## Setup
## Configuration
You need a [Twilio account](https://www.twilio.com/try-twilio) to use this feature because all SMS are sent through Twilio.
Enable the Phone Number (SMS) sign-in method in the Nhost dashboard under **Users** -> **Authentication Settings** -> **Passwordless SMS**.
Enable the Phone Number (SMS) sign-in method in the Nhost dashboard under **Settings -> Sign-In Methods -> Phone Number (SMS)**.
You need to insert the following settings in the Nhost dashboard from Twilio:
@@ -19,10 +19,6 @@ You need to insert the following settings in the Nhost dashboard from Twilio:
- Auth Token
- Messaging Service SID (or a Twilio phone number)
<video width="99%" autoPlay muted loop controls="true" style={{ marginBottom: '15px' }}>
<source src="/videos/enable-sms-sign-in.mp4" type="video/mp4" />
</video>
## Sign In
To sign in users with a phone number is a two-step process:
@@ -44,7 +40,7 @@ await nhost.auth.signIn({
})
```
The first time a user signs in using a phone number, the user is created. That means you don't need to sign up the user before signin in the user.
The first time a user signs in using a phone number, the user is created. That means you don't need to sign up users before signing in users.
:::info

View File

@@ -16,81 +16,105 @@ Examples of security keys:
You can read more about this feature in our [blog post](https://nhost.io/blog/webauthn-sign-in-method)
## Setup
## Configuration
Enable the Security Key sign-in method in the Nhost dashboard under **Users** -> **Authentication Settings** -> **Security Keys**.
Enable the Security Key sign-in method in the Nhost dashboard under **Settings -> Sign-In Methods -> Security Keys**.
You need to make sure you also set a valid client URL under **Users** -> **Authentication Settings** -> **Client URL**.
<video width="99%" autoPlay muted loop controls="true" style={{ marginBottom: '15px' }}>
<source src="/videos/enable-security-keys-sign-in.mp4" type="video/mp4" />
</video>
You need to make sure you also set a valid client URL under **Settings -> Authentication -> Client URL**.
## Sign Up
Signing up with a security key uses the same method as signing up with an email and a password. Instead of a `password` parameter, you need to set the `securityKey` parameter to `true`:
Users must use an email address to sign up with a security key.
Here's an example of how to sign up a user with a security key with our [JavaScript SDK](/reference/javascript):
**Example:**: Sign up with a security key:
```tsx
const { error, session } = await nhost.auth.signUp({
email: 'joe@example.com',
securityKey: true
})
// Something unexpected happened, for instance, the user canceled the process
if (error) {
// Something unexpected happened, for instance, the user canceled their registration
console.log(error)
} else if (session) {
// Sign up is complete!
console.log(session.user)
} else {
return
}
// if there is no error and no session, the user needs to verify their email address.
if (!session) {
console.log(
'You need to verify your email address by clicking the link in the email we sent you.'
)
return
}
//Sign-up is complete!
console.log(session.user)
```
## Sign In
Once a user added a security key, they can use it to sign in:
Once a user signed up with a security key, and verfied their email if needed, they can use it to sign in.
**Example:** Sign in with a security key:
```tsx
const { error, session } = await nhost.auth.signIn({
email,
email: 'joe@example.com',
securityKey: true
})
if (session) {
// User is signed in
} else {
// Something unexpected happened, for instance, the user canceled the process
if (error) {
console.log(error)
return
}
if (!session) {
// Something unexpected happened
console.log(error)
return
}
// User is signed in
```
## Add a Security Key
Any signed-in user with a valid email can add a security key when the feature is enabled. For instance, someone who signed up with an email and a password can add a security key and thus use it for their later sign-in!
Any signed-in user with a verified email can add a security key to their user account. Once a security key is added, the user can use it their email and the security key to sign in.
Users can use multiple devices to sign in to their account. They can add as many security keys as they like.
It's possible to add multiple security keys to a user account.
**Example:** Add a security key to a user account:
```tsx
const { key, error } = await nhost.auth.addSecurityKey()
if (key) {
// Successfully added a new security key
console.log(key.id)
} else {
// Somethine unexpected happened
// Something unexpected happened
if (error) {
console.log(error)
return
}
// Successfully added a new security key
console.log(key.id)
```
A nickname can be added for each security key to make them easy to identify:
A nickname can be associated with each security key to make it easier to manage security keys in the future.
**Example:** Add a security key with a nickname:
```tsx
await nhost.auth.addSecurityKey('my macbook')
await nhost.auth.addSecurityKey('iPhone')
```
## List or Remove Security Keys
To list and to remove security keys can be achieved over GraphQL after setting the correct Hasura permissions to the `auth.security_keys` table:
To list and remove security keys, use GraphQL and set permissions on the `auth.security_keys` table:
**Example:** Get all security keys for a user:
```graphql
query securityKeys($userId: uuid!) {
@@ -99,6 +123,11 @@ query securityKeys($userId: uuid!) {
nickname
}
}
```
**Example:** Remove a security key:
```graphql
mutation removeSecurityKey($id: uuid!) {
deleteAuthUserSecurityKey(id: $id) {
id

View File

@@ -9,7 +9,7 @@ Nhost Authentication supports the following sign-in methods:
- [Email and Password](/authentication/sign-in-with-email-and-password)
- [Magic Link](/authentication/sign-in-with-magic-link)
- [Phone Number (SMS)](/authentication/sign-in-with-phone-number-sms)
- [Security Keys (WebAuthn)](/authentication/sign-in-with-phone-number-sms)
- [Security Keys (WebAuthn)](/authentication/sign-in-with-security-keys)
- [Apple](/authentication/sign-in-with-apple)
- [Discord](/authentication/sign-in-with-discord)
- [Facebook](/authentication/sign-in-with-facebook)

View File

@@ -1,20 +1,18 @@
---
title: Social Providers Configuration
sidebar_label: Social Providers Configuration
title: Social Providers
sidebar_label: Social Providers
sidebar_position: 10
---
## Enabling Social Sign-In Provider
To start with social sign-in, select your project in Nhost Dashboard and go to **Users** → **Authentication Settings**.
You need to set the Client ID and Client Secret for each provider that you want to enable.
To start with social sign-in, select your project in Nhost Dashboard and go to **Settings -> Sign-In Methods**.
## Implementing sign-in experience
Use the [Nhost JavaScript SDK](/reference/javascript) and the `signIn()` method to implement social sign-in for your project.
Here's an example of how to implement sign-in with GitHub:
**Example**: Sign in a user with [GitHub](/authentication/sign-in-with-github).
```js
nhost.auth.signIn({
@@ -22,19 +20,21 @@ nhost.auth.signIn({
})
```
Users are redirected to your Nhost project's **client URL** by default. By default, your Nhost project's client URL is set to `http://localhost:3000`. You can change the value of your client URL in the Nhost console by going to **Users** → **Authentication Settings** → **Client URL**.
During the sign-in flow, the user is redirected to the provider's website to authenticate. After the user authenticates, they are redirected back to your Nhost project's [**Client URL**](/authentication#client-url) by default. You can change where the user gets redirected to after authentication by passing the `redirectTo` option.
Here is an example of how to redirect to another host or path:
**Example:** Redirect the user to `https://staging.example.com/welcome` after they complete the sign-in flow.
```js
nhost.auth.signIn({
provider: '<provider>'
provider: 'github'
options: {
redirectTo: "<host>/<slug>" // Example: "https://example.com/dashboard"
redirectTo: "https://staging.example.com/welcome",
},
})
```
In the example above, it's important to note that the `redirectTo` URL must be part of the [Allowed Redirect URLs](/authentication#allowed-redirect-urls) of your Nhost project.
## Provider OAuth scopes
Scopes are a mechanism in OAuth to allow or limit an application's access to a user's account.

View File

@@ -5,35 +5,7 @@ sidebar_position: 1
image: /img/og/users.png
---
Users are stored in the database in the `auth.users` table.
## Get User Information using GraphQL
**Example:** Get all users.
```graphql
query {
users {
id
displayName
email
metadata
}
}
```
**Example:** Get a single user.
```graphql
query {
user(id: "<user-id>") {
id
displayName
email
metadata
}
}
```
Users are stored in the `auth.users` table in the [database](/database).
## Creating Users
@@ -133,6 +105,34 @@ await nhost.auth.signUp({
})
```
## Get User Information using GraphQL
**Example:** Get all users.
```graphql
query {
users {
id
displayName
email
metadata
}
}
```
**Example:** Get a single user.
```graphql
query {
user(id: "<user-id>") {
id
displayName
email
metadata
}
}
```
## Import Users
If you have users in a different system, you can import them into Nhost. When importing users you should insert the users directly into the database instead of using the authentication endpoints (`/signup/email-password`) to avoid sending unnecessary transactional emails.

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/docs",
"version": "0.0.11",
"version": "0.0.12",
"private": true,
"scripts": {
"docusaurus": "docusaurus",

View File

@@ -1,5 +1,13 @@
# @nhost-examples/serverless-functions
## 0.0.6
### Patch Changes
- e146d32e: chore(deps): update dependency @types/react to v18.0.27
- Updated dependencies [e146d32e]
- @nhost/stripe-graphql-js@1.0.1
## 0.0.5
### Patch Changes

View File

@@ -1,13 +1,13 @@
{
"name": "@nhost-examples/serverless-functions",
"private": true,
"version": "0.0.5",
"version": "0.0.6",
"devDependencies": {
"@types/express": "^4.17.13"
},
"dependencies": {
"@graphql-yoga/node": "^2.13.13",
"@nhost/stripe-graphql-js": "^1.0.0",
"@nhost/stripe-graphql-js": "^1.0.1",
"@pothos/core": "^3.21.0",
"cross-fetch": "^3.1.5",
"graphql": "15.7.2",

View File

@@ -1,5 +1,11 @@
# @nhost/stripe-graphql-js
## 1.0.1
### Patch Changes
- e146d32e: chore(deps): update dependency @types/react to v18.0.27
## 1.0.0
### Major Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/stripe-graphql-js",
"version": "1.0.0",
"version": "1.0.1",
"description": "Stripe GraphQL API",
"license": "MIT",
"keywords": [

212
pnpm-lock.yaml generated
View File

@@ -126,7 +126,7 @@ importers:
'@types/lodash.debounce': ^4.0.7
'@types/node': ^16.11.7
'@types/pluralize': ^0.0.29
'@types/react': 18.0.25
'@types/react': 18.0.27
'@types/react-dom': 18.0.10
'@types/react-table': ^7.7.12
'@types/testing-library__jest-dom': ^5.14.5
@@ -160,7 +160,7 @@ importers:
graphql-request: ^4.3.0
graphql-tag: ^2.12.6
graphql-ws: ^5.11.2
jsdom: ^20.0.3
jsdom: ^21.0.0
lint-staged: '>=13'
lodash.debounce: ^4.0.8
msw: ^0.49.0
@@ -207,19 +207,19 @@ importers:
'@apollo/client': 3.7.3_xe4twbeoqswbn2uas4ov5melbq
'@codemirror/language': 6.3.1
'@emotion/cache': 11.10.5
'@emotion/react': 11.10.5_cuziicjcvwawlf5iuhzacuhqcy
'@emotion/react': 11.10.5_oyfwtx4tu3dbvghedp4njqx5ke
'@emotion/server': 11.4.0
'@emotion/styled': 11.10.5_hmjty4frusbltjhl3xd7udcm2y
'@emotion/styled': 11.10.5_mqygfwafdskygspsneqxystoe4
'@fontsource/inter': 4.5.14
'@fontsource/roboto-mono': 4.5.8
'@graphiql/react': 0.15.0_5wlyfn6qtlyxc6g7rpuuixnjh4
'@graphiql/react': 0.15.0_yifehlgz2dscjjxkpzxmk6wonq
'@graphiql/toolkit': 0.8.0_7fbl5omhlrpwpn5f5culy6mafe
'@headlessui/react': 1.7.4_biqbaboplfbrettd7655fr4n2y
'@heroicons/react': 1.0.6_react@18.2.0
'@hookform/resolvers': 2.9.10_react-hook-form@7.39.5
'@mui/base': 5.0.0-alpha.106_2zx2umvpluuhvlq44va5bta2da
'@mui/material': 5.10.14_thp4wrxo45nyllusrnt46mid4u
'@mui/system': 5.10.14_v64nlmo6pkqfmpmxge6otzlg54
'@mui/base': 5.0.0-alpha.106_5ndqzdd6t4rivxsukjv3i3ak2q
'@mui/material': 5.10.14_rqh7qj4464ntrqrt6banhaqg4q
'@mui/system': 5.10.14_gzalmy7izvhol7vh4xfy3dq6ua
'@mui/x-date-pickers': 5.0.8_p6r6qp7wldbu5ojdsmv4yukx2q
'@nhost/nextjs': link:../packages/nextjs
'@nhost/react-apollo': link:../integrations/react-apollo
@@ -237,7 +237,7 @@ importers:
cross-fetch: 3.1.5
date-fns: 2.29.3
generate-password: 1.7.0
graphiql: 2.2.0_5wlyfn6qtlyxc6g7rpuuixnjh4
graphiql: 2.2.0_yifehlgz2dscjjxkpzxmk6wonq
graphql: 16.6.0
graphql-request: 4.3.0_graphql@16.6.0
graphql-tag: 2.12.6_graphql@16.6.0
@@ -276,7 +276,7 @@ importers:
'@next/bundle-analyzer': 12.3.1
'@storybook/addon-actions': 6.5.14_biqbaboplfbrettd7655fr4n2y
'@storybook/addon-essentials': 6.5.14_3nfhqxhvmmuqh2httldzacusoi
'@storybook/addon-interactions': 6.5.14_ivdudmvvzzsf6tsttamhsg5viq
'@storybook/addon-interactions': 6.5.14_roeghrmujoktyydaebzfr5bz2y
'@storybook/addon-links': 6.5.14_biqbaboplfbrettd7655fr4n2y
'@storybook/addon-postcss': 2.0.0_webpack@5.75.0
'@storybook/builder-webpack5': 6.5.14_gpshdmfc4w665ax2rx6w5ydgtu
@@ -290,7 +290,7 @@ importers:
'@types/lodash.debounce': 4.0.7
'@types/node': 16.18.11
'@types/pluralize': 0.0.29
'@types/react': 18.0.25
'@types/react': 18.0.27
'@types/react-dom': 18.0.10
'@types/react-table': 7.7.12
'@types/testing-library__jest-dom': 5.14.5
@@ -298,7 +298,7 @@ importers:
'@typescript-eslint/eslint-plugin': 5.43.0_nqj4bdx4ekws7aecttskpih4py
'@typescript-eslint/parser': 5.43.0_hsf322ms6xhhd4b5ne6lb74y4a
'@vitejs/plugin-react': 3.0.0_vite@4.0.2
'@vitest/coverage-c8': 0.27.0_jsdom@20.0.3
'@vitest/coverage-c8': 0.27.0_jsdom@21.0.0
autoprefixer: 10.4.13_postcss@8.4.19
babel-loader: 8.3.0_npabyccmuonwo2rku4k53xo3hi
babel-plugin-transform-remove-console: 6.9.4
@@ -312,7 +312,7 @@ importers:
eslint-plugin-jsx-a11y: 6.6.1_eslint@8.28.0
eslint-plugin-react: 7.31.11_eslint@8.28.0
eslint-plugin-react-hooks: 4.6.0_eslint@8.28.0
jsdom: 20.0.3
jsdom: 21.0.0
lint-staged: 13.0.3
msw: 0.49.0_typescript@4.9.3
msw-storybook-addon: 1.6.3_qawx5bivyvyfvgygxsrypczwka
@@ -329,7 +329,7 @@ importers:
typescript: 4.9.3
vite: 4.0.2_@types+node@16.18.11
vite-tsconfig-paths: 4.0.3_dblhdeqtshg5ipboc6morcuhpe
vitest: 0.27.0_jsdom@20.0.3
vitest: 0.27.0_jsdom@21.0.0
webpack: 5.75.0
docs:
@@ -684,7 +684,7 @@ importers:
examples/serverless-functions:
specifiers:
'@graphql-yoga/node': ^2.13.13
'@nhost/stripe-graphql-js': ^1.0.0
'@nhost/stripe-graphql-js': ^1.0.1
'@pothos/core': ^3.21.0
'@types/express': ^4.17.13
cross-fetch: ^3.1.5
@@ -4629,7 +4629,7 @@ packages:
'@date-io/core': 2.16.0
dev: false
/@design-systems/utils/2.12.0_2zx2umvpluuhvlq44va5bta2da:
/@design-systems/utils/2.12.0_5ndqzdd6t4rivxsukjv3i3ak2q:
resolution: {integrity: sha512-Y/d2Zzr+JJfN6u1gbuBUb1ufBuLMJJRZQk+dRmw8GaTpqKx5uf7cGUYGTwN02dIb3I+Tf+cW8jcGBTRiFxdYFg==}
peerDependencies:
'@types/react': '*'
@@ -4637,7 +4637,7 @@ packages:
react-dom: '>= 16.8.6'
dependencies:
'@babel/runtime': 7.20.1
'@types/react': 18.0.25
'@types/react': 18.0.27
clsx: 1.2.1
focus-lock: 0.8.1
react: 18.2.0
@@ -4645,15 +4645,15 @@ packages:
react-merge-refs: 1.1.0
dev: true
/@devtools-ds/object-inspector/1.2.0_2zx2umvpluuhvlq44va5bta2da:
/@devtools-ds/object-inspector/1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q:
resolution: {integrity: sha512-VztcwqVwScSvYdvJVZBJYsVO/2Pew3JPpFV3T9fuCHQLlHcLYOV3aU/kBS2ScuE2O1JN0ZbobLqFLa3vQF54Fw==}
peerDependencies:
react: '>= 16.8.6'
dependencies:
'@babel/runtime': 7.7.2
'@devtools-ds/object-parser': 1.2.0
'@devtools-ds/themes': 1.2.0_2zx2umvpluuhvlq44va5bta2da
'@devtools-ds/tree': 1.2.0_2zx2umvpluuhvlq44va5bta2da
'@devtools-ds/themes': 1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q
'@devtools-ds/tree': 1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q
clsx: 1.1.0
react: 18.2.0
transitivePeerDependencies:
@@ -4667,13 +4667,13 @@ packages:
'@babel/runtime': 7.5.5
dev: true
/@devtools-ds/themes/1.2.0_2zx2umvpluuhvlq44va5bta2da:
/@devtools-ds/themes/1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q:
resolution: {integrity: sha512-LimEITorE6yWZWWuMc6OiBfLQgPrQqWbyMEmfRUDPa3PHXoAY4SpDxczfg31fgyRDUNWnZhjaJH5bBbu8VEbIw==}
peerDependencies:
react: '>= 16.8.6'
dependencies:
'@babel/runtime': 7.5.5
'@design-systems/utils': 2.12.0_2zx2umvpluuhvlq44va5bta2da
'@design-systems/utils': 2.12.0_5ndqzdd6t4rivxsukjv3i3ak2q
clsx: 1.1.0
react: 18.2.0
transitivePeerDependencies:
@@ -4681,13 +4681,13 @@ packages:
- react-dom
dev: true
/@devtools-ds/tree/1.2.0_2zx2umvpluuhvlq44va5bta2da:
/@devtools-ds/tree/1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q:
resolution: {integrity: sha512-hC4g4ocuo2eg7jsnzKdauxH0sDQiPW3KSM2+uK3kRgcmr9PzpBD5Kob+Y/WFSVKswFleftOGKL4BQLuRv0sPxA==}
peerDependencies:
react: '>= 16.8.6'
dependencies:
'@babel/runtime': 7.7.2
'@devtools-ds/themes': 1.2.0_2zx2umvpluuhvlq44va5bta2da
'@devtools-ds/themes': 1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q
clsx: 1.1.0
react: 18.2.0
transitivePeerDependencies:
@@ -5025,7 +5025,7 @@ packages:
'@docusaurus/react-loadable': 5.5.2_react@17.0.2
'@docusaurus/types': 2.2.0_sfoxds7t5ydpegc3knd667wn6m
'@types/history': 4.7.11
'@types/react': 18.0.26
'@types/react': 18.0.27
'@types/react-router-config': 5.0.6
'@types/react-router-dom': 5.3.3
react: 17.0.2
@@ -5339,7 +5339,7 @@ packages:
peerDependencies:
react: '*'
dependencies:
'@types/react': 18.0.26
'@types/react': 18.0.27
prop-types: 15.8.1
react: 17.0.2
@@ -5409,7 +5409,7 @@ packages:
'@docusaurus/plugin-content-pages': 2.2.0_56jbash75ng5psbctf36wqywr4
'@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
'@types/history': 4.7.11
'@types/react': 18.0.26
'@types/react': 18.0.27
'@types/react-router-config': 5.0.6
clsx: 1.2.1
parse-numeric-range: 1.3.0
@@ -5498,7 +5498,7 @@ packages:
react-dom: ^16.8.4 || ^17.0.0
dependencies:
'@types/history': 4.7.11
'@types/react': 18.0.26
'@types/react': 18.0.27
commander: 5.1.0
joi: 17.6.0
react: 17.0.2
@@ -5736,7 +5736,7 @@ packages:
resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==}
dev: false
/@emotion/react/11.10.5_cuziicjcvwawlf5iuhzacuhqcy:
/@emotion/react/11.10.5_oyfwtx4tu3dbvghedp4njqx5ke:
resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==}
peerDependencies:
'@babel/core': ^7.0.0
@@ -5756,7 +5756,7 @@ packages:
'@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0
'@emotion/utils': 1.2.0
'@emotion/weak-memoize': 0.3.0
'@types/react': 18.0.25
'@types/react': 18.0.27
hoist-non-react-statics: 3.3.2
react: 18.2.0
dev: false
@@ -5836,7 +5836,7 @@ packages:
resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==}
dev: false
/@emotion/styled/11.10.5_hmjty4frusbltjhl3xd7udcm2y:
/@emotion/styled/11.10.5_mqygfwafdskygspsneqxystoe4:
resolution: {integrity: sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==}
peerDependencies:
'@babel/core': ^7.0.0
@@ -5853,11 +5853,11 @@ packages:
'@babel/runtime': 7.19.4
'@emotion/babel-plugin': 11.10.5_@babel+core@7.20.2
'@emotion/is-prop-valid': 1.2.0
'@emotion/react': 11.10.5_cuziicjcvwawlf5iuhzacuhqcy
'@emotion/react': 11.10.5_oyfwtx4tu3dbvghedp4njqx5ke
'@emotion/serialize': 1.1.1
'@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0
'@emotion/utils': 1.2.0
'@types/react': 18.0.25
'@types/react': 18.0.27
react: 18.2.0
dev: false
@@ -6271,7 +6271,7 @@ packages:
/@gqty/utils/1.0.0:
resolution: {integrity: sha512-QJMlzts//d0H5mlekOZgx1a4KsTYXfxmRhhx8g/8mvzdaNVPxhFzCsv3+ljTOzbW3A08qy4jXQPWAMoTefSJDQ==}
/@graphiql/react/0.15.0_5wlyfn6qtlyxc6g7rpuuixnjh4:
/@graphiql/react/0.15.0_yifehlgz2dscjjxkpzxmk6wonq:
resolution: {integrity: sha512-kJqkdf6d4Cck05Wt5yCDZXWfs7HZgcpuoWq/v8nOa698qVaNMM3qdG4CpRsZEexku0DSSJzWWuanxd5x+sRcFg==}
peerDependencies:
graphql: ^15.5.0 || ^16.0.0
@@ -6280,7 +6280,7 @@ packages:
dependencies:
'@graphiql/toolkit': 0.8.0_7fbl5omhlrpwpn5f5culy6mafe
'@reach/combobox': 0.17.0_biqbaboplfbrettd7655fr4n2y
'@reach/dialog': 0.17.0_2zx2umvpluuhvlq44va5bta2da
'@reach/dialog': 0.17.0_5ndqzdd6t4rivxsukjv3i3ak2q
'@reach/listbox': 0.17.0_biqbaboplfbrettd7655fr4n2y
'@reach/menu-button': 0.17.0_pumtretovylab5lwhztzjp2kuy
'@reach/tooltip': 0.17.0_biqbaboplfbrettd7655fr4n2y
@@ -8045,7 +8045,7 @@ packages:
- supports-color
dev: true
/@mui/base/5.0.0-alpha.106_2zx2umvpluuhvlq44va5bta2da:
/@mui/base/5.0.0-alpha.106_5ndqzdd6t4rivxsukjv3i3ak2q:
resolution: {integrity: sha512-xJQQtwPCPwr6hGWTBdvDwHYwExn3Bw7nPQkN8Fuz8kHpZqoMVWQvvaFS557AIkkI2AFLV3DxVIMjbCvrIntBWg==}
engines: {node: '>=12.0.0'}
peerDependencies:
@@ -8058,10 +8058,10 @@ packages:
dependencies:
'@babel/runtime': 7.20.1
'@emotion/is-prop-valid': 1.2.0
'@mui/types': 7.2.1_@types+react@18.0.25
'@mui/types': 7.2.1_@types+react@18.0.27
'@mui/utils': 5.10.14_react@18.2.0
'@popperjs/core': 2.11.6
'@types/react': 18.0.25
'@types/react': 18.0.27
clsx: 1.2.1
prop-types: 15.8.1
react: 18.2.0
@@ -8073,7 +8073,7 @@ packages:
resolution: {integrity: sha512-qLgIJNOR9Dre8JiZ/neVzOf4jf88J6YtOkQqugtMrleLjbfRVUSS4LWl9CSOjNq76quYdmYWnSDgfQqOooT2cQ==}
dev: false
/@mui/material/5.10.14_thp4wrxo45nyllusrnt46mid4u:
/@mui/material/5.10.14_rqh7qj4464ntrqrt6banhaqg4q:
resolution: {integrity: sha512-HWzKVAykePMx54WtxVwZyL1W4k3xlHYIqwMw0CaXAvgB3UE9yjABZuuGr8vG5Z6CSNWamzd+s1x8u7pQPFl9og==}
engines: {node: '>=12.0.0'}
peerDependencies:
@@ -8091,14 +8091,14 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.20.1
'@emotion/react': 11.10.5_cuziicjcvwawlf5iuhzacuhqcy
'@emotion/styled': 11.10.5_hmjty4frusbltjhl3xd7udcm2y
'@mui/base': 5.0.0-alpha.106_2zx2umvpluuhvlq44va5bta2da
'@emotion/react': 11.10.5_oyfwtx4tu3dbvghedp4njqx5ke
'@emotion/styled': 11.10.5_mqygfwafdskygspsneqxystoe4
'@mui/base': 5.0.0-alpha.106_5ndqzdd6t4rivxsukjv3i3ak2q
'@mui/core-downloads-tracker': 5.10.14
'@mui/system': 5.10.14_v64nlmo6pkqfmpmxge6otzlg54
'@mui/types': 7.2.1_@types+react@18.0.25
'@mui/system': 5.10.14_gzalmy7izvhol7vh4xfy3dq6ua
'@mui/types': 7.2.1_@types+react@18.0.27
'@mui/utils': 5.10.14_react@18.2.0
'@types/react': 18.0.25
'@types/react': 18.0.27
'@types/react-transition-group': 4.4.5
clsx: 1.2.1
csstype: 3.1.1
@@ -8109,7 +8109,7 @@ packages:
react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y
dev: false
/@mui/private-theming/5.10.14_fan5qbzahqtxlm5dzefqlqx5ia:
/@mui/private-theming/5.10.14_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-3aIBe8WK65CwAPDY8nB11hYnzE1CZMymi76UnaFrA/DdGDwl5Y8F6uB+StKrkVmsqF1po7Mp2odqVkHj320gXw==}
engines: {node: '>=12.0.0'}
peerDependencies:
@@ -8121,7 +8121,7 @@ packages:
dependencies:
'@babel/runtime': 7.20.1
'@mui/utils': 5.10.14_react@18.2.0
'@types/react': 18.0.25
'@types/react': 18.0.27
prop-types: 15.8.1
react: 18.2.0
dev: false
@@ -8141,14 +8141,14 @@ packages:
dependencies:
'@babel/runtime': 7.20.1
'@emotion/cache': 11.10.5
'@emotion/react': 11.10.5_cuziicjcvwawlf5iuhzacuhqcy
'@emotion/styled': 11.10.5_hmjty4frusbltjhl3xd7udcm2y
'@emotion/react': 11.10.5_oyfwtx4tu3dbvghedp4njqx5ke
'@emotion/styled': 11.10.5_mqygfwafdskygspsneqxystoe4
csstype: 3.1.1
prop-types: 15.8.1
react: 18.2.0
dev: false
/@mui/system/5.10.14_v64nlmo6pkqfmpmxge6otzlg54:
/@mui/system/5.10.14_gzalmy7izvhol7vh4xfy3dq6ua:
resolution: {integrity: sha512-2de7XCjRb1j8Od0Stmo0LwFMLpOMNT4wzfINuExXI1TVSuyxXIXUxiC5FEgJW3GMvf/a7SUR8VOiMoKlKWzukw==}
engines: {node: '>=12.0.0'}
peerDependencies:
@@ -8165,20 +8165,20 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.20.1
'@emotion/react': 11.10.5_cuziicjcvwawlf5iuhzacuhqcy
'@emotion/styled': 11.10.5_hmjty4frusbltjhl3xd7udcm2y
'@mui/private-theming': 5.10.14_fan5qbzahqtxlm5dzefqlqx5ia
'@emotion/react': 11.10.5_oyfwtx4tu3dbvghedp4njqx5ke
'@emotion/styled': 11.10.5_mqygfwafdskygspsneqxystoe4
'@mui/private-theming': 5.10.14_3stiutgnnbnfnf3uowm5cip22i
'@mui/styled-engine': 5.10.14_dovxhg2tvkkxkdnqyoum6wzcxm
'@mui/types': 7.2.1_@types+react@18.0.25
'@mui/types': 7.2.1_@types+react@18.0.27
'@mui/utils': 5.10.14_react@18.2.0
'@types/react': 18.0.25
'@types/react': 18.0.27
clsx: 1.2.1
csstype: 3.1.1
prop-types: 15.8.1
react: 18.2.0
dev: false
/@mui/types/7.2.1_@types+react@18.0.25:
/@mui/types/7.2.1_@types+react@18.0.27:
resolution: {integrity: sha512-c5mSM7ivD8EsqK6HUi9hQPr5V7TJ/IRThUQ9nWNYPdhCGriTSQV4vL6DflT99LkM+wLiIS1rVjphpEWxERep7A==}
peerDependencies:
'@types/react': '*'
@@ -8186,7 +8186,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@types/react': 18.0.25
'@types/react': 18.0.27
dev: false
/@mui/utils/5.10.14_react@18.2.0:
@@ -8251,10 +8251,10 @@ packages:
'@date-io/dayjs': 2.16.0
'@date-io/luxon': 2.16.1
'@date-io/moment': 2.16.1
'@emotion/react': 11.10.5_cuziicjcvwawlf5iuhzacuhqcy
'@emotion/styled': 11.10.5_hmjty4frusbltjhl3xd7udcm2y
'@mui/material': 5.10.14_thp4wrxo45nyllusrnt46mid4u
'@mui/system': 5.10.14_v64nlmo6pkqfmpmxge6otzlg54
'@emotion/react': 11.10.5_oyfwtx4tu3dbvghedp4njqx5ke
'@emotion/styled': 11.10.5_mqygfwafdskygspsneqxystoe4
'@mui/material': 5.10.14_rqh7qj4464ntrqrt6banhaqg4q
'@mui/system': 5.10.14_gzalmy7izvhol7vh4xfy3dq6ua
'@mui/utils': 5.10.9_react@18.2.0
'@types/react-transition-group': 4.4.5
clsx: 1.2.1
@@ -8998,7 +8998,7 @@ packages:
tslib: 2.4.1
dev: false
/@reach/dialog/0.17.0_2zx2umvpluuhvlq44va5bta2da:
/@reach/dialog/0.17.0_5ndqzdd6t4rivxsukjv3i3ak2q:
resolution: {integrity: sha512-AnfKXugqDTGbeG3c8xDcrQDE4h9b/vnc27Sa118oQSquz52fneUeX9MeFb5ZEiBJK8T5NJpv7QUTBIKnFCAH5A==}
peerDependencies:
react: ^16.8.0 || 17.x
@@ -9009,8 +9009,8 @@ packages:
prop-types: 15.8.1
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
react-focus-lock: 2.9.2_fan5qbzahqtxlm5dzefqlqx5ia
react-remove-scroll: 2.5.5_fan5qbzahqtxlm5dzefqlqx5ia
react-focus-lock: 2.9.2_3stiutgnnbnfnf3uowm5cip22i
react-remove-scroll: 2.5.5_3stiutgnnbnfnf3uowm5cip22i
tslib: 2.4.1
transitivePeerDependencies:
- '@types/react'
@@ -9530,7 +9530,7 @@ packages:
- webpack-command
dev: true
/@storybook/addon-interactions/6.5.14_ivdudmvvzzsf6tsttamhsg5viq:
/@storybook/addon-interactions/6.5.14_roeghrmujoktyydaebzfr5bz2y:
resolution: {integrity: sha512-Stw/m3+T6ILrQPwyPgRNYtXZTBk9wE0KOSOUVrc6VixCcXm43nIYkUFiq4NL86lCBR4RKewfgl8U3Rn6chE8Tg==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -9541,7 +9541,7 @@ packages:
react-dom:
optional: true
dependencies:
'@devtools-ds/object-inspector': 1.2.0_2zx2umvpluuhvlq44va5bta2da
'@devtools-ds/object-inspector': 1.2.0_5ndqzdd6t4rivxsukjv3i3ak2q
'@storybook/addons': 6.5.14_biqbaboplfbrettd7655fr4n2y
'@storybook/api': 6.5.14_biqbaboplfbrettd7655fr4n2y
'@storybook/client-logger': 6.5.14
@@ -11828,39 +11828,39 @@ packages:
/@types/react-is/17.0.3:
resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==}
dependencies:
'@types/react': 18.0.26
'@types/react': 18.0.27
dev: false
/@types/react-router-config/5.0.6:
resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==}
dependencies:
'@types/history': 4.7.11
'@types/react': 18.0.26
'@types/react': 18.0.27
'@types/react-router': 5.1.18
/@types/react-router-dom/5.3.3:
resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==}
dependencies:
'@types/history': 4.7.11
'@types/react': 18.0.26
'@types/react': 18.0.27
'@types/react-router': 5.1.18
/@types/react-router/5.1.18:
resolution: {integrity: sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==}
dependencies:
'@types/history': 4.7.11
'@types/react': 18.0.26
'@types/react': 18.0.27
/@types/react-table/7.7.12:
resolution: {integrity: sha512-bRUent+NR/WwtDGwI/BqhZ8XnHghwHw0HUKeohzB5xN3K2qKWYE5w19e7GCuOkL1CXD9Gi1HFy7TIm2AvgWUHg==}
dependencies:
'@types/react': 18.0.26
'@types/react': 18.0.27
dev: true
/@types/react-transition-group/4.4.5:
resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==}
dependencies:
'@types/react': 18.0.26
'@types/react': 18.0.27
dev: false
/@types/react/18.0.25:
@@ -11876,6 +11876,14 @@ packages:
'@types/prop-types': 15.7.5
'@types/scheduler': 0.16.2
csstype: 3.1.1
dev: true
/@types/react/18.0.27:
resolution: {integrity: sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==}
dependencies:
'@types/prop-types': 15.7.5
'@types/scheduler': 0.16.2
csstype: 3.1.1
/@types/responselike/1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
@@ -12745,11 +12753,11 @@ packages:
- terser
dev: true
/@vitest/coverage-c8/0.27.0_jsdom@20.0.3:
/@vitest/coverage-c8/0.27.0_jsdom@21.0.0:
resolution: {integrity: sha512-jO/TAz/qUP1ssfIj6Gg1FxTRkOD5tJBiP3mwKayaqGunMsknCmxWVuFrgF1XH+FGZWLnFzR2InTjYxlyGNSgzQ==}
dependencies:
c8: 7.12.0
vitest: 0.27.0_jsdom@20.0.3
vitest: 0.27.0_jsdom@21.0.0
transitivePeerDependencies:
- '@edge-runtime/vm'
- '@vitest/browser'
@@ -20349,14 +20357,14 @@ packages:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
/graphiql/2.2.0_5wlyfn6qtlyxc6g7rpuuixnjh4:
/graphiql/2.2.0_yifehlgz2dscjjxkpzxmk6wonq:
resolution: {integrity: sha512-w1ujpCKMlkwkoUjeg0HpRiBBTm1WHAjHNkFv1TbMu6trjzz63mQ48GLZlmyQY1yhwmc+diCcvmmAt+AyvKLWWA==}
peerDependencies:
graphql: ^15.5.0 || ^16.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@graphiql/react': 0.15.0_5wlyfn6qtlyxc6g7rpuuixnjh4
'@graphiql/react': 0.15.0_yifehlgz2dscjjxkpzxmk6wonq
'@graphiql/toolkit': 0.8.0_7fbl5omhlrpwpn5f5culy6mafe
entities: 2.2.0
graphql: 16.6.0
@@ -22286,8 +22294,8 @@ packages:
- utf-8-validate
dev: true
/jsdom/20.0.3:
resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
/jsdom/21.0.0:
resolution: {integrity: sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==}
engines: {node: '>=14'}
peerDependencies:
canvas: ^2.5.0
@@ -26203,10 +26211,6 @@ packages:
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
dev: true
/psl/1.8.0:
resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==}
dev: true
/psl/1.9.0:
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
dev: true
@@ -26533,7 +26537,7 @@ packages:
/react-fast-compare/3.2.0:
resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==}
/react-focus-lock/2.9.2_fan5qbzahqtxlm5dzefqlqx5ia:
/react-focus-lock/2.9.2_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-5JfrsOKyA5Zn3h958mk7bAcfphr24jPoMoznJ8vaJF6fUrPQ8zrtEd3ILLOK8P5jvGxdMd96OxWNjDzATfR2qw==}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -26543,13 +26547,13 @@ packages:
optional: true
dependencies:
'@babel/runtime': 7.20.1
'@types/react': 18.0.25
'@types/react': 18.0.27
focus-lock: 0.11.3
prop-types: 15.8.1
react: 18.2.0
react-clientside-effect: 1.2.6_react@18.2.0
use-callback-ref: 1.3.0_fan5qbzahqtxlm5dzefqlqx5ia
use-sidecar: 1.1.2_fan5qbzahqtxlm5dzefqlqx5ia
use-callback-ref: 1.3.0_3stiutgnnbnfnf3uowm5cip22i
use-sidecar: 1.1.2_3stiutgnnbnfnf3uowm5cip22i
dev: false
/react-helmet-async/1.3.0_sfoxds7t5ydpegc3knd667wn6m:
@@ -26690,7 +26694,7 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/react-remove-scroll-bar/2.3.4_fan5qbzahqtxlm5dzefqlqx5ia:
/react-remove-scroll-bar/2.3.4_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==}
engines: {node: '>=10'}
peerDependencies:
@@ -26700,13 +26704,13 @@ packages:
'@types/react':
optional: true
dependencies:
'@types/react': 18.0.25
'@types/react': 18.0.27
react: 18.2.0
react-style-singleton: 2.2.1_fan5qbzahqtxlm5dzefqlqx5ia
react-style-singleton: 2.2.1_3stiutgnnbnfnf3uowm5cip22i
tslib: 2.4.1
dev: false
/react-remove-scroll/2.5.5_fan5qbzahqtxlm5dzefqlqx5ia:
/react-remove-scroll/2.5.5_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
engines: {node: '>=10'}
peerDependencies:
@@ -26716,13 +26720,13 @@ packages:
'@types/react':
optional: true
dependencies:
'@types/react': 18.0.25
'@types/react': 18.0.27
react: 18.2.0
react-remove-scroll-bar: 2.3.4_fan5qbzahqtxlm5dzefqlqx5ia
react-style-singleton: 2.2.1_fan5qbzahqtxlm5dzefqlqx5ia
react-remove-scroll-bar: 2.3.4_3stiutgnnbnfnf3uowm5cip22i
react-style-singleton: 2.2.1_3stiutgnnbnfnf3uowm5cip22i
tslib: 2.4.1
use-callback-ref: 1.3.0_fan5qbzahqtxlm5dzefqlqx5ia
use-sidecar: 1.1.2_fan5qbzahqtxlm5dzefqlqx5ia
use-callback-ref: 1.3.0_3stiutgnnbnfnf3uowm5cip22i
use-sidecar: 1.1.2_3stiutgnnbnfnf3uowm5cip22i
dev: false
/react-router-config/5.1.1_2dl5roaqnyqqppnjni7uetnb3a:
@@ -26797,7 +26801,7 @@ packages:
react: 18.2.0
dev: false
/react-style-singleton/2.2.1_fan5qbzahqtxlm5dzefqlqx5ia:
/react-style-singleton/2.2.1_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
peerDependencies:
@@ -26807,7 +26811,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@types/react': 18.0.25
'@types/react': 18.0.27
get-nonce: 1.0.1
invariant: 2.2.4
react: 18.2.0
@@ -29276,7 +29280,7 @@ packages:
resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==}
engines: {node: '>=6'}
dependencies:
psl: 1.8.0
psl: 1.9.0
punycode: 2.1.1
universalify: 0.1.2
dev: true
@@ -30380,7 +30384,7 @@ packages:
react: 18.2.0
wonka: 6.1.1
/use-callback-ref/1.3.0_fan5qbzahqtxlm5dzefqlqx5ia:
/use-callback-ref/1.3.0_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==}
engines: {node: '>=10'}
peerDependencies:
@@ -30390,7 +30394,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@types/react': 18.0.25
'@types/react': 18.0.27
react: 18.2.0
tslib: 2.4.1
dev: false
@@ -30463,7 +30467,7 @@ packages:
use-isomorphic-layout-effect: 1.1.2_react@17.0.2
dev: false
/use-sidecar/1.1.2_fan5qbzahqtxlm5dzefqlqx5ia:
/use-sidecar/1.1.2_3stiutgnnbnfnf3uowm5cip22i:
resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
engines: {node: '>=10'}
peerDependencies:
@@ -30473,7 +30477,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@types/react': 18.0.25
'@types/react': 18.0.27
detect-node-es: 1.1.0
react: 18.2.0
tslib: 2.4.1
@@ -31081,7 +31085,7 @@ packages:
- terser
dev: true
/vitest/0.27.0_jsdom@20.0.3:
/vitest/0.27.0_jsdom@21.0.0:
resolution: {integrity: sha512-BnOa7T6CnXVC6UgcAsvFOZ2Dtvqkt+/Nl6CRgh4qVT70vElf65XwEL6zMRyTF+h2QXJziEkxYdrLo5WCxckMLQ==}
engines: {node: '>=v14.16.0'}
hasBin: true
@@ -31111,7 +31115,7 @@ packages:
cac: 6.7.14
chai: 4.3.7
debug: 4.3.4
jsdom: 20.0.3
jsdom: 21.0.0
local-pkg: 0.4.2
picocolors: 1.0.0
source-map: 0.6.1