Compare commits

..

22 Commits

Author SHA1 Message Date
Szilárd Dóró
157e1b74b8 Merge pull request #2015 from nhost/changeset-release/main
chore: update versions
2023-06-06 14:10:14 +02:00
github-actions[bot]
b3a475c60f chore: update versions 2023-06-06 12:04:51 +00:00
Szilárd Dóró
3d62871db1 Merge pull request #2014 from nhost/fix/pat-section
fix(dashboard): don't break account settings page
2023-06-06 14:01:53 +02:00
Szilárd Dóró
4f0368b95f fix: don't break account settings page 2023-06-06 13:50:13 +02:00
Szilárd Dóró
463cb50c27 Merge pull request #2011 from nhost/changeset-release/main 2023-06-06 11:40:03 +02:00
github-actions[bot]
676c11f814 chore: update versions 2023-06-06 07:27:04 +00:00
Szilárd Dóró
d8442a290b Merge pull request #2010 from nhost/chore/lower-max-resources
chore(dashboard): lower the max allowed resources per service
2023-06-06 09:25:53 +02:00
Szilárd Dóró
0db333353b chore: add message to resources 2023-06-05 16:30:53 +02:00
Szilárd Dóró
7ea8120723 Merge pull request #2009 from nhost/docs/custom-urls
docs: add section about using custom URLs
2023-06-05 16:27:33 +02:00
Szilárd Dóró
64a8f41d03 chore: add changeset 2023-06-05 16:18:30 +02:00
Szilárd Dóró
8e12ded94b chore: lower the maximum allowed resources 2023-06-05 16:17:06 +02:00
Szilárd Dóró
564ce1ac2d docs: add section about custom URLs 2023-06-05 16:03:50 +02:00
Szilárd Dóró
b024817eb5 docs: add docs about using custom URLs 2023-06-05 15:55:36 +02:00
Szilárd Dóró
c1b024cf53 Merge pull request #2006 from nhost/fix/example-visibility
fix: make node-storage example private
2023-06-05 14:51:18 +02:00
Szilárd Dóró
dbacbf140b fix: make node-storage example private 2023-06-05 14:22:17 +02:00
Szilárd Dóró
0a9af5075c Merge pull request #2005 from nhost/changeset-release/main
chore: update versions
2023-06-05 13:41:52 +02:00
github-actions[bot]
15168539d8 chore: update versions 2023-06-05 11:13:57 +00:00
Szilárd Dóró
0d74217a4c Merge pull request #2003 from nhost/chore/node-18-upgrade
fix(hasura-storage-js): don't break when using Node 18
2023-06-05 13:12:10 +02:00
Szilárd Dóró
9721527324 chore: improve storage example 2023-06-05 10:48:15 +02:00
Szilárd Dóró
fd4d024bfc feat: add Nhost to the storage example 2023-06-05 10:46:29 +02:00
Szilárd Dóró
4c00a796eb fix: don't break builds 2023-06-05 09:50:30 +02:00
Szilárd Dóró
07abea4c16 fix: make storage work with Node 18+
feat: add Node.js storage example
2023-06-02 16:19:10 +02:00
99 changed files with 1323 additions and 196 deletions

View File

@@ -1,5 +1,24 @@
# @nhost/dashboard
## 0.17.7
### Patch Changes
- 4f0368b95: fix(account): don't break account settings page
## 0.17.6
### Patch Changes
- 64a8f41d0: chore(resources): lower the maximum allowed resources per service
## 0.17.5
### Patch Changes
- @nhost/react-apollo@5.0.25
- @nhost/nextjs@1.13.27
## 0.17.4
### Patch Changes

View File

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

View File

