Compare commits

..

31 Commits

Author SHA1 Message Date
Hassan Ben Jobrane
90e8843314 Merge pull request #2421 from nhost/changeset-release/main
chore: update versions
2023-12-22 11:51:01 +01:00
github-actions[bot]
aa5b360932 chore: update versions 2023-12-22 10:30:28 +00:00
Hassan Ben Jobrane
daa4b8b2ad Merge pull request #2400 from nhost/changeset-release/main
chore: update versions
2023-12-22 11:28:17 +01:00
Seth Deegan
a1c5c97a59 chore (examples/docker-compose): update README.md to explain why hasura-console is needed (#2395) 2023-12-11 20:14:59 +01:00
Alex Nguyen
b338793d6d Update hasura-auth-client.ts (#2408) 2023-12-11 13:44:00 +01:00
Hassan Ben Jobrane
b1fb4b2400 chore: run pnpm install 2023-12-07 19:49:14 +01:00
github-actions[bot]
f75e023672 chore: update versions 2023-12-05 15:18:53 +00:00
Hassan Ben Jobrane
8e78c1ff00 Merge pull request #2406 from nhost/fix/ci/revert
chore(ci): revert ci changes to use `pull_request`
2023-12-05 16:16:39 +01:00
Hassan Ben Jobrane
9cbb0b2986 chore(ci): revert ci changes to use pull_request 2023-12-05 14:09:53 +01:00
Hassan Ben Jobrane
363a3b92e5 Merge pull request #2405 from nhost/fix/ci/checkout-ref
fix(ci): add ref to all checkout steps
2023-12-05 12:58:47 +01:00
Hassan Ben Jobrane
6a078fc972 fix(ci): add ref to all checkout steps 2023-12-05 12:51:47 +01:00
Hassan Ben Jobrane
1091e9674a Merge pull request #2404 from nhost/fix/ci-checkout-step
chore(ci): add ref to checkout step
2023-12-05 12:26:57 +01:00
Hassan Ben Jobrane
9738108d58 chore(ci): add ref to checkout step 2023-12-05 12:13:53 +01:00
Hassan Ben Jobrane
65951e1d1d Merge pull request #2403 from nhost/ci_target
chore(ci): change to pull_request_target to run workflows "locally"
2023-12-05 11:55:30 +01:00
David Barroso
b4af994a58 chore(ci): change pull_request to pull_request_target to run workflows locally 2023-12-05 11:39:58 +01:00
Hassan Ben Jobrane
c6347e10bc Merge pull request #2402 from nhost/fix/ci/pin-install-nhost-dep
fix(ci): pin `@nhost/nhost-js` dep version in sveltekit quickstart
2023-12-04 17:30:10 +01:00
Hassan Ben Jobrane
278a641bc1 fix(ci): pin @nhost/nhost-js dep version in sveltekit quickstart 2023-12-04 16:18:02 +01:00
Hassan Ben Jobrane
3320ddd8c8 Merge pull request #2393 from nhost/chore/sdk/remove-backendUrl
chore: remove support for using `backendUrl`
2023-12-04 15:05:52 +01:00
Hassan Ben Jobrane
bc9eff6e41 chore: update the changeset to reflect a major version increment 2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
258c608882 Revert "chore: hardcode staging auth URL for testing"
This reverts commit d8c0bb5ea4e073a7131df3726728845b2bc5e1a1.
2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
ae84f269d4 chore: hardcode staging auth URL for testing 2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
0327250b19 Revert "chore: test different subdomain"
This reverts commit 9dfd9399a0a0b1ec931e02304dbe62183b2cb500.
2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
7f56eabd24 chore: test different subdomain 2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
be110df83a fix: refactor urlFromSubdomain and fix unit tests 2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
361e648daf chore: add changeset 2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
8a72e20e3d chore: refactor generateAppServiceUrl function and remove unused code 2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
125ec390ca chore: add storage service URL to Nhost client
configuration
2023-12-04 14:38:56 +01:00
Hassan Ben Jobrane
7cc788a373 refactor: remove backendUrl from Nhost client initialization 2023-12-04 14:38:56 +01:00
David Barroso
2a04bc9e5d chore(docs): added functions to custom domains documentation (#2399) 2023-12-04 11:11:08 +01:00
Hassan Ben Jobrane
f7c2148ace Merge pull request #2392 from nhost/feat/dashboard/functions-custom-domains
feat(dashboard): add serverless functions custom domain settings
2023-11-30 14:43:18 +01:00
Hassan Ben Jobrane
78d35eed09 feat(dashboard): add serverless functions custom domain settings 2023-11-30 12:11:22 +01:00
57 changed files with 527 additions and 171 deletions

View File

@@ -1,5 +1,24 @@
# @nhost/dashboard
## 1.0.1
### Patch Changes
- @nhost/react-apollo@7.0.1
- @nhost/nextjs@2.0.1
## 1.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/nextjs@2.0.0
- @nhost/react-apollo@7.0.0
## 0.21.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/dashboard",
"version": "0.21.1",
"version": "1.0.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",

View File

@@ -1,7 +1,6 @@
import type { ProjectFragment } from '@/utils/__generated__/graphql';
import { test, vi } from 'vitest';
import generateAppServiceUrl, {
defaultLocalBackendSlugs,
defaultRemoteBackendSlugs,
} from './generateAppServiceUrl';
@@ -138,7 +137,7 @@ test('should be able to override the default remote backend slugs', () => {
process.env.NEXT_PUBLIC_ENV = 'production';
expect(
generateAppServiceUrl('test', region, 'hasura', defaultLocalBackendSlugs, {
generateAppServiceUrl('test', region, 'hasura', {
...defaultRemoteBackendSlugs,
hasura: '/lorem-ipsum',
}),
@@ -187,24 +186,3 @@ test('should construct service URLs based on environment variables', () => {
'https://localdev4.nhost.run/v1/functions',
);
});
test('should generate a basic subdomain with a custom port if provided', () => {
process.env.NEXT_PUBLIC_NHOST_BACKEND_URL = `http://localhost:1338`;
process.env.NEXT_PUBLIC_NHOST_PLATFORM = 'true';
expect(generateAppServiceUrl('test', region, 'auth')).toBe(
`http://localhost:1338/v1/auth`,
);
expect(generateAppServiceUrl('test', region, 'storage')).toBe(
`http://localhost:1338/v1/files`,
);
expect(generateAppServiceUrl('test', region, 'graphql')).toBe(
`http://localhost:1338/v1/graphql`,
);
expect(generateAppServiceUrl('test', region, 'functions')).toBe(
`http://localhost:1338/v1/functions`,
);
});

View File

@@ -62,7 +62,6 @@ export default function generateAppServiceUrl(
subdomain: string,
region: ProjectFragment['region'],
service: NhostService,
localBackendSlugs = defaultLocalBackendSlugs,
remoteBackendSlugs = defaultRemoteBackendSlugs,
) {
const IS_PLATFORM = isPlatform();
@@ -87,12 +86,6 @@ export default function generateAppServiceUrl(
return serviceUrls[service];
}
// This is only used when running the dashboard locally against its own
// backend.
if (process.env.NEXT_PUBLIC_ENV === 'dev') {
return `${process.env.NEXT_PUBLIC_NHOST_BACKEND_URL}${localBackendSlugs[service]}`;
}
const constructedDomain = [
subdomain,
service,

View File

@@ -0,0 +1,157 @@
import { useUI } from '@/components/common/UIProvider';
import { Form } from '@/components/form/Form';
import { SettingsContainer } from '@/components/layout/SettingsContainer';
import { ActivityIndicator } from '@/components/ui/v2/ActivityIndicator';
import { Input } from '@/components/ui/v2/Input';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { VerifyDomain } from '@/features/projects/custom-domains/settings/components/VerifyDomain';
import {
useGetServerlessFunctionsSettingsQuery,
useUpdateConfigMutation,
type ConfigIngressUpdateInput,
} from '@/generated/graphql';
import { getToastStyleProps } from '@/utils/constants/settings';
import { getServerError } from '@/utils/getServerError';
import { yupResolver } from '@hookform/resolvers/yup';
import { useEffect, useState } from 'react';
import { FormProvider, useForm } from 'react-hook-form';
import { toast } from 'react-hot-toast';
import * as Yup from 'yup';
const validationSchema = Yup.object({
functions_fqdn: Yup.string(),
});
export type ServerlessFunctionsDomainFormValues = Yup.InferType<
typeof validationSchema
>;
export default function ServerlessFunctionsDomain() {
const { maintenanceActive } = useUI();
const [isVerified, setIsVerified] = useState(false);
const { currentProject, refetch: refetchWorkspaceAndProject } =
useCurrentWorkspaceAndProject();
const [updateConfig] = useUpdateConfigMutation();
const form = useForm<{ functions_fqdn: string }>({
reValidateMode: 'onSubmit',
defaultValues: { functions_fqdn: null },
resolver: yupResolver(validationSchema),
});
const { data, loading, error } = useGetServerlessFunctionsSettingsQuery({
variables: {
appId: currentProject.id,
},
});
const { networking } = data?.config?.functions?.resources || {};
const initialValue = networking?.ingresses?.[0]?.fqdn?.[0];
useEffect(() => {
if (!loading && data) {
form.reset({ functions_fqdn: initialValue });
}
}, [data, loading, form, initialValue]);
if (loading) {
return (
<ActivityIndicator
delay={1000}
label="Loading Serverless Functions Domain Settings..."
className="justify-center"
/>
);
}
if (error) {
throw error;
}
const { formState, register, watch } = form;
const isDirty = Object.keys(formState.dirtyFields).length > 0;
const functions_fqdn = watch('functions_fqdn');
async function handleSubmit(formValues: ServerlessFunctionsDomainFormValues) {
const ingresses: ConfigIngressUpdateInput[] =
formValues.functions_fqdn.length > 0
? [{ fqdn: [formValues.functions_fqdn] }]
: [];
const updateConfigPromise = updateConfig({
variables: {
appId: currentProject.id,
config: {
functions: {
resources: {
networking: {
ingresses,
},
},
},
},
},
});
try {
await toast.promise(
updateConfigPromise,
{
loading: `Serverless Functions domain is being updated...`,
success: `Serverless Functions domain has been updated successfully.`,
error: getServerError(
`An error occurred while trying to update the Serverless Functions domain.`,
),
},
getToastStyleProps(),
);
form.reset(formValues);
await refetchWorkspaceAndProject();
} catch {
// Note: The toast will handle the error.
}
}
return (
<FormProvider {...form}>
<Form onSubmit={handleSubmit}>
<SettingsContainer
title="Serverless Functions Domain"
description="Enter below your custom domain for Serverless Functions."
slotProps={{
submitButton: {
disabled:
!isDirty || maintenanceActive || (!isVerified && !initialValue),
loading: formState.isSubmitting,
},
}}
className="grid grid-flow-row px-4 gap-y-4 gap-x-4 lg:grid-cols-5"
>
<Input
{...register('functions_fqdn')}
id="functions_fqdn"
name="functions_fqdn"
type="string"
fullWidth
className="col-span-5 lg:col-span-2"
placeholder="functions.mydomain.dev"
error={Boolean(formState.errors.functions_fqdn?.message)}
helperText={formState.errors.functions_fqdn?.message}
slotProps={{ inputRoot: { min: 1, max: 100 } }}
/>
<div className="col-span-5 row-start-2">
<VerifyDomain
recordType="CNAME"
hostname={functions_fqdn}
value={`lb.${currentProject.region.awsName}.${currentProject.region.domain}.`}
onHostNameVerified={() => setIsVerified(true)}
/>
</div>
</SettingsContainer>
</Form>
</FormProvider>
);
}

View File

@@ -0,0 +1 @@
export { default as ServerlessFunctionsDomain } from './ServerlessFunctionsDomain';

View File

@@ -16,7 +16,6 @@ import { useAppClient } from '@/features/projects/common/hooks/useAppClient';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { useIsPlatform } from '@/features/projects/common/hooks/useIsPlatform';
import {
defaultLocalBackendSlugs,
defaultRemoteBackendSlugs,
generateAppServiceUrl,
} from '@/features/projects/common/utils/generateAppServiceUrl';
@@ -110,7 +109,6 @@ export default function SystemEnvironmentVariableSettings() {
currentProject?.subdomain,
currentProject?.region,
'hasura',
defaultLocalBackendSlugs,
{ ...defaultRemoteBackendSlugs, hasura: '/console' },
),
},

View File

@@ -0,0 +1,13 @@
query GetServerlessFunctionsSettings($appId: uuid!) {
config(appID: $appId, resolve: false) {
functions {
resources {
networking {
ingresses {
fqdn
}
}
}
}
}
}

View File

@@ -11,7 +11,6 @@ import { Text } from '@/components/ui/v2/Text';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { useIsPlatform } from '@/features/projects/common/hooks/useIsPlatform';
import {
defaultLocalBackendSlugs,
defaultRemoteBackendSlugs,
generateAppServiceUrl,
} from '@/features/projects/common/utils/generateAppServiceUrl';
@@ -39,7 +38,6 @@ export default function HasuraPage() {
currentProject?.subdomain,
currentProject?.region,
'hasura',
defaultLocalBackendSlugs,
{ ...defaultRemoteBackendSlugs, hasura: '/console' },
);

View File

@@ -10,6 +10,7 @@ import { AuthDomain } from '@/features/projects/custom-domains/settings/componen
import { DatabaseDomain } from '@/features/projects/custom-domains/settings/components/DatabaseDomain';
import { HasuraDomain } from '@/features/projects/custom-domains/settings/components/HasuraDomain';
import { RunServiceDomains } from '@/features/projects/custom-domains/settings/components/RunServiceDomains';
import { ServerlessFunctionsDomain } from '@/features/projects/custom-domains/settings/components/ServerlessFunctionsDomain';
import { type ReactElement } from 'react';
export default function CustomDomains() {
@@ -36,12 +37,12 @@ export default function CustomDomains() {
className="grid max-w-5xl grid-flow-row gap-6 bg-transparent"
rootClassName="bg-transparent"
>
<Box className="flex flex-row items-center gap-4 overflow-hidden rounded-lg border-1 p-4">
<Box className="flex flex-row items-center gap-4 p-4 overflow-hidden rounded-lg border-1">
<div className="flex flex-col space-y-2">
<Text className="text-lg font-semibold">Custom Domains</Text>
<Text color="secondary">
Add a custom domain to Auth, Hasura, PostgreSQL, and your Run
Add a custom domain to Auth, Hasura, PostgreSQL, and your Run
services for only a $10 flat fee 🚀 <br /> Learn more about
<Link
href="https://docs.nhost.io/platform/custom-domains"
@@ -51,7 +52,7 @@ export default function CustomDomains() {
className="ml-1 font-medium"
>
Custom Domains
<ArrowSquareOutIcon className="ml-1 h-4 w-4" />
<ArrowSquareOutIcon className="w-4 h-4 ml-1" />
</Link>
</Text>
</div>
@@ -61,6 +62,7 @@ export default function CustomDomains() {
<HasuraDomain />
<DatabaseDomain />
<ServerlessFunctionsDomain />
<RunServiceDomains />
</Container>
);

View File

@@ -528,6 +528,7 @@ export type ConfigAuthMethodWebauthnInsertInput = {
export type ConfigAuthMethodWebauthnRelyingParty = {
__typename?: 'ConfigAuthMethodWebauthnRelyingParty';
id?: Maybe<Scalars['String']>;
name?: Maybe<Scalars['String']>;
origins?: Maybe<Array<Scalars['ConfigUrl']>>;
};
@@ -536,16 +537,19 @@ export type ConfigAuthMethodWebauthnRelyingPartyComparisonExp = {
_and?: InputMaybe<Array<ConfigAuthMethodWebauthnRelyingPartyComparisonExp>>;
_not?: InputMaybe<ConfigAuthMethodWebauthnRelyingPartyComparisonExp>;
_or?: InputMaybe<Array<ConfigAuthMethodWebauthnRelyingPartyComparisonExp>>;
id?: InputMaybe<ConfigStringComparisonExp>;
name?: InputMaybe<ConfigStringComparisonExp>;
origins?: InputMaybe<ConfigUrlComparisonExp>;
};
export type ConfigAuthMethodWebauthnRelyingPartyInsertInput = {
id?: InputMaybe<Scalars['String']>;
name?: InputMaybe<Scalars['String']>;
origins?: InputMaybe<Array<Scalars['ConfigUrl']>>;
};
export type ConfigAuthMethodWebauthnRelyingPartyUpdateInput = {
id?: InputMaybe<Scalars['String']>;
name?: InputMaybe<Scalars['String']>;
origins?: InputMaybe<Array<Scalars['ConfigUrl']>>;
};
@@ -12116,6 +12120,7 @@ export type Mutation_RootBackupApplicationDatabaseArgs = {
export type Mutation_RootBillingFinishSubscriptionArgs = {
appID: Scalars['uuid'];
appName: Scalars['String'];
planID: Scalars['uuid'];
subdomain: Scalars['String'];
subscriptionID: Scalars['String'];
};
@@ -22300,6 +22305,13 @@ export type GetResourcesQueryVariables = Exact<{
export type GetResourcesQuery = { __typename?: 'query_root', config?: { __typename?: 'ConfigConfig', auth?: { __typename?: 'ConfigAuth', resources?: { __typename?: 'ConfigResources', replicas?: any | null, compute?: { __typename?: 'ConfigResourcesCompute', cpu: any, memory: any } | null } | null } | null, hasura: { __typename?: 'ConfigHasura', resources?: { __typename?: 'ConfigResources', replicas?: any | null, compute?: { __typename?: 'ConfigResourcesCompute', cpu: any, memory: any } | null } | null }, postgres?: { __typename?: 'ConfigPostgres', resources?: { __typename?: 'ConfigPostgresResources', replicas?: any | null, compute?: { __typename?: 'ConfigResourcesCompute', cpu: any, memory: any } | null } | null } | null, storage?: { __typename?: 'ConfigStorage', resources?: { __typename?: 'ConfigResources', replicas?: any | null, compute?: { __typename?: 'ConfigResourcesCompute', cpu: any, memory: any } | null } | null } | null } | null };
export type GetServerlessFunctionsSettingsQueryVariables = Exact<{
appId: Scalars['uuid'];
}>;
export type GetServerlessFunctionsSettingsQuery = { __typename?: 'query_root', config?: { __typename?: 'ConfigConfig', functions?: { __typename?: 'ConfigFunctions', resources?: { __typename?: 'ConfigFunctionsResources', networking?: { __typename?: 'ConfigNetworking', ingresses?: Array<{ __typename?: 'ConfigIngress', fqdn?: Array<string> | null }> | null } | null } | null } | null } | null };
export type GetStorageSettingsQueryVariables = Exact<{
appId: Scalars['uuid'];
}>;
@@ -23695,6 +23707,52 @@ export type GetResourcesQueryResult = Apollo.QueryResult<GetResourcesQuery, GetR
export function refetchGetResourcesQuery(variables: GetResourcesQueryVariables) {
return { query: GetResourcesDocument, variables: variables }
}
export const GetServerlessFunctionsSettingsDocument = gql`
query GetServerlessFunctionsSettings($appId: uuid!) {
config(appID: $appId, resolve: false) {
functions {
resources {
networking {
ingresses {
fqdn
}
}
}
}
}
}
`;
/**
* __useGetServerlessFunctionsSettingsQuery__
*
* To run a query within a React component, call `useGetServerlessFunctionsSettingsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetServerlessFunctionsSettingsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetServerlessFunctionsSettingsQuery({
* variables: {
* appId: // value for 'appId'
* },
* });
*/
export function useGetServerlessFunctionsSettingsQuery(baseOptions: Apollo.QueryHookOptions<GetServerlessFunctionsSettingsQuery, GetServerlessFunctionsSettingsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetServerlessFunctionsSettingsQuery, GetServerlessFunctionsSettingsQueryVariables>(GetServerlessFunctionsSettingsDocument, options);
}
export function useGetServerlessFunctionsSettingsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetServerlessFunctionsSettingsQuery, GetServerlessFunctionsSettingsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetServerlessFunctionsSettingsQuery, GetServerlessFunctionsSettingsQueryVariables>(GetServerlessFunctionsSettingsDocument, options);
}
export type GetServerlessFunctionsSettingsQueryHookResult = ReturnType<typeof useGetServerlessFunctionsSettingsQuery>;
export type GetServerlessFunctionsSettingsLazyQueryHookResult = ReturnType<typeof useGetServerlessFunctionsSettingsLazyQuery>;
export type GetServerlessFunctionsSettingsQueryResult = Apollo.QueryResult<GetServerlessFunctionsSettingsQuery, GetServerlessFunctionsSettingsQueryVariables>;
export function refetchGetServerlessFunctionsSettingsQuery(variables: GetServerlessFunctionsSettingsQueryVariables) {
return { query: GetServerlessFunctionsSettingsDocument, variables: variables }
}
export const GetStorageSettingsDocument = gql`
query GetStorageSettings($appId: uuid!) {
config(appID: $appId, resolve: false) {

View File

@@ -5,16 +5,6 @@ export function isPlatform() {
return process.env.NEXT_PUBLIC_NHOST_PLATFORM === 'true';
}
/**
* Backend URL for the locally running instance. This is only used when running
* the Nhost Dashboard locally.
*/
export function getLocalBackendUrl() {
return `http://localhost:${
process.env.NEXT_PUBLIC_NHOST_LOCAL_SERVICES_PORT || '1337'
}`;
}
/**
* Admin secret for Hasura.
*/

View File

@@ -9,16 +9,11 @@ import { NhostClient } from '@nhost/nextjs';
// eslint-disable-next-line no-nested-ternary
const nhost = isPlatform()
? new NhostClient({ backendUrl: process.env.NEXT_PUBLIC_NHOST_BACKEND_URL })
: getAuthServiceUrl() &&
getGraphqlServiceUrl() &&
getStorageServiceUrl() &&
getFunctionsServiceUrl()
? new NhostClient({
authUrl: getAuthServiceUrl(),
graphqlUrl: getGraphqlServiceUrl(),
storageUrl: getStorageServiceUrl(),
functionsUrl: getFunctionsServiceUrl(),
storageUrl: getStorageServiceUrl(),
})
: new NhostClient({ subdomain: 'local' });

View File

@@ -1,5 +1,11 @@
# @nhost/docs
## 0.7.4
### Patch Changes
- 2a04bc9e5: added functions to custom domains documentation
## 0.7.3
### Patch Changes

View File

@@ -29,26 +29,20 @@ Follow the instructions in the **Custom Domain** section of your project's setti
The first step is to add a CNAME record in your DNS provider for each of the services you want a custom domain for. You can find the instructions in the **dashboard** tab.
For Hasura, Auth, and PostgreSQL, custom domains are defined in the default `./nhost/config.toml` as follows:
For Hasura, Auth, Functions, and PostgreSQL, custom domains are defined in the default `./nhost/config.toml` as follows:
```
[hasura]
[hasura.resources.networking]
[[hasura.resources.networking.ingresses]]
fqdn = ['hasura.custom-domain.com']
[auth]
[auth.resources.networking]
[[auth.resources.networking.ingresses]]
fqdn = ['auth.custom-domain.com']
[postgres]
[postgres.resources.networking]
[[postgres.resources.networking.ingresses]]
fqdn = ['postgres.custom-domain.com']
[[functions.resources.networking.ingresses]]
fqdn = ['functions.custom-domain.com']
```
For Run services, typically in `nhost-service.toml` specific to the service:

View File

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

View File

@@ -1,5 +1,11 @@
# @nhost-examples/docker-compose
## 0.0.6
### Patch Changes
- a1c5c97a5: Clarify instructions for running the Nhost dashboard with Docker Compose
## 0.0.5
### Patch Changes

View File

@@ -25,10 +25,12 @@ The following endpoints are now exposed:
## Running the Nhost dashboard locally
In order to use the Nhost dashboard, you need to run the [Hasura console locally from the Hasura CLI](https://hasura.io/docs/latest/hasura-cli/commands/hasura_console/):
In order for you to be able to make edits to the database from the Nhost dashboard, you need to run the [Hasura console locally from the Hasura CLI](https://hasura.io/docs/latest/hasura-cli/commands/hasura_console/):
```sh
hasura console
```
The Nhost Dashboard also requires the Hasura admin secret to `nhost-admin-secret`. This will change in the future. If you can't wait, don't hesitate to contribute.
The Nhost Dashboard [uses](https://github.com/nhost/nhost/discussions/2398) the [Hasura migrations API](https://hasura.io/docs/latest/hasura-cli/commands/hasura_console/#options) in order to make edits to the database. It runs over port 9693 and is only accessible through running the Hasura console from the CLI. Because the Docker compose still only uses the graphql-engine Hasura Docker image and does not include the CLI image, that is why you need to run it locally. See https://github.com/nhost/nhost/issues/1220. Users are welcome to contibute a Docker compose that includes the CLI image to resolve this.
The Nhost Dashboard also requires the Hasura admin secret to `nhost-admin-secret` specified in the `.env` file.

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/docker-compose",
"version": "0.0.5",
"version": "0.0.6",
"private": true,
"scripts": {
"e2e": "vitest run"

View File

@@ -1,5 +1,16 @@
# @nhost-examples/multi-tenant-one-to-many
## 2.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/nhost-js@3.0.0
## 1.0.4
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "@nhost-examples/multi-tenant-one-to-many",
"private": true,
"version": "1.0.4",
"version": "2.0.0",
"description": "",
"main": "index.js",
"scripts": {},

View File

@@ -1,7 +1,7 @@
import { NhostClient } from "@nhost/nhost-js";
import { NhostClient } from '@nhost/nhost-js'
const nhost = new NhostClient({
backendUrl: "http://localhost:1337",
});
subdomain: 'local'
})
export { nhost };
export { nhost }

View File

@@ -1,5 +1,18 @@
# @nhost-examples/nextjs-server-components
## 0.1.4
### Patch Changes
- @nhost/nhost-js@3.0.1
## 0.1.3
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/nhost-js@3.0.0
## 0.1.2
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/nextjs-server-components",
"version": "0.1.2",
"version": "0.1.4",
"private": true,
"scripts": {
"dev": "next dev",

View File

@@ -9,7 +9,7 @@
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
"install-browsers": "pnpm dlx playwright@1.31.0 install --with-deps",
"add-nhost-js": "pnpm add @nhost/nhost-js --ignore-workspace",
"add-nhost-js": "pnpm add @nhost/nhost-js@2.2.18 --ignore-workspace",
"test": "pnpm install-browsers && pnpm add-nhost-js && pnpm dlx playwright@1.31.0 test",
"lint": "eslint .",
"postinstall": "pnpm add-nhost-js"

View File

@@ -1,5 +1,16 @@
# @nhost-examples/react-gqty
## 1.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/react@3.0.0
## 0.0.9
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "@nhost-examples/react-gqty",
"private": true,
"version": "0.0.9",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1,7 +1,8 @@
import { NhostClient } from '@nhost/react'
const nhost = new NhostClient({
backendUrl: import.meta.env.VITE_NHOST_URL || 'http://localhost:1337'
subdomain: import.meta.env.VITE_NHOST_SUBDOMAIN || 'local',
region: import.meta.env.VITE_NHOST_REGION
})
export { nhost }

View File

@@ -1,5 +1,18 @@
# @nhost/apollo
## 6.0.1
### Patch Changes
- @nhost/nhost-js@3.0.1
## 6.0.0
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/nhost-js@3.0.0
## 5.2.22
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/apollo",
"version": "5.2.22",
"version": "6.0.1",
"description": "Nhost Apollo Client library",
"license": "MIT",
"keywords": [

View File

@@ -1,5 +1,20 @@
# @nhost/react-apollo
## 7.0.1
### Patch Changes
- @nhost/apollo@6.0.1
- @nhost/react@3.0.1
## 7.0.0
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/react@3.0.0
- @nhost/apollo@6.0.0
## 6.0.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/react-apollo",
"version": "6.0.1",
"version": "7.0.1",
"description": "Nhost React Apollo client",
"license": "MIT",
"keywords": [

View File

@@ -1,5 +1,18 @@
# @nhost/react-urql
## 4.0.1
### Patch Changes
- @nhost/react@3.0.1
## 4.0.0
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/react@3.0.0
## 3.0.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/react-urql",
"version": "3.0.1",
"version": "4.0.1",
"description": "Nhost React URQL client",
"license": "MIT",
"keywords": [

View File

@@ -1,5 +1,11 @@
# @nhost/hasura-auth-js
## 2.1.10
### Patch Changes
- b338793d6: Fix typo
## 2.1.9
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/hasura-auth-js",
"version": "2.1.9",
"version": "2.1.10",
"description": "Hasura-auth client",
"license": "MIT",
"keywords": [

View File

@@ -633,7 +633,7 @@ export class HasuraAuthClient {
* @example
* ```ts
* // if `x-hasura-company-id` exists as a custom claim
* const companyId = nhost.auth.getHsauraClaim('company-id')
* const companyId = nhost.auth.getHasuraClaim('company-id')
* ```
*
* @param name Name of the variable. You don't have to specify `x-hasura-`.

View File

@@ -1,5 +1,22 @@
# @nhost/nextjs
## 2.0.1
### Patch Changes
- @nhost/react@3.0.1
## 2.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/react@3.0.0
## 1.13.40
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/nextjs",
"version": "1.13.40",
"version": "2.0.1",
"description": "Nhost NextJS library",
"license": "MIT",
"keywords": [

View File

@@ -1,9 +1,9 @@
import {
AuthMachine,
NHOST_REFRESH_TOKEN_KEY,
NhostClient,
NhostReactClientConstructorParams,
NhostSession,
NHOST_REFRESH_TOKEN_KEY,
VanillaNhostClient
} from '@nhost/react'
import Cookies from 'js-cookie'
@@ -29,27 +29,11 @@ export type CreateServerSideClientParams = Partial<
* @returns instance of `NhostClient` that is ready to use on the server side (signed in or signed out)
*/
export const createServerSideClient = async (
params: string | CreateServerSideClientParams,
params: CreateServerSideClientParams,
context: GetServerSidePropsContext
): Promise<NhostClient> => {
let clientParams: NhostReactClientConstructorParams
if (typeof params === 'string') {
console.warn(
'Deprecation Notice: Backend URL is no longer supported. Please use subdomain + region or individual service URLs.'
)
clientParams = {
backendUrl: params
}
} else {
clientParams = {
...params
}
}
const nhost = new VanillaNhostClient({
...clientParams,
...params,
clientStorageType: 'custom',
clientStorage: {
getItem: (key) => {

View File

@@ -41,12 +41,13 @@ import { createServerSideClient, CreateServerSideClientParams } from './create-s
* }
* ```
*
* @param backendUrl - URL of your Nhost application
* @param subdomain - URL of your Nhost application
* @param region - Region of your Nhost application
* @param context - Next.js context
* @returns Nhost session
*/
export const getNhostSession = async (
params: string | CreateServerSideClientParams,
params: CreateServerSideClientParams,
context: GetServerSidePropsContext
): Promise<NhostSession | null> => {
const nhost = await createServerSideClient(params, context)

View File

@@ -1,5 +1,18 @@
# @nhost/nhost-js
## 3.0.1
### Patch Changes
- Updated dependencies [b338793d6]
- @nhost/hasura-auth-js@2.1.10
## 3.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
## 2.2.18
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/nhost-js",
"version": "2.2.18",
"version": "3.0.1",
"description": "Nhost JavaScript SDK",
"license": "MIT",
"keywords": [

View File

@@ -7,10 +7,7 @@ import { NhostClientConstructorParams } from '../utils/types'
* Creates a client for Auth from either a subdomain or a URL
*/
export function createAuthClient(params: NhostClientConstructorParams) {
const authUrl =
'subdomain' in params || 'backendUrl' in params
? urlFromSubdomain(params, 'auth')
: params.authUrl
const authUrl = 'subdomain' in params ? urlFromSubdomain(params, 'auth') : params.authUrl
if (!authUrl) {
throw new Error('Please provide `subdomain` or `authUrl`.')

View File

@@ -11,7 +11,7 @@ import {
*/
export function createFunctionsClient(params: NhostClientConstructorParams) {
const functionsUrl =
'subdomain' in params || 'backendUrl' in params
'subdomain' in params
? urlFromSubdomain(params, 'functions')
: params.functionsUrl

View File

@@ -6,10 +6,7 @@ import { NhostClientConstructorParams } from '../utils/types'
* Creates a client for GraphQL from either a subdomain or a URL
*/
export function createGraphqlClient(params: NhostClientConstructorParams) {
const graphqlUrl =
'subdomain' in params || 'backendUrl' in params
? urlFromSubdomain(params, 'graphql')
: params.graphqlUrl
const graphqlUrl = 'subdomain' in params ? urlFromSubdomain(params, 'graphql') : params.graphqlUrl
if (!graphqlUrl) {
throw new Error('Please provide `subdomain` or `graphqlUrl`.')

View File

@@ -7,10 +7,7 @@ import { NhostClientConstructorParams } from '../utils/types'
* Creates a client for Storage from either a subdomain or a URL
*/
export function createStorageClient(params: NhostClientConstructorParams) {
const storageUrl =
'subdomain' in params || 'backendUrl' in params
? urlFromSubdomain(params, 'storage')
: params.storageUrl
const storageUrl = 'subdomain' in params ? urlFromSubdomain(params, 'storage') : params.storageUrl
if (!storageUrl) {
throw new Error('Please provide `subdomain` or `storageUrl`.')

View File

@@ -5,25 +5,20 @@ export const LOCALHOST_REGEX =
/^((?<protocol>http[s]?):\/\/)?(?<host>(localhost|local))(:(?<port>(\d+|__\w+__)))?$/
/**
* \`backendUrl\` should now be used only when self-hosting
* \`subdomain\` and `region` should be used instead when using the Nhost platform
* \`subdomain\` and `region` should be used when running the Nhost platform
*
* @param backendOrSubdomain
* @param subdomainAndRegion
* @param service
* @returns
*/
export function urlFromSubdomain(
backendOrSubdomain: Pick<NhostClientConstructorParams, 'region' | 'subdomain' | 'backendUrl'>,
subdomainAndRegion: Pick<NhostClientConstructorParams, 'region' | 'subdomain'>,
service: string
): string {
const { backendUrl, subdomain, region } = backendOrSubdomain
if (backendUrl) {
return `${backendUrl}/v1/${service}`
}
const { subdomain, region } = subdomainAndRegion
if (!subdomain) {
throw new Error('Either `backendUrl` or `subdomain` must be set.')
throw new Error('A `subdomain` must be set.')
}
// check if subdomain is [http[s]://]localhost[:port] or [http[s]://]local[:port]

View File

@@ -32,14 +32,6 @@ export interface ActionSuccessState {
isSuccess: boolean
}
export type BackendUrl = {
/**
* Nhost backend URL
* Will be deprecated in a future release. Please look at 'subdomain' and 'region' instead.
*/
backendUrl: string
}
export type Subdomain = {
/**
* Project subdomain (e.g. `ieingiwnginwnfnegqwvdqwdwq`)
@@ -66,11 +58,8 @@ export type ServiceUrls = {
functionsUrl?: string
}
export type BackendOrSubdomain = BackendUrl | Subdomain
export interface NhostClientConstructorParams
extends Partial<BackendUrl>,
Partial<Subdomain>,
extends Partial<Subdomain>,
Partial<ServiceUrls>,
Omit<NhostAuthConstructorParams, 'url'> {
/**

View File

@@ -2,20 +2,6 @@ import { describe, expect, it } from 'vitest'
import { buildUrl, LOCALHOST_REGEX, urlFromSubdomain } from '../src/utils/helpers'
describe('urlFromParams', () => {
describe('when using backendUrl', () => {
it('should return the full url with the path "/v1/auth" concatenated', async () => {
const url = urlFromSubdomain({ backendUrl: 'http://localhost' }, 'auth')
expect(url).toBe('http://localhost/v1/auth')
})
it('should return the full url with the path "/v1/storage" concatenated', async () => {
const url = urlFromSubdomain({ backendUrl: 'http://localhost:1337' }, 'storage')
expect(url).toBe('http://localhost:1337/v1/storage')
})
})
describe('using subdomain', () => {
describe('other than "localhost" and a region', () => {
it('should return the full authentication url', async () => {
@@ -140,7 +126,9 @@ describe('buildUrl', () => {
})
it('should handle missing parameters', () => {
// @ts-ignore
expect(() => buildUrl()).toThrow()
// @ts-ignore
expect(() => buildUrl('https://example.com')).toThrow()
})
})

View File

@@ -1,5 +1,22 @@
# @nhost/react
## 3.0.1
### Patch Changes
- @nhost/nhost-js@3.0.1
## 3.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/nhost-js@3.0.0
## 2.1.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/react",
"version": "2.1.1",
"version": "3.0.1",
"description": "Nhost React library",
"license": "MIT",
"keywords": [

View File

@@ -1,12 +1,12 @@
export type { BackendUrl, ErrorPayload, NhostSession, Subdomain, User } from '@nhost/nhost-js'
export type { ErrorPayload, NhostSession, Subdomain, User } from '@nhost/nhost-js'
export * from './client'
export * from './components'
export * from './provider'
export * from './useAccessToken'
export * from './useAddSecurityKey'
export * from './useAuthInterpreter'
export * from './useAuthenticated'
export * from './useAuthenticationStatus'
export * from './useAuthInterpreter'
export * from './useChangeEmail'
export * from './useChangePassword'
export * from './useConfigMfa'

View File

@@ -1,5 +1,22 @@
# @nhost/vue
## 2.0.1
### Patch Changes
- @nhost/nhost-js@3.0.1
## 2.0.0
### Major Changes
- bc9eff6e4: chore: remove support for using backendUrl when instantiating the Nhost client
### Patch Changes
- Updated dependencies [bc9eff6e4]
- @nhost/nhost-js@3.0.0
## 1.14.1
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/vue",
"version": "1.14.1",
"version": "2.0.1",
"description": "Nhost Vue library",
"license": "MIT",
"keywords": [

View File

@@ -1,5 +1,4 @@
import {
BackendUrl,
NhostAuthConstructorParams,
NhostClient as VanillaClient,
removeParameterFromWindow,
@@ -8,11 +7,10 @@ import {
import { App, warn } from 'vue'
import { DefaultNhostClient } from './useNhostClient'
export type { BackendUrl, ErrorPayload, NhostSession, Subdomain, User } from '@nhost/nhost-js'
export type { ErrorPayload, NhostSession, Subdomain, User } from '@nhost/nhost-js'
export interface NhostVueClientConstructorParams
extends Partial<BackendUrl>,
Partial<Subdomain>,
extends Partial<Subdomain>,
Omit<NhostAuthConstructorParams, 'url' | 'start' | 'client'> {}
export class NhostClient extends VanillaClient {

71
pnpm-lock.yaml generated
View File

@@ -1001,7 +1001,7 @@ importers:
devDependencies:
'@nhost/nhost-js':
specifier: 2.2.18
version: link:../../../packages/nhost-js
version: 2.2.18(graphql@16.7.1)
'@playwright/test':
specifier: ^1.31.0
version: 1.31.0
@@ -1569,7 +1569,7 @@ importers:
version: 3.1.1(graphql@16.7.1)
isomorphic-unfetch:
specifier: ^3.1.0
version: 3.1.0(encoding@0.1.13)
version: 3.1.0
devDependencies:
'@nhost/docgen':
specifier: workspace:*
@@ -1650,7 +1650,7 @@ importers:
version: link:../react
isomorphic-unfetch:
specifier: ^3.1.0
version: 3.1.0(encoding@0.1.13)
version: 3.1.0
js-cookie:
specifier: ^3.0.1
version: 3.0.1
@@ -1687,7 +1687,7 @@ importers:
version: link:../hasura-storage-js
isomorphic-unfetch:
specifier: ^3.1.0
version: 3.1.0(encoding@0.1.13)
version: 3.1.0
devDependencies:
'@nhost/docgen':
specifier: workspace:*
@@ -10600,6 +10600,54 @@ packages:
dev: false
optional: true
/@nhost/graphql-js@0.1.4(graphql@16.7.1):
resolution: {integrity: sha512-IPHuGOf4iQrFsxG7Rh5jCCZzPCN9JkvldFww4Fz1lCVi9ZQNEaGaawIP5gBuBHeYIuALeaK1wVYKPc7vJ/euCA==}
peerDependencies:
graphql: 16.7.1
dependencies:
'@graphql-typed-document-node/core': 3.2.0(graphql@16.7.1)
graphql: 16.7.1
isomorphic-unfetch: 3.1.0
transitivePeerDependencies:
- encoding
dev: true
/@nhost/hasura-auth-js@2.1.9:
resolution: {integrity: sha512-tZl6iArGBIuzaD9ZMCR4NUNxXneIj87c15nG0RWqzqScMAklQ0l9J52CLeE8NDPNFWFuwNLm2FBpnEz4YGJLVw==}
dependencies:
'@simplewebauthn/browser': 6.0.0
fetch-ponyfill: 7.1.0
js-cookie: 3.0.5
jwt-decode: 3.1.2
xstate: 4.38.2
transitivePeerDependencies:
- encoding
dev: true
/@nhost/hasura-storage-js@2.2.5:
resolution: {integrity: sha512-IW0IwHlvuo9PxVQTXoQUE8LOpuOnjp+XlqgAKeatg1rY0MjJokcm4Xd0yLInAXfYBkK0r9pdKz7+RW+GDiYQ5g==}
dependencies:
fetch-ponyfill: 7.1.0
form-data: 4.0.0
xstate: 4.38.2
transitivePeerDependencies:
- encoding
dev: true
/@nhost/nhost-js@2.2.18(graphql@16.7.1):
resolution: {integrity: sha512-aHn6p75fuG7SEUyB/yfX5TXtVTqwCT88zdN9Mmgo/8hnFOGV1XM7B4fxuGpNQCz18tG6kjM24tWx8EGXAEZ1sw==}
peerDependencies:
graphql: 16.7.1
dependencies:
'@nhost/graphql-js': 0.1.4(graphql@16.7.1)
'@nhost/hasura-auth-js': 2.1.9
'@nhost/hasura-storage-js': 2.2.5
graphql: 16.7.1
isomorphic-unfetch: 3.1.0
transitivePeerDependencies:
- encoding
dev: true
/@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
dependencies:
@@ -11600,7 +11648,6 @@ packages:
/@simplewebauthn/browser@6.0.0:
resolution: {integrity: sha512-gaXZmNfBPFawVZLhDPHkArCt0ttUbNSQSq24muyFmUi/QfJIhvQfQH7kfqIwlAXKqs79qpJ4RCYsRUjVj0Yl6w==}
dev: false
/@simplewebauthn/typescript-types@6.0.0:
resolution: {integrity: sha512-zBs5duUHwQ2CCnHckalMJycv8p2mfWGv+m9sI3WxnK3QR7Lw0/014zKkhC+Uygz5XSHuvPAxeMft6FbrP/OmtQ==}
@@ -22305,7 +22352,6 @@ packages:
node-fetch: 2.6.12(encoding@0.1.13)
transitivePeerDependencies:
- encoding
dev: false
/fetch-retry@5.0.3:
resolution: {integrity: sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==}
@@ -24838,7 +24884,7 @@ packages:
- encoding
dev: true
/isomorphic-unfetch@3.1.0(encoding@0.1.13):
/isomorphic-unfetch@3.1.0:
resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==}
dependencies:
node-fetch: 2.6.7(encoding@0.1.13)
@@ -24846,6 +24892,15 @@ packages:
transitivePeerDependencies:
- encoding
/isomorphic-unfetch@3.1.0(encoding@0.1.13):
resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==}
dependencies:
node-fetch: 2.6.12(encoding@0.1.13)
unfetch: 4.2.0
transitivePeerDependencies:
- encoding
dev: true
/isomorphic-ws@5.0.0(ws@8.12.1):
resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
peerDependencies:
@@ -25091,7 +25146,6 @@ packages:
/js-cookie@3.0.5:
resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
engines: {node: '>=14'}
dev: false
/js-levenshtein@1.1.6:
resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
@@ -25421,7 +25475,6 @@ packages:
/jwt-decode@3.1.2:
resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==}
dev: false
/keyv@3.1.0:
resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}