@@ -1,6 +1,6 @@
query GetPersonalAccessTokens {
personalAccessTokens: authRefreshTokens(
where: { type: { _eq: "pat" } }
where: { type: { _eq: pat } }
order_by: { expiresAt: asc }
) {
id

View File

@@ -5,6 +5,7 @@ import { ActivityIndicator } from '@/components/ui/v2/ActivityIndicator';
import { Alert } from '@/components/ui/v2/Alert';
import { Box } from '@/components/ui/v2/Box';
import { Divider } from '@/components/ui/v2/Divider';
import { Link } from '@/components/ui/v2/Link';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { useProPlan } from '@/features/projects/common/hooks/useProPlan';
import { ResourcesConfirmationDialog } from '@/features/projects/resources/settings/components/ResourcesConfirmationDialog';
@@ -348,6 +349,13 @@ export default function ResourcesForm() {
</Alert>
</Box>
)}
<Box className="px-4 pb-4">
<Alert severity="info">
In case you need more resources, please reach out to us at{' '}
<Link href="mailto:support@nhost.io">support@nhost.io</Link>.
</Alert>
</Box>
</>
) : (
<Box className={twMerge('px-4', 'pb-4')}>

View File

@@ -21,7 +21,7 @@ export const MIN_TOTAL_MEMORY =
/**
* The maximum total CPU that can be allocated.
*/
export const MAX_TOTAL_VCPU = 60 * RESOURCE_VCPU_MULTIPLIER;
export const MAX_TOTAL_VCPU = 28 * RESOURCE_VCPU_MULTIPLIER;
/**
* The maximum amount of memory that can be allocated in total.
@@ -46,7 +46,7 @@ export const MIN_SERVICE_VCPU = 0.25 * RESOURCE_VCPU_MULTIPLIER;
/**
* The maximum amount of CPU that can be allocated per service.
*/
export const MAX_SERVICE_VCPU = 15 * RESOURCE_VCPU_MULTIPLIER;
export const MAX_SERVICE_VCPU = 7 * RESOURCE_VCPU_MULTIPLIER;
/**
* The minimum amount of memory that has to be allocated per service.

View File

@@ -277,7 +277,16 @@ export default function FilesDataGrid(props: FilesDataGridProps) {
throw new Error(fileError.message);
}
triggerToast(`File has been uploaded successfully (${fileMetadata?.id})`);
if (!fileMetadata) {
throw new Error('File metadata is missing.');
}
const fileId =
'processedFiles' in fileMetadata
? fileMetadata.processedFiles[0]?.id
: fileMetadata.id;
triggerToast(`File has been uploaded successfully (${fileId})`);
await refetchFilesAndAggregate();
} catch (uploadError) {

View File

@@ -1,4 +1,5 @@
import { Container } from '@/components/layout/Container';
import { RetryableErrorBoundary } from '@/components/presentational/RetryableErrorBoundary';
import { AccountSettingsLayout } from '@/features/account/settings/components/AccountSettingsLayout';
import { PasswordSettings } from '@/features/account/settings/components/PasswordSettings';
import { PATSettings } from '@/features/account/settings/components/PATSettings';
@@ -10,8 +11,13 @@ export default function AccountSettingsPage() {
className="grid max-w-5xl grid-flow-row gap-8 bg-transparent"
rootClassName="bg-transparent"
>
<PasswordSettings />
<PATSettings />
<RetryableErrorBoundary>
<PasswordSettings />
</RetryableErrorBoundary>
<RetryableErrorBoundary>
<PATSettings />
</RetryableErrorBoundary>
</Container>
);
}

View File

@@ -3671,7 +3671,7 @@ export type AuthRefreshTokens = {
refresh_token?: Maybe<Scalars['uuid']>;
/** An object relationship */
refresh_token_type: Auth_Refresh_Token_Types;
type: Scalars['String'];
type: Auth_Refresh_Token_Types_Enum;
/** An object relationship */
user: Users;
userId: Scalars['uuid'];
@@ -3747,7 +3747,7 @@ export type AuthRefreshTokens_Bool_Exp = {
refreshTokenHash?: InputMaybe<String_Comparison_Exp>;
refresh_token?: InputMaybe<Uuid_Comparison_Exp>;
refresh_token_type?: InputMaybe<Auth_Refresh_Token_Types_Bool_Exp>;
type?: InputMaybe<String_Comparison_Exp>;
type?: InputMaybe<Auth_Refresh_Token_Types_Enum_Comparison_Exp>;
user?: InputMaybe<Users_Bool_Exp>;
userId?: InputMaybe<Uuid_Comparison_Exp>;
};
@@ -3782,7 +3782,7 @@ export type AuthRefreshTokens_Insert_Input = {
refreshTokenHash?: InputMaybe<Scalars['String']>;
refresh_token?: InputMaybe<Scalars['uuid']>;
refresh_token_type?: InputMaybe<Auth_Refresh_Token_Types_Obj_Rel_Insert_Input>;
type?: InputMaybe<Scalars['String']>;
type?: InputMaybe<Auth_Refresh_Token_Types_Enum>;
user?: InputMaybe<Users_Obj_Rel_Insert_Input>;
userId?: InputMaybe<Scalars['uuid']>;
};
@@ -3795,7 +3795,6 @@ export type AuthRefreshTokens_Max_Fields = {
id?: Maybe<Scalars['uuid']>;
refreshTokenHash?: Maybe<Scalars['String']>;
refresh_token?: Maybe<Scalars['uuid']>;
type?: Maybe<Scalars['String']>;
userId?: Maybe<Scalars['uuid']>;
};
@@ -3806,7 +3805,6 @@ export type AuthRefreshTokens_Max_Order_By = {
id?: InputMaybe<Order_By>;
refreshTokenHash?: InputMaybe<Order_By>;
refresh_token?: InputMaybe<Order_By>;
type?: InputMaybe<Order_By>;
userId?: InputMaybe<Order_By>;
};
@@ -3818,7 +3816,6 @@ export type AuthRefreshTokens_Min_Fields = {
id?: Maybe<Scalars['uuid']>;
refreshTokenHash?: Maybe<Scalars['String']>;
refresh_token?: Maybe<Scalars['uuid']>;
type?: Maybe<Scalars['String']>;
userId?: Maybe<Scalars['uuid']>;
};
@@ -3829,7 +3826,6 @@ export type AuthRefreshTokens_Min_Order_By = {
id?: InputMaybe<Order_By>;
refreshTokenHash?: InputMaybe<Order_By>;
refresh_token?: InputMaybe<Order_By>;
type?: InputMaybe<Order_By>;
userId?: InputMaybe<Order_By>;
};
@@ -3901,7 +3897,7 @@ export type AuthRefreshTokens_Set_Input = {
metadata?: InputMaybe<Scalars['jsonb']>;
refreshTokenHash?: InputMaybe<Scalars['String']>;
refresh_token?: InputMaybe<Scalars['uuid']>;
type?: InputMaybe<Scalars['String']>;
type?: InputMaybe<Auth_Refresh_Token_Types_Enum>;
userId?: InputMaybe<Scalars['uuid']>;
};
@@ -3921,7 +3917,7 @@ export type AuthRefreshTokens_Stream_Cursor_Value_Input = {
metadata?: InputMaybe<Scalars['jsonb']>;
refreshTokenHash?: InputMaybe<Scalars['String']>;
refresh_token?: InputMaybe<Scalars['uuid']>;
type?: InputMaybe<Scalars['String']>;
type?: InputMaybe<Auth_Refresh_Token_Types_Enum>;
userId?: InputMaybe<Scalars['uuid']>;
};
@@ -5209,33 +5205,9 @@ export type Auth_Migrations_Variance_Fields = {
export type Auth_Refresh_Token_Types = {
__typename?: 'auth_refresh_token_types';
comment?: Maybe<Scalars['String']>;
/** An array relationship */
refresh_tokens: Array<AuthRefreshTokens>;
/** An aggregate relationship */
refresh_tokens_aggregate: AuthRefreshTokens_Aggregate;
value: Scalars['String'];
};
/** columns and relationships of "auth.refresh_token_types" */
export type Auth_Refresh_Token_TypesRefresh_TokensArgs = {
distinct_on?: InputMaybe<Array<AuthRefreshTokens_Select_Column>>;
limit?: InputMaybe<Scalars['Int']>;
offset?: InputMaybe<Scalars['Int']>;
order_by?: InputMaybe<Array<AuthRefreshTokens_Order_By>>;
where?: InputMaybe<AuthRefreshTokens_Bool_Exp>;
};
/** columns and relationships of "auth.refresh_token_types" */
export type Auth_Refresh_Token_TypesRefresh_Tokens_AggregateArgs = {
distinct_on?: InputMaybe<Array<AuthRefreshTokens_Select_Column>>;
limit?: InputMaybe<Scalars['Int']>;
offset?: InputMaybe<Scalars['Int']>;
order_by?: InputMaybe<Array<AuthRefreshTokens_Order_By>>;
where?: InputMaybe<AuthRefreshTokens_Bool_Exp>;
};
/** aggregated selection of "auth.refresh_token_types" */
export type Auth_Refresh_Token_Types_Aggregate = {
__typename?: 'auth_refresh_token_types_aggregate';
@@ -5264,8 +5236,6 @@ export type Auth_Refresh_Token_Types_Bool_Exp = {
_not?: InputMaybe<Auth_Refresh_Token_Types_Bool_Exp>;
_or?: InputMaybe<Array<Auth_Refresh_Token_Types_Bool_Exp>>;
comment?: InputMaybe<String_Comparison_Exp>;
refresh_tokens?: InputMaybe<AuthRefreshTokens_Bool_Exp>;
refresh_tokens_aggregate?: InputMaybe<AuthRefreshTokens_Aggregate_Bool_Exp>;
value?: InputMaybe<String_Comparison_Exp>;
};
@@ -5275,10 +5245,25 @@ export enum Auth_Refresh_Token_Types_Constraint {
RefreshTokenTypesPkey = 'refresh_token_types_pkey'
}
export enum Auth_Refresh_Token_Types_Enum {
/** Personal access token */
Pat = 'pat',
/** Regular refresh token */
Regular = 'regular'
}
/** Boolean expression to compare columns of type "auth_refresh_token_types_enum". All fields are combined with logical 'AND'. */
export type Auth_Refresh_Token_Types_Enum_Comparison_Exp = {
_eq?: InputMaybe<Auth_Refresh_Token_Types_Enum>;
_in?: InputMaybe<Array<Auth_Refresh_Token_Types_Enum>>;
_is_null?: InputMaybe<Scalars['Boolean']>;
_neq?: InputMaybe<Auth_Refresh_Token_Types_Enum>;
_nin?: InputMaybe<Array<Auth_Refresh_Token_Types_Enum>>;
};
/** input type for inserting data into table "auth.refresh_token_types" */
export type Auth_Refresh_Token_Types_Insert_Input = {
comment?: InputMaybe<Scalars['String']>;
refresh_tokens?: InputMaybe<AuthRefreshTokens_Arr_Rel_Insert_Input>;
value?: InputMaybe<Scalars['String']>;
};
@@ -5322,7 +5307,6 @@ export type Auth_Refresh_Token_Types_On_Conflict = {
/** Ordering options when selecting data from "auth.refresh_token_types". */
export type Auth_Refresh_Token_Types_Order_By = {
comment?: InputMaybe<Order_By>;
refresh_tokens_aggregate?: InputMaybe<AuthRefreshTokens_Aggregate_Order_By>;
value?: InputMaybe<Order_By>;
};
@@ -19907,7 +19891,7 @@ export const GetWorkspaceMembersWorkspaceMemberInviteFragmentDoc = gql`
export const GetPersonalAccessTokensDocument = gql`
query GetPersonalAccessTokens {
personalAccessTokens: authRefreshTokens(
where: {type: {_eq: "pat"}}
where: {type: {_eq: pat}}
order_by: {expiresAt: asc}
) {
id

View File

@@ -1,5 +1,11 @@
# @nhost/docs
## 0.3.1
### Patch Changes
- 564ce1ac2: docs: add docs about using custom URLs for the Nhost SDK
## 0.3.0
### Minor Changes

View File

@@ -36,17 +36,35 @@ yarn add @nhost/nhost-js graphql
## Initializing
Initialize a single `nhost` instance using your Nhost backend URL:
Initialize a single `nhost` instance using your Nhost `subdomain` and `region`:
```ts title=utils/nhost.ts
```ts title=src/lib/nhost.ts
import { NhostClient } from '@nhost/nhost-js'
const nhost = new NhostClient({
export const nhost = new NhostClient({
subdomain: '<your-subdomain>',
region: '<your-region>'
})
```
## Using custom URLs
There are cases where you might want to use a custom URL for one or more of the
services (e.g: when you are self-hosting or you are running services on custom
ports). You can do this by passing in the custom URLs when initializing the
Nhost client:
```ts title=src/lib/nhost.ts
import { NhostClient } from '@nhost/nhost-js'
export const nhost = new NhostClient({
authUrl: 'https://auth.mydomain.com',
storageUrl: 'https://storage.mydomain.com',
graphqlUrl: 'https://graphql.mydomain.com',
functionsUrl: 'https://functions.mydomain.com'
})
```
## GraphQL Support
The Nhost client has a small GraphQL client built-in which is great to use server-side or in very simple frontend apps. For more serious frontend apps, we recommend using a more complete GraphQL client such as:

View File

@@ -31,12 +31,12 @@ yarn add @nhost/nextjs graphql
## Initializing
Initialize a single `nhost` instance and wrap your app with the `NhostProvider`.
```jsx title=pages/_app.js
import type { AppProps } from 'next/app'
Initialize a single `nhost` instance using your Nhost `subdomain` and `region`,
and wrap your app with the `NhostProvider`:
```tsx title=pages/_app.tsx
import { NhostClient, NhostProvider } from '@nhost/nextjs'
import type { AppProps } from 'next/app'
const nhost = new NhostClient({
subdomain: '<your-subdomain>',
@@ -60,6 +60,35 @@ The `nhost` instance created with the `NhostClient` above is the same as the [Ja
:::
## Using custom URLs
There are cases where you might want to use a custom URL for one or more of the
services (e.g: when you are self-hosting or you are running services on custom
ports). You can do this by passing in the custom URLs when initializing the
Nhost client:
```tsx title=pages/_app.tsx
import { NhostClient, NhostProvider } from '@nhost/nextjs'
import type { AppProps } from 'next/app'
const nhost = new NhostClient({
authUrl: 'https://auth.mydomain.com',
storageUrl: 'https://storage.mydomain.com',
graphqlUrl: 'https://graphql.mydomain.com',
functionsUrl: 'https://functions.mydomain.com'
})
function MyApp({ Component, pageProps }: AppProps) {
return (
<NhostProvider nhost={nhost} initial={pageProps.nhostSession}>
<Component {...pageProps} />
</NhostProvider>
)
}
export default MyApp
```
## Server-Side Rendering (SSR)
You need to load the session from the server first from `getServerSideProps`. Once it is done, the `_app` component will make sure to load or update the session through `pageProps`.

View File

@@ -31,17 +31,33 @@ yarn add @nhost/react graphql
## Initializing
After installation, initialize a single Nhost Client (`nhost`) under `src/lib/nhost.js`.
Initialize a single `nhost` instance using your Nhost `subdomain` and `region`:
```jsx title=src/lib/nhost.js
import { NhostClient } from '@nhost/react'
const nhost = new NhostClient({
export const nhost = new NhostClient({
subdomain: '<your-subdomain>',
region: '<your-region>'
})
```
export { nhost }
## Using custom URLs
There are cases where you might want to use a custom URL for one or more of the
services (e.g: when you are self-hosting or you are running services on custom
ports). You can do this by passing in the custom URLs when initializing the
Nhost client:
```ts title=src/lib/nhost.ts
import { NhostClient } from '@nhost/react'
export const nhost = new NhostClient({
authUrl: 'https://auth.mydomain.com',
storageUrl: 'https://storage.mydomain.com',
graphqlUrl: 'https://graphql.mydomain.com',
functionsUrl: 'https://functions.mydomain.com'
})
```
Import `nhost` and wrap your app with the `NhostProvider`.

View File

@@ -31,12 +31,12 @@ yarn add @nhost/vue graphql
## Initializing
Initialize a single `nhost` instance, and install it as a plugin in your Vue app.
Initialize a single `nhost` instance using your Nhost `subdomain` and `region`,
and install it as a plugin in your Vue app:
```js title=src/main.js
import { createApp } from 'vue'
import { NhostClient } from '@nhost/vue'
import { createApp } from 'vue'
import App from './App.vue'
const nhost = new NhostClient({
@@ -46,3 +46,25 @@ const nhost = new NhostClient({
createApp(App).use(nhost).mount('#app')
```
## Using custom URLs
There are cases where you might want to use a custom URL for one or more of the
services (e.g: when you are self-hosting or you are running services on custom
ports). You can do this by passing in the custom URLs when initializing the
Nhost client:
```js title=src/main.js
import { NhostClient } from '@nhost/vue'
import { createApp } from 'vue'
import App from './App.vue'
const nhost = new NhostClient({
authUrl: 'https://auth.mydomain.com',
storageUrl: 'https://storage.mydomain.com',
graphqlUrl: 'https://graphql.mydomain.com',
functionsUrl: 'https://functions.mydomain.com'
})
createApp(App).use(nhost).mount('#app')
```

View File

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

View File

@@ -0,0 +1,3 @@
SUBDOMAIN="local"
REGION=""
ADMIN_SECRET="nhost-admin-secret"

1
examples/node-storage/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.secrets.nhost

View File

@@ -0,0 +1,8 @@
# @nhost-examples/node-storage
## 0.0.2
### Patch Changes
- 4c00a796e: feat: add example for Storage + Node.js
- @nhost/nhost-js@2.2.7

View File

@@ -0,0 +1,30 @@
# Node.js Storage Example
This example demonstrates how to use the [Nhost Storage SDK](https://docs.nhost.io/reference/javascript/storage) in Node.js.
Make sure to install the dependencies:
```bash
pnpm install
```
## Settting up the environment
Create a `.env` file in the root of the project with the following content:
```bash
SUBDOMAIN=<your-subdomain>
REGION=<your-region>
ADMIN_SECRET=<your-admin-secret>
```
You can use the `.env.example` file as a starting point.
## Running the example
```bash
pnpm start
```
The example will download a file from a public URL and upload it to your Nhost
Storage bucket.

View File

@@ -0,0 +1 @@
version: 3

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Потвърдете смяната на вашия имейл</h2>
<p>Използвайте посочения линк, за да повърдите смяната на имейл:</p>
<p>
<a href="${link}">
Смени имейл
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Потвърждение за смяна на имейл

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Потвърдете вашия имейл</h2>
<p>Използвайте посочения линк, за да потвърдите вашия имейл:</p>
<p>
<a href="${link}">
Потвърдете имейл
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Потвърждаване на имейл

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Смяна на парола</h2>
<p>Използвайте посочения линк, за да смените вашата парола:</p>
<p>
<a href="${link}">
Смяна на парола
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Смяна на парола

View File

@@ -0,0 +1 @@
Вашият код е ${code}.

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Магически линк за вход</h2>
<p>Използвайте посочения линк за защитен и бърз вход:</p>
<p>
<a href="${link}">
Вход
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Магически линк за вход

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Potvrzení změny emailové adresy</h2>
<p>Použijte tento odkaz k potvrzení změny emailové adresy:</p>
<p>
<a href="${link}">
Změnit email
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Změna vaší emailové adresy

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Ověření emailové adresy</h2>
<p>Použijte tento odkaz k ověření vaší emailové adresy:</p>
<p>
<a href="${link}">
Ověřit emailovou adresu
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Ověření vaší emailové adresy

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Obnova hesla</h2>
<p>Použijte tento odkaz k obnovení vašeho hesla:</p>
<p>
<a href="${link}">
Obnova hesla
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Obnova hesla

View File

@@ -0,0 +1 @@
Váš kód je ${code}.

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Magický odkaz</h2>
<p>Použijte tento odkaz k bezpečnému přihlášení:</p>
<p>
<a href="${link}">
Přihlášení
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Bezpečný odkaz k přihlášení

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Confirm Email Change</h2>
<p>Use this link to confirm changing email:</p>
<p>
<a href="${link}">
Change email
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Change your email address

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Verify Email</h2>
<p>Use this link to verify your email:</p>
<p>
<a href="${link}">
Verify Email
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Verify your email

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Reset Password</h2>
<p>Use this link to reset your password:</p>
<p>
<a href="${link}">
Reset password
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Reset your password

View File

@@ -0,0 +1 @@
Your code is ${code}.

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Magic Link</h2>
<p>Use this link to securely sign in:</p>
<p>
<a href="${link}">
Sign In
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Secure sign-in link

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Confirmar cambio de correo electrónico</h2>
<p>Utiliza el siguiente enlace para confirmar el cambio de correo:</p>
<p>
<a href="${link}">
Cambiar correo electrónico
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Cambiar dirección de correo electrónico

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Verificar correo electrónico</h2>
<p>Utilza el siguiente enlace para verificar tu correo:</p>
<p>
<a href="${link}">
Verificar correo electrónico
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Verifica tu correo electrónico

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Recuperar contraseña</h2>
<p>Utiliza el siguiente enlace para recuperar tu contraseña:</p>
<p>
<a href="${link}">
Recuperar contraseña
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Recuperar contraseña

View File

@@ -0,0 +1 @@
Tu código es ${code}.

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Enlace mágico</h2>
<p>Utiliza este enlace para iniciar sesión de forma segura:</p>
<p>
<a href="${link}">
Iniciar sesión
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Enlace de acceso seguro

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Confirmer changement de courriel</h2>
<p>Utilisez ce lien pour confirmer le changement de courriel:</p>
<p>
<a href="${link}">
Changer courriel
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Changez votre adresse courriel

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>V&eacute;rifiez votre courriel</h2>
<p>Utilisez ce lien pour v&eacute;rifier votre courriel:</p>
<p>
<a href="${link}">
V&eacute;rifier courriel
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Vérifier votre courriel

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>R&eacute;initializer votre mot de passe</h2>
<p>Utilisez ce lien pour r&eacute;initializer votre mot de passe:</p>
<p>
<a href="${link}">
R&eacute;initializer mot de passe
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Réinitialiser votre mot de passe

View File

@@ -0,0 +1 @@
Votre code est ${code}.

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h2>Lien magique</h2>
<p>Utilisez ce lien pour vous connecter de fa&ccedil;on s&eacute;curitaire:</p>
<p>
<a href="${link}">
Connexion
</a>
</p>
</body>
</html>

View File

@@ -0,0 +1 @@
Lien de connexion sécurisé

View File

@@ -0,0 +1,145 @@
[global]
[hasura]
version = 'v2.25.1-ce'
adminSecret = '{{ secrets.HASURA_GRAPHQL_ADMIN_SECRET }}'
webhookSecret = '{{ secrets.NHOST_WEBHOOK_SECRET }}'
[[hasura.jwtSecrets]]
type = 'HS256'
key = '{{ secrets.HASURA_GRAPHQL_JWT_SECRET }}'
[hasura.settings]
corsDomain = ['*']
devMode = true
enableAllowList = false
enableConsole = true
enableRemoteSchemaPermissions = false
enabledAPIs = ['metadata', 'graphql', 'pgdump', 'config']
[hasura.logs]
level = 'warn'
[hasura.events]
httpPoolSize = 100
[functions]
[functions.node]
version = 16
[auth]
version = '0.20.1'
[auth.redirections]
clientUrl = 'http://localhost:3000'
[auth.signUp]
enabled = true
[auth.user]
[auth.user.roles]
default = 'user'
allowed = ['user', 'me']
[auth.user.locale]
default = 'en'
allowed = ['en']
[auth.user.gravatar]
enabled = true
default = 'blank'
rating = 'g'
[auth.user.email]
[auth.user.emailDomains]
[auth.session]
[auth.session.accessToken]
expiresIn = 900
[auth.session.refreshToken]
expiresIn = 43200
[auth.method]
[auth.method.anonymous]
enabled = false
[auth.method.emailPasswordless]
enabled = false
[auth.method.emailPassword]
hibpEnabled = false
emailVerificationRequired = true
passwordMinLength = 9
[auth.method.smsPasswordless]
enabled = false
[auth.method.oauth]
[auth.method.oauth.apple]
enabled = false
[auth.method.oauth.azuread]
tenant = 'common'
enabled = false
[auth.method.oauth.bitbucket]
enabled = false
[auth.method.oauth.discord]
enabled = false
[auth.method.oauth.facebook]
enabled = false
[auth.method.oauth.github]
enabled = false
[auth.method.oauth.gitlab]
enabled = false
[auth.method.oauth.google]
enabled = false
[auth.method.oauth.linkedin]
enabled = false
[auth.method.oauth.spotify]
enabled = false
[auth.method.oauth.strava]
enabled = false
[auth.method.oauth.twitch]
enabled = false
[auth.method.oauth.twitter]
enabled = false
[auth.method.oauth.windowslive]
enabled = false
[auth.method.oauth.workos]
enabled = false
[auth.method.webauthn]
enabled = false
[auth.method.webauthn.attestation]
timeout = 60000
[auth.totp]
enabled = false
[postgres]
version = '14.6-20230406-2'
[provider]
[storage]
version = '0.3.5'
[observability]
[observability.grafana]
adminPassword = '{{ secrets.GRAFANA_ADMIN_PASSWORD }}'

View File

@@ -0,0 +1,22 @@
{
"name": "@nhost-examples/node-storage",
"version": "0.0.2",
"private": true,
"description": "This is an example of how to use the Storage with Node.js",
"main": "src/index.mjs",
"type": "module",
"scripts": {
"start": "node src/index.mjs"
},
"author": "",
"license": "ISC",
"dependencies": {
"@nhost/nhost-js": "*",
"dotenv": "^16.1.3",
"form-data": "^4.0.0",
"node-fetch": "^3.3.0"
},
"devDependencies": {
"@types/node": "^18.15.11"
}
}

148
examples/node-storage/pnpm-lock.yaml generated Normal file
View File

@@ -0,0 +1,148 @@
lockfileVersion: '6.0'
dependencies:
'@nhost/nhost-js':
specifier: '*'
version: 0.0.1-0
dotenv:
specifier: ^16.1.3
version: 16.1.3
form-data:
specifier: ^4.0.0
version: 4.0.0
node-fetch:
specifier: ^3.3.0
version: 3.3.0
devDependencies:
'@types/node':
specifier: ^18.15.11
version: 18.15.11
packages:
/@nhost/nhost-js@0.0.1-0:
resolution: {integrity: sha512-fXAhovIYPpuzrSewFjaI3AYgp/iUj07A0+sgPUL73k61DwrPBt1wa533xjoupQVVB9KQHnYIXPJO8wn3pEvphQ==}
dependencies:
jwt-decode: 3.1.2
query-string: 7.1.3
dev: false
/@types/node@18.15.11:
resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==}
dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
dev: false
/decode-uri-component@0.2.2:
resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
engines: {node: '>=0.10'}
dev: false
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dotenv@16.1.3:
resolution: {integrity: sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==}
engines: {node: '>=12'}
dev: false
/fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
dependencies:
node-domexception: 1.0.0
web-streams-polyfill: 3.2.1
dev: false
/filter-obj@1.1.0:
resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==}
engines: {node: '>=0.10.0'}
dev: false
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/formdata-polyfill@4.0.10:
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
engines: {node: '>=12.20.0'}
dependencies:
fetch-blob: 3.2.0
dev: false
/jwt-decode@3.1.2:
resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==}
dev: false
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
dev: false
/node-domexception@1.0.0:
resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
engines: {node: '>=10.5.0'}
dev: false
/node-fetch@3.3.0:
resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
dev: false
/query-string@7.1.3:
resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==}
engines: {node: '>=6'}
dependencies:
decode-uri-component: 0.2.2
filter-obj: 1.1.0
split-on-first: 1.1.0
strict-uri-encode: 2.0.0
dev: false
/split-on-first@1.1.0:
resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==}
engines: {node: '>=6'}
dev: false
/strict-uri-encode@2.0.0:
resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
engines: {node: '>=4'}
dev: false
/web-streams-polyfill@3.2.1:
resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
engines: {node: '>= 8'}
dev: false

View File

@@ -0,0 +1,14 @@
import { NhostClient } from '@nhost/nhost-js'
/**
* Create a new Nhost client.
*
* @returns {NhostClient} A new Nhost client.
*/
export function createClient() {
return new NhostClient({
subdomain: process.env.SUBDOMAIN,
region: process.env.REGION,
adminSecret: process.env.ADMIN_SECRET
})
}

View File

@@ -0,0 +1,62 @@
import dotenv from 'dotenv'
import FormData from 'form-data'
import fetch from 'node-fetch'
import { createClient } from './client.mjs'
dotenv.config()
const client = createClient()
async function uploadImage() {
try {
// Download image from remote URL
const response = await fetch(
'https://hips.hearstapps.com/hmg-prod/images/cute-cat-photos-1593441022.jpg?crop=1.00xw:0.753xh;0,0.153xh&resize=1200:*'
)
if (!response.ok) {
console.error('Image not found!')
return
}
const arrayBuffer = await response.arrayBuffer()
const formData = new FormData()
formData.append('file[]', Buffer.from(arrayBuffer), 'cat.jpg')
// Upload file to Nhost Storage
const { error: uploadError, fileMetadata } = await client.storage.upload({
formData,
headers: { ...formData.getHeaders() }
})
if (uploadError) {
console.error(uploadError)
return
}
console.info(`File has been uploaded successfully!`)
const uploadedFile =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
console.info(`ID: ${uploadedFile?.id}`)
// Generate a presigned URL for the uploaded file
const { error: presignError, presignedUrl: blurredImage } =
await client.storage.getPresignedUrl({ fileId: uploadedFile.id })
if (presignError) {
console.error(presignError)
return
}
console.info(`Presigned URL: ${blurredImage.url}`)
} catch (error) {
console.error(error.message)
}
}
uploadImage()

View File

@@ -1,5 +1,13 @@
# @nhost-examples/vue-quickstart
## 0.0.9
### Patch Changes
- 4c00a796e: chore(autoimports): update type definitions
- @nhost/apollo@5.2.9
- @nhost/vue@1.13.27
## 0.0.8
### Patch Changes

View File

@@ -13,7 +13,9 @@ declare global {
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate']
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise']
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
@@ -21,9 +23,6 @@ declare global {
const extendRef: typeof import('@vueuse/core')['extendRef']
const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
const isDefined: typeof import('@vueuse/core')['isDefined']
const logicAnd: typeof import('@vueuse/core')['logicAnd']
const logicNot: typeof import('@vueuse/core')['logicNot']
const logicOr: typeof import('@vueuse/core')['logicOr']
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
@@ -48,6 +47,8 @@ declare global {
const throttledRef: typeof import('@vueuse/core')['throttledRef']
const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
const toReactive: typeof import('@vueuse/core')['toReactive']
const toRef: typeof import('@vueuse/core')['toRef']
const toValue: typeof import('@vueuse/core')['toValue']
const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
@@ -56,6 +57,19 @@ declare global {
const unrefElement: typeof import('@vueuse/core')['unrefElement']
const until: typeof import('@vueuse/core')['until']
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
const useAnimate: typeof import('@vueuse/core')['useAnimate']
const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference']
const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes']
const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
const useArraySome: typeof import('@vueuse/core')['useArraySome']
const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
const useBase64: typeof import('@vueuse/core')['useBase64']
@@ -65,8 +79,8 @@ declare global {
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
const useCached: typeof import('@vueuse/core')['useCached']
const useClamp: typeof import('@vueuse/core')['useClamp']
const useClipboard: typeof import('@vueuse/core')['useClipboard']
const useCloned: typeof import('@vueuse/core')['useCloned']
const useColorMode: typeof import('@vueuse/core')['useColorMode']
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
const useCounter: typeof import('@vueuse/core')['useCounter']
@@ -133,12 +147,18 @@ declare global {
const useOnline: typeof import('@vueuse/core')['useOnline']
const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
const useParallax: typeof import('@vueuse/core')['useParallax']
const useParentElement: typeof import('@vueuse/core')['useParentElement']
const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver']
const usePermission: typeof import('@vueuse/core')['usePermission']
const usePointer: typeof import('@vueuse/core')['usePointer']
const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
const usePrevious: typeof import('@vueuse/core')['usePrevious']
const useRafFn: typeof import('@vueuse/core')['useRafFn']
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
@@ -151,15 +171,18 @@ declare global {
const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
const useShare: typeof import('@vueuse/core')['useShare']
const useSorted: typeof import('@vueuse/core')['useSorted']
const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
const useStepper: typeof import('@vueuse/core')['useStepper']
const useStorage: typeof import('@vueuse/core')['useStorage']
const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
const useSupported: typeof import('@vueuse/core')['useSupported']
const useSwipe: typeof import('@vueuse/core')['useSwipe']
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
const useThrottle: typeof import('@vueuse/core')['useThrottle']
const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
@@ -171,6 +194,8 @@ declare global {
const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
const useTitle: typeof import('@vueuse/core')['useTitle']
const useToggle: typeof import('@vueuse/core')['useToggle']
const useToNumber: typeof import('@vueuse/core')['useToNumber']
const useToString: typeof import('@vueuse/core')['useToString']
const useTransition: typeof import('@vueuse/core')['useTransition']
const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
@@ -189,7 +214,9 @@ declare global {
const watchArray: typeof import('@vueuse/core')['watchArray']
const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
const watchDeep: typeof import('@vueuse/core')['watchDeep']
const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
const watchImmediate: typeof import('@vueuse/core')['watchImmediate']
const watchOnce: typeof import('@vueuse/core')['watchOnce']
const watchPausable: typeof import('@vueuse/core')['watchPausable']
const watchThrottled: typeof import('@vueuse/core')['watchThrottled']

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/vue-quickstart",
"version": "0.0.8",
"version": "0.0.9",
"private": true,
"scripts": {
"build": "vite build",

View File

@@ -1,5 +1,11 @@
# @nhost/apollo
## 5.2.9
### Patch Changes
- @nhost/nhost-js@2.2.7
## 5.2.8
### Patch Changes

View File

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

View File

@@ -1,5 +1,12 @@
# @nhost/react-apollo
## 5.0.25
### Patch Changes
- @nhost/apollo@5.2.9
- @nhost/react@2.0.21
## 5.0.24
### Patch Changes

View File

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

View File

@@ -1,5 +1,11 @@
# @nhost/react-urql
## 2.0.22
### Patch Changes
- @nhost/react@2.0.21
## 2.0.21
### Patch Changes

View File

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

View File

@@ -89,10 +89,10 @@
},
"packageManager": "pnpm@8.5.1",
"engines": {
"node": ">=16 <17",
"node": ">=18 <19",
"pnpm": ">=8.0.0"
},
"eslintConfig": {
"extends": "./config/.eslintrc.js"
}
}
}

View File

@@ -1,5 +1,11 @@
# @nhost/hasura-storage-js
## 2.1.5
### Patch Changes
- 4c00a796e: fix(upload): don't break upload in Node 18
## 2.1.4
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/hasura-storage-js",
"version": "2.1.4",
"version": "2.1.5",
"description": "Hasura-storage client",
"license": "MIT",
"keywords": [
@@ -62,8 +62,8 @@
"docgen": "pnpm typedoc && docgen --config ./storage.docgen.json"
},
"dependencies": {
"fetch-ponyfill": "^7.1.0",
"form-data": "^4.0.0",
"isomorphic-unfetch": "^3.1.0",
"xstate": "^4.33.5"
},
"devDependencies": {

View File

@@ -1,14 +1,16 @@
import fetch from 'isomorphic-unfetch'
import fetchPonyfill from 'fetch-ponyfill'
import {
ApiDeleteParams,
ApiDeleteResponse,
ApiGetPresignedUrlParams,
ApiGetPresignedUrlResponse,
ApiUploadParams,
StorageUploadFormDataParams,
StorageUploadResponse
} from './utils/types'
import { fetchUpload } from './utils/upload'
const { fetch } = fetchPonyfill()
/**
* @internal
* This is an internal class.
@@ -22,15 +24,20 @@ export class HasuraStorageApi {
this.url = url
}
async upload(params: ApiUploadParams): Promise<StorageUploadResponse> {
const { formData } = params
async upload({
formData,
headers,
bucketId,
id,
name
}: StorageUploadFormDataParams): Promise<StorageUploadResponse> {
return fetchUpload(this.url, formData, {
accessToken: this.accessToken,
adminSecret: this.adminSecret,
bucketId: params.bucketId,
fileId: params.id,
name: params.name
bucketId,
fileId: id,
name,
headers
})
}

View File

@@ -76,19 +76,18 @@ export class HasuraStorageClient {
async upload(params: StorageUploadFileParams): Promise<StorageUploadResponse>
async upload(params: StorageUploadFormDataParams): Promise<StorageUploadResponse>
async upload(params: StorageUploadParams): Promise<StorageUploadResponse> {
let formData: FormData
if ('file' in params) {
formData = new FormData()
formData.append('file', params.file)
} else {
formData = params.formData
const formData = new FormData()
formData.append('file[]', params.file)
return this.api.upload({
...params,
formData
})
}
return this.api.upload({
...params,
formData
})
return this.api.upload(params)
}
/**

View File

@@ -143,10 +143,16 @@ export const createFileUploadMachine = () =>
if (error) {
callback({ type: 'UPLOAD_ERROR', error })
}
if (fileMetadata) {
if (fileMetadata && !('processedFiles' in fileMetadata)) {
const { id, bucketId } = fileMetadata
callback({ type: 'UPLOAD_DONE', id, bucketId })
}
if (fileMetadata && 'processedFiles' in fileMetadata) {
// TODO: Add support for multiple files
const { id, bucketId } = fileMetadata.processedFiles[0]
callback({ type: 'UPLOAD_DONE', id, bucketId })
}
})
return () => {}

View File

@@ -39,13 +39,14 @@ export interface StorageUploadFormDataParams {
id?: string
name?: string
bucketId?: string
headers?: Record<string, string>
}
// works in browser and server
export type StorageUploadParams = StorageUploadFileParams | StorageUploadFormDataParams
export type StorageUploadResponse =
| { fileMetadata: FileResponse; error: null }
| { fileMetadata: FileResponse | { processedFiles: FileResponse[] }; error: null }
| { fileMetadata: null; error: StorageErrorPayload }
export interface StorageImageTransformationParams {
@@ -94,13 +95,6 @@ export interface FileResponse {
uploadedByUserId: string
}
export interface ApiUploadParams {
formData: FormData
id?: string
name?: string
bucketId?: string
}
// TODO not implemented yet in hasura-storage
// export interface ApiGetPresignedUrlParams extends StorageImageTransformationParams {
export interface ApiGetPresignedUrlParams {

View File

@@ -1,5 +1,5 @@
import fetchPonyfill from 'fetch-ponyfill'
import FormData from 'form-data'
import fetch from 'isomorphic-unfetch'
import { StorageErrorPayload, StorageUploadResponse } from './types'
/** Convert any string into ISO-8859-1 */
@@ -12,6 +12,8 @@ export const toIso88591 = (fileName: string) => {
}
}
const { fetch } = fetchPonyfill()
export const fetchUpload = async (
backendUrl: string,
data: FormData,
@@ -21,7 +23,8 @@ export const fetchUpload = async (
fileId,
bucketId,
adminSecret,
onUploadProgress
onUploadProgress,
headers: initialHeaders = {}
}: {
accessToken?: string
name?: string
@@ -29,9 +32,13 @@ export const fetchUpload = async (
bucketId?: string
adminSecret?: string
onUploadProgress?: (event: { total: number; loaded: number }) => void
headers?: Record<string, string>
} = {}
): Promise<StorageUploadResponse> => {
const headers: HeadersInit = {}
const headers: HeadersInit = {
...initialHeaders
}
if (fileId) {
headers['x-nhost-file-id'] = fileId
}
@@ -58,16 +65,18 @@ export const fetchUpload = async (
body: data as any // * https://github.com/form-data/form-data/issues/513
})
const responseData = await response.json()
if (!response.ok) {
const error: StorageErrorPayload = {
status: response.status,
message: await response.text(),
message: responseData?.error?.message || response.statusText,
// * errors from hasura-storage are not codified
error: response.statusText
}
return { error, fileMetadata: null }
}
const fileMetadata = await response.json()
const fileMetadata = responseData
return { fileMetadata, error: null }
} catch (e) {
const error: StorageErrorPayload = {
@@ -78,6 +87,7 @@ export const fetchUpload = async (
return { error, fileMetadata: null }
}
}
// * Browser environment: XMLHttpRequest is available
return new Promise((resolve) => {
let xhr = new XMLHttpRequest()

View File

@@ -1,6 +1,5 @@
import FormData from 'form-data'
import fs from 'fs'
import fetch from 'isomorphic-unfetch'
import { v4 as uuidv4 } from 'uuid'
import { describe, expect, it } from 'vitest'
import { storage } from './utils/helpers'
@@ -12,8 +11,17 @@ describe('test get presigned url of file', () => {
const { fileMetadata } = await storage.upload({ formData })
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const fileId =
'processedFiles' in fileMetadata
? fileMetadata.processedFiles[0]?.id
: (fileMetadata.id as string)
const { presignedUrl, error } = await storage.getPresignedUrl({
fileId: fileMetadata?.id as string
fileId
})
expect(presignedUrl).not.toBeNull()

View File

@@ -1,6 +1,5 @@
import FormData from 'form-data'
import fs from 'fs'
import fetch from 'isomorphic-unfetch'
import { v4 as uuidv4 } from 'uuid'
import { describe, expect, it } from 'vitest'
import { storage } from './utils/helpers'
@@ -15,8 +14,17 @@ describe('test get file', () => {
})
expect(error).toBeNull()
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const fileId =
'processedFiles' in fileMetadata
? fileMetadata.processedFiles[0]?.id
: (fileMetadata.id as string)
const url = storage.getPublicUrl({
fileId: fileMetadata?.id as string
fileId
})
expect(url).toBeTruthy()

View File

@@ -1,6 +1,5 @@
import FormData from 'form-data'
import fs from 'fs'
import fetch from 'isomorphic-unfetch'
import jpeg from 'jpeg-js'
import pixelmatch from 'pixelmatch'
import { beforeAll, describe, expect, it } from 'vitest'
@@ -18,7 +17,15 @@ describe('Image transformation', () => {
const { fileMetadata } = await storage.upload({
formData: fd
})
fileId = fileMetadata?.id as string
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
fileId =
'processedFiles' in fileMetadata
? fileMetadata.processedFiles[0]?.id
: (fileMetadata.id as string)
})
it('should be able to change the image width in a public url', async () => {

View File

@@ -1,10 +1,12 @@
import fetchPonyfill from 'fetch-ponyfill'
import FormData from 'form-data'
import fs from 'fs'
import fetch from 'isomorphic-unfetch'
import { v4 as uuidv4 } from 'uuid'
import { describe, expect, it } from 'vitest'
import { storage } from './utils/helpers'
const { fetch } = fetchPonyfill()
describe('test upload', () => {
it('should upload a file from the file system', async () => {
const fd = new FormData()
@@ -44,8 +46,15 @@ describe('test upload', () => {
id: RANDOM_UUID
})
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const { id: fileId } =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
expect(error).toBeNull()
expect(fileMetadata?.id).toBe(RANDOM_UUID)
expect(fileId).toBe(RANDOM_UUID)
})
it('should upload a file with specific name', async () => {
@@ -59,8 +68,15 @@ describe('test upload', () => {
name: FILE_NAME
})
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const { name: fileName } =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
expect(error).toBeNull()
expect(fileMetadata?.name).toBe(FILE_NAME)
expect(fileName).toBe(FILE_NAME)
})
it('should upload a file with a non-ISO 8859-1 name', async () => {
@@ -72,8 +88,15 @@ describe('test upload', () => {
name: '你 好'
})
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const { name: fileName } =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
expect(error).toBeNull()
expect(fileMetadata?.name).toMatchInlineSnapshot('"%E4%BD%A0%20%E5%A5%BD"')
expect(fileName).toMatchInlineSnapshot('"%E4%BD%A0%20%E5%A5%BD"')
})
it('should upload a file with specific id and name', async () => {
@@ -89,9 +112,16 @@ describe('test upload', () => {
name: FILE_NAME
})
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const { id: fileId, name: fileName } =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
expect(error).toBeNull()
expect(fileMetadata?.id).toBe(RANDOM_UUID)
expect(fileMetadata?.name).toBe(FILE_NAME)
expect(fileId).toBe(RANDOM_UUID)
expect(fileName).toBe(FILE_NAME)
})
it('should upload a file with specific bucket id', async () => {
@@ -103,8 +133,15 @@ describe('test upload', () => {
bucketId: 'default'
})
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const { bucketId } =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
expect(error).toBeNull()
expect(fileMetadata?.bucketId).toBe('default')
expect(bucketId).toBe('default')
})
it('should upload a file with specific bucket id (test-bucket)', async () => {
@@ -116,7 +153,14 @@ describe('test upload', () => {
bucketId: 'test-bucket'
})
if (!fileMetadata) {
throw new Error('fileMetadata is missing')
}
const { bucketId } =
'processedFiles' in fileMetadata ? fileMetadata.processedFiles[0] : fileMetadata
expect(error).toBeNull()
expect(fileMetadata?.bucketId).toBe('test-bucket')
expect(bucketId).toBe('test-bucket')
})
})

View File

@@ -1,5 +1,11 @@
# @nhost/nextjs
## 1.13.27
### Patch Changes
- @nhost/react@2.0.21
## 1.13.26
### Patch Changes

View File

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

View File

@@ -1,5 +1,12 @@
# @nhost/nhost-js
## 2.2.7
### Patch Changes
- Updated dependencies [4c00a796e]
- @nhost/hasura-storage-js@2.1.5
## 2.2.6
### Patch Changes

View File

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

View File

@@ -1,5 +1,11 @@
# @nhost/react
## 2.0.21
### Patch Changes
- @nhost/nhost-js@2.2.7
## 2.0.20
### Patch Changes

View File

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

View File

@@ -1,5 +1,11 @@
# @nhost/vue
## 1.13.27
### Patch Changes
- @nhost/nhost-js@2.2.7
## 1.13.26
### Patch Changes

View File

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

173
pnpm-lock.yaml generated
View File

@@ -846,6 +846,25 @@ importers:
specifier: ^4.33.5
version: 4.33.6
examples/node-storage:
dependencies:
'@nhost/nhost-js':
specifier: '*'
version: link:../../packages/nhost-js
dotenv:
specifier: ^16.1.3
version: 16.1.3
form-data:
specifier: ^4.0.0
version: 4.0.0
node-fetch:
specifier: ^3.3.0
version: 3.3.0
devDependencies:
'@types/node':
specifier: ^18.15.11
version: 18.16.14
examples/react-apollo:
dependencies:
'@apollo/client':
@@ -1403,12 +1422,12 @@ importers:
packages/hasura-storage-js:
dependencies:
fetch-ponyfill:
specifier: ^7.1.0
version: 7.1.0
form-data:
specifier: ^4.0.0
version: 4.0.0
isomorphic-unfetch:
specifier: ^3.1.0
version: 3.1.0(encoding@0.1.13)
xstate:
specifier: ^4.33.5
version: 4.33.6
@@ -7062,7 +7081,7 @@ packages:
dependencies:
gqty: 2.3.0(graphql@16.6.0)
graphql: 16.6.0
undici: 5.12.0
undici: 5.22.1
dev: true
/@gqty/react@2.1.0(gqty@2.3.0)(graphql@16.6.0)(react@18.2.0):
@@ -8144,7 +8163,7 @@ packages:
'@types/jsonwebtoken': 9.0.0
chalk: 4.1.2
debug: 4.3.4
dotenv: 16.0.3
dotenv: 16.1.3
graphql: 16.6.0
graphql-request: 5.1.0(encoding@0.1.13)(graphql@16.6.0)
http-proxy-agent: 5.0.0
@@ -8177,7 +8196,7 @@ packages:
'@types/jsonwebtoken': 8.5.9
chalk: 4.1.2
debug: 4.3.4
dotenv: 16.0.3
dotenv: 16.1.3
graphql: 16.6.0
graphql-request: 4.3.0(graphql@16.6.0)
http-proxy-agent: 5.0.0
@@ -8210,7 +8229,7 @@ packages:
'@types/jsonwebtoken': 8.5.9
chalk: 4.1.2
debug: 4.3.4
dotenv: 16.0.3
dotenv: 16.1.3
graphql: 16.6.0
graphql-request: 4.3.0(graphql@16.6.0)
http-proxy-agent: 5.0.0
@@ -8496,7 +8515,7 @@ packages:
engines: {node: ^8.13.0 || >=10.10.0}
dependencies:
'@grpc/proto-loader': 0.7.3
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@grpc/proto-loader@0.7.3:
@@ -8671,7 +8690,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 16.18.11
'@types/node': 18.16.14
'@types/yargs': 15.0.14
chalk: 4.1.2
dev: true
@@ -8682,7 +8701,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 16.18.11
'@types/node': 18.16.14
'@types/yargs': 16.0.4
chalk: 4.1.2
dev: true
@@ -8694,7 +8713,7 @@ packages:
'@jest/schemas': 29.0.0
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
'@types/node': 16.18.11
'@types/node': 18.16.14
'@types/yargs': 17.0.13
chalk: 4.1.2
@@ -9782,7 +9801,7 @@ packages:
engines: {node: '>=14'}
hasBin: true
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
playwright-core: 1.34.0
optionalDependencies:
fsevents: 2.3.2
@@ -12729,12 +12748,12 @@ packages:
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
dependencies:
'@types/connect': 3.4.35
'@types/node': 16.18.11
'@types/node': 18.16.14
/@types/bonjour@3.5.10:
resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/chai-subset@1.3.3:
@@ -12751,13 +12770,13 @@ packages:
resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==}
dependencies:
'@types/express-serve-static-core': 4.17.28
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/connect@3.4.35:
resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
/@types/cookie@0.4.1:
resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
@@ -12804,7 +12823,7 @@ packages:
/@types/express-serve-static-core@4.17.28:
resolution: {integrity: sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
'@types/qs': 6.9.7
'@types/range-parser': 1.2.4
@@ -12830,20 +12849,20 @@ packages:
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
dependencies:
'@types/minimatch': 5.1.2
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/glob@8.1.0:
resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==}
dependencies:
'@types/minimatch': 5.1.2
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/graceful-fs@4.1.5:
resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/hast@2.3.4:
@@ -12864,7 +12883,7 @@ packages:
/@types/http-proxy@1.17.8:
resolution: {integrity: sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/is-ci@3.0.0:
@@ -12923,19 +12942,19 @@ packages:
/@types/jsonwebtoken@8.5.9:
resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/jsonwebtoken@9.0.0:
resolution: {integrity: sha512-mM4TkDpA9oixqg1Fv2vVpOFyIVLJjm5x4k0V+K/rEsizfjD7Tk7LKk3GTtbB7KCfP0FEHQtsZqFxYA0+sijNVg==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/keyv@3.1.4:
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/linkify-it@3.0.2:
@@ -12990,7 +13009,7 @@ packages:
/@types/node-fetch@2.6.2:
resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
form-data: 3.0.1
dev: true
@@ -13008,15 +13027,11 @@ packages:
/@types/node@18.11.17:
resolution: {integrity: sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==}
/@types/node@18.11.18:
resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
/@types/node@18.11.9:
resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
/@types/node@18.16.14:
resolution: {integrity: sha512-+ImzUB3mw2c5ISJUq0punjDilUQ5GnUim0ZRvchHIWJmOC0G+p0kzhXBqj6cDjK0QdPFwzrHWgrJp3RPvCG5qg==}
dev: true
/@types/normalize-package-data@2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@@ -13043,7 +13058,7 @@ packages:
/@types/pngjs@6.0.1:
resolution: {integrity: sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/prettier@2.7.1:
@@ -13137,7 +13152,7 @@ packages:
/@types/responselike@1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/retry@0.12.1:
@@ -13147,7 +13162,7 @@ packages:
/@types/sax@1.2.4:
resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/scheduler@0.16.2:
@@ -13171,18 +13186,18 @@ packages:
resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==}
dependencies:
'@types/mime': 1.3.2
'@types/node': 16.18.11
'@types/node': 18.16.14
/@types/set-cookie-parser@2.4.2:
resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/@types/sockjs@0.3.33:
resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: false
/@types/source-list-map@0.1.2:
@@ -13250,7 +13265,7 @@ packages:
/@types/webpack-sources@3.2.0:
resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
'@types/source-list-map': 0.1.2
source-map: 0.7.4
dev: true
@@ -13258,7 +13273,7 @@ packages:
/@types/webpack@4.41.33:
resolution: {integrity: sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
'@types/tapable': 1.0.8
'@types/uglify-js': 3.17.1
'@types/webpack-sources': 3.2.0
@@ -13269,7 +13284,7 @@ packages:
/@types/ws@8.5.3:
resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
/@types/yargs-parser@21.0.0:
resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
@@ -14771,7 +14786,7 @@ packages:
form-data-encoder: 1.7.2
formdata-node: 4.3.2
node-fetch: 2.6.7(encoding@0.1.13)
undici: 5.12.0
undici: 5.22.1
web-streams-polyfill: 3.2.1
transitivePeerDependencies:
- encoding
@@ -14787,7 +14802,7 @@ packages:
form-data-encoder: 1.7.2
formdata-node: 4.3.2
node-fetch: 2.6.7(encoding@0.1.13)
undici: 5.12.0
undici: 5.22.1
web-streams-polyfill: 3.2.1
transitivePeerDependencies:
- encoding
@@ -14801,7 +14816,7 @@ packages:
form-data-encoder: 1.7.2
formdata-node: 4.3.2
node-fetch: 2.6.7(encoding@0.1.13)
undici: 5.12.0
undici: 5.22.1
web-streams-polyfill: 3.2.1
transitivePeerDependencies:
- encoding
@@ -14816,7 +14831,7 @@ packages:
form-data-encoder: 1.7.2
formdata-node: 4.3.2
node-fetch: 2.6.7(encoding@0.1.13)
undici: 5.12.0
undici: 5.22.1
urlpattern-polyfill: 6.0.2
web-streams-polyfill: 3.2.1
transitivePeerDependencies:
@@ -18142,7 +18157,6 @@ packages:
/data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
dev: true
/data-urls@3.0.1:
resolution: {integrity: sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==}
@@ -18659,6 +18673,10 @@ packages:
resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
engines: {node: '>=12'}
/dotenv@16.1.3:
resolution: {integrity: sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==}
engines: {node: '>=12'}
/dotenv@8.6.0:
resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==}
engines: {node: '>=10'}
@@ -20099,7 +20117,7 @@ packages:
resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
engines: {node: '>= 0.8'}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
require-like: 0.1.2
dev: false
@@ -20445,7 +20463,14 @@ packages:
dependencies:
node-domexception: 1.0.0
web-streams-polyfill: 3.2.1
dev: true
/fetch-ponyfill@7.1.0:
resolution: {integrity: sha512-FhbbL55dj/qdVO3YNK7ZEkshvj3eQ7EuIGV2I6ic/2YiocvyWv+7jg2s4AyS0wdRU75s3tA8ZxI/xPigb0v5Aw==}
dependencies:
node-fetch: 2.6.7(encoding@0.1.13)
transitivePeerDependencies:
- encoding
dev: false
/fetch-retry@5.0.3:
resolution: {integrity: sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw==}
@@ -20835,7 +20860,6 @@ packages:
engines: {node: '>=12.20.0'}
dependencies:
fetch-blob: 3.2.0
dev: true
/forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
@@ -22962,7 +22986,7 @@ packages:
dependencies:
'@jest/types': 26.6.2
'@types/graceful-fs': 4.1.5
'@types/node': 16.18.11
'@types/node': 18.16.14
anymatch: 3.1.2
fb-watchman: 2.0.1
graceful-fs: 4.2.11
@@ -23009,7 +23033,7 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
'@jest/types': 27.5.1
'@types/node': 16.18.11
'@types/node': 18.16.14
dev: true
/jest-regex-util@26.0.0:
@@ -23021,7 +23045,7 @@ packages:
resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==}
engines: {node: '>= 10.14.2'}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
graceful-fs: 4.2.11
dev: true
@@ -23030,7 +23054,7 @@ packages:
engines: {node: '>= 10.14.2'}
dependencies:
'@jest/types': 26.6.2
'@types/node': 16.18.11
'@types/node': 18.16.14
chalk: 4.1.2
graceful-fs: 4.2.11
is-ci: 2.0.0
@@ -23042,7 +23066,7 @@ packages:
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@jest/types': 29.3.1
'@types/node': 16.18.11
'@types/node': 18.16.14
chalk: 4.1.2
ci-info: 3.5.0
graceful-fs: 4.2.11
@@ -23052,7 +23076,7 @@ packages:
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
engines: {node: '>= 10.13.0'}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
merge-stream: 2.0.0
supports-color: 7.2.0
dev: true
@@ -23061,7 +23085,7 @@ packages:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -23069,7 +23093,7 @@ packages:
resolution: {integrity: sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dependencies:
'@types/node': 16.18.11
'@types/node': 18.16.14
jest-util: 29.3.1
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -24873,7 +24897,6 @@ packages:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
dev: true
/node-forge@1.3.1:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
@@ -25196,7 +25219,7 @@ packages:
destr: 1.1.1
node-fetch-native: 0.1.3
ufo: 0.8.4
undici: 5.12.0
undici: 5.22.1
dev: true
/on-exit-leak-free@2.1.0:
@@ -26805,7 +26828,7 @@ packages:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 16.18.11
'@types/node': 18.16.14
long: 5.2.1
dev: false
@@ -29189,7 +29212,7 @@ packages:
resolution: {integrity: sha512-JHV2KoL+nMQRXu3m9ervCZZvi4DDCJfzHUE6CmtJxR9TmizyYfrVuhGvnsZLLnheby9Qrnf4Hq6iOEcejGwnGQ==}
engines: {node: ^8.1 || >=10.*}
dependencies:
'@types/node': 18.11.18
'@types/node': 18.16.14
qs: 6.11.0
dev: false
@@ -29197,7 +29220,7 @@ packages:
resolution: {integrity: sha512-erOslPQZSYKOotQjmKRy4eBon/tdhzLIYzBdPSNVWDdatSQozkkPlh8mVeXNwubYYZYx61/yS23eWiGDF93z2w==}
engines: {node: '>=12.*'}
dependencies:
'@types/node': 18.11.17
'@types/node': 18.16.14
qs: 6.11.0
dev: false
@@ -29205,7 +29228,7 @@ packages:
resolution: {integrity: sha512-aGwrJDqYzpjQj0ejt7oN7BE7kUjZFxhUz/gDeyDCS7CBpZhDb26Eb6z9sS8KdbsbmuS8rkkn2lBY4koK7L1ZCw==}
engines: {node: '>=12.*'}
dependencies:
'@types/node': 18.11.18
'@types/node': 18.16.14
qs: 6.11.0
dev: false
@@ -30574,9 +30597,9 @@ packages:
resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==}
dev: false
/undici@5.12.0:
resolution: {integrity: sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==}
engines: {node: '>=12.18'}
/undici@5.22.1:
resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==}
engines: {node: '>=14.0'}
dependencies:
busboy: 1.6.0
@@ -31276,7 +31299,7 @@ packages:
unist-util-stringify-position: 2.0.3
vfile-message: 2.0.4
/vite-node@0.30.0(@types/node@18.11.18):
/vite-node@0.30.0(@types/node@18.16.14):
resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==}
engines: {node: '>=v14.18.0'}
hasBin: true
@@ -31286,7 +31309,7 @@ packages:
mlly: 1.2.0
pathe: 1.1.0
picocolors: 1.0.0
vite: 4.3.8(@types/node@18.11.18)
vite: 4.3.8(@types/node@18.16.14)
transitivePeerDependencies:
- '@types/node'
- less
@@ -31297,7 +31320,7 @@ packages:
- terser
dev: true
/vite-node@0.31.0(@types/node@16.18.11):
/vite-node@0.31.0(@types/node@18.16.14):
resolution: {integrity: sha512-8x1x1LNuPvE2vIvkSB7c1mApX5oqlgsxzHQesYF7l5n1gKrEmrClIiZuOFbFDQcjLsmcWSwwmrWrcGWm9Fxc/g==}
engines: {node: '>=v14.18.0'}
hasBin: true
@@ -31307,7 +31330,7 @@ packages:
mlly: 1.2.0
pathe: 1.1.0
picocolors: 1.0.0
vite: 4.3.8(@types/node@16.18.11)
vite: 4.3.8(@types/node@18.16.14)
transitivePeerDependencies:
- '@types/node'
- less
@@ -31579,7 +31602,7 @@ packages:
optionalDependencies:
fsevents: 2.3.2
/vite@4.3.8(@types/node@18.11.18):
/vite@4.3.8(@types/node@18.16.14):
resolution: {integrity: sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -31604,7 +31627,7 @@ packages:
terser:
optional: true
dependencies:
'@types/node': 18.11.18
'@types/node': 18.16.14
esbuild: 0.17.19
postcss: 8.4.23
rollup: 3.23.0
@@ -31645,7 +31668,7 @@ packages:
dependencies:
'@types/chai': 4.3.4
'@types/chai-subset': 1.3.3
'@types/node': 18.11.18
'@types/node': 18.16.14
'@vitest/expect': 0.30.0
'@vitest/runner': 0.30.0
'@vitest/snapshot': 0.30.0
@@ -31666,8 +31689,8 @@ packages:
strip-literal: 1.0.1
tinybench: 2.4.0
tinypool: 0.4.0
vite: 4.3.8(@types/node@18.11.18)
vite-node: 0.30.0(@types/node@18.11.18)
vite: 4.3.8(@types/node@18.16.14)
vite-node: 0.30.0(@types/node@18.16.14)
why-is-node-running: 2.2.2
transitivePeerDependencies:
- less
@@ -31711,7 +31734,7 @@ packages:
dependencies:
'@types/chai': 4.3.4
'@types/chai-subset': 1.3.3
'@types/node': 16.18.11
'@types/node': 18.16.14
'@vitest/expect': 0.31.0
'@vitest/runner': 0.31.0
'@vitest/snapshot': 0.31.0
@@ -31732,8 +31755,8 @@ packages:
strip-literal: 1.0.1
tinybench: 2.4.0
tinypool: 0.5.0
vite: 4.3.8(@types/node@16.18.11)
vite-node: 0.31.0(@types/node@16.18.11)
vite: 4.3.8(@types/node@18.16.14)
vite-node: 0.31.0(@types/node@18.16.14)
why-is-node-running: 2.2.2
transitivePeerDependencies:
- less