Compare commits

...

39 Commits

Author SHA1 Message Date
github-actions[bot]
6f419be2c1 chore: update versions (#2634)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/apollo@6.2.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost/react-apollo@11.0.1

### Patch Changes

-   @nhost/apollo@6.2.1
-   @nhost/react@3.4.1

## @nhost/react-urql@8.0.1

### Patch Changes

-   @nhost/react@3.4.1

## @nhost/hasura-auth-js@2.4.1

### Patch Changes

-   bcd889b: fix: change expiresAt format to RFC3339 in createPATPromise

## @nhost/nextjs@2.1.10

### Patch Changes

-   @nhost/react@3.4.1

## @nhost/nhost-js@3.0.11

### Patch Changes

-   Updated dependencies [bcd889b]
    -   @nhost/hasura-auth-js@2.4.1

## @nhost/react@3.4.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost/vue@2.5.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost/docs@2.9.0

### Minor Changes

-   3c31657: chore: update docs with provider connect

### Patch Changes

-   992939c: feat: added social connect docs

## @nhost/dashboard@1.12.1

### Patch Changes

- 93ebdf8: fix: use service urls when initilizaing NhostClient running
local dashboard
    -   @nhost/react-apollo@11.0.1
    -   @nhost/nextjs@2.1.10

## @nhost-examples/cli@0.3.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost-examples/codegen-react-apollo@0.4.1

### Patch Changes

-   @nhost/react@3.4.1
-   @nhost/react-apollo@11.0.1

## @nhost-examples/codegen-react-query@0.4.1

### Patch Changes

-   @nhost/react@3.4.1

## @nhost-examples/codegen-react-urql@0.3.1

### Patch Changes

-   @nhost/react@3.4.1
-   @nhost/react-urql@8.0.1

## @nhost-examples/multi-tenant-one-to-many@2.2.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost-examples/nextjs@0.3.1

### Patch Changes

-   @nhost/react@3.4.1
-   @nhost/react-apollo@11.0.1
-   @nhost/nextjs@2.1.10

## @nhost-examples/node-storage@0.2.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost-examples/nextjs-server-components@0.4.1

### Patch Changes

-   @nhost/nhost-js@3.0.11

## @nhost-examples/react-apollo@0.8.1

### Patch Changes

-   @nhost/react@3.4.1
-   @nhost/react-apollo@11.0.1

## @nhost-examples/react-gqty@1.2.1

### Patch Changes

-   @nhost/react@3.4.1

## @nhost-examples/vue-apollo@0.6.1

### Patch Changes

-   @nhost/nhost-js@3.0.11
-   @nhost/apollo@6.2.1
-   @nhost/vue@2.5.1

## @nhost-examples/vue-quickstart@0.2.1

### Patch Changes

-   @nhost/apollo@6.2.1
-   @nhost/vue@2.5.1

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-04-04 10:49:02 +01:00
Hassan Ben Jobrane
93ebdf844f fix: dashboard: use service urls when running locally with the cli (#2622) 2024-04-04 10:28:38 +01:00
Hassan Ben Jobrane
bcd889b53a fix: hasura-auth-js: use RFC3339 format for expiresAt when creating a PAT (#2637) 2024-04-03 21:40:02 +01:00
David Barroso
992939cdcd feat (docs): added social connect docs (#2633)
Co-authored-by: Nuno Pato <nunopato@gmail.com>
2024-04-03 16:37:07 +02:00
Nuno Pato
3c31657c50 chore: update docs with provider connect (#2632)
Co-authored-by: David Barroso <dbarrosop@dravetech.com>
2024-04-03 14:27:49 +00:00
github-actions[bot]
a654d536e0 chore: update versions (#2618)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/apollo@6.2.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost/google-translation@0.2.0

### Minor Changes

-   768ca17: chore: update dependencies

## @nhost/react-apollo@11.0.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/apollo@6.2.0
    -   @nhost/react@3.4.0

## @nhost/react-urql@8.0.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react@3.4.0

## @nhost/stripe-graphql-js@1.2.0

### Minor Changes

-   768ca17: chore: update dependencies

## @nhost/react@3.4.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost/vue@2.5.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost/nextjs@2.1.9

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react@3.4.0

## @nhost/dashboard@1.12.0

### Minor Changes

- f242e4b: feat: add connect with github to the user's account settings
-   768ca17: chore: update dependencies
- d62bd0f: fix: "Track this" option within the SQL editor now correctly
updates the metadata
- 91c2bb6: feat: refactor sign-in and sign-up pages to enforce email
verification

### Patch Changes

-   943831f: fix: resolve an error toast issue when unpausing a project
-   Updated dependencies [768ca17]
    -   @nhost/react-apollo@11.0.0
    -   @nhost/nextjs@2.1.9

## @nhost/docs@2.8.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   9f2bf9e: chore: added hasura's authHook settings

## @nhost-examples/cli@0.3.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/codegen-react-apollo@0.4.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react-apollo@11.0.0
    -   @nhost/react@3.4.0

## @nhost-examples/codegen-react-query@0.4.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react@3.4.0

## @nhost-examples/codegen-react-urql@0.3.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react-urql@8.0.0
    -   @nhost/react@3.4.0

## @nhost-examples/docker-compose@0.4.0

### Minor Changes

-   768ca17: chore: update dependencies

## @nhost-examples/multi-tenant-one-to-many@2.2.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/nextjs@0.3.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react-apollo@11.0.0
    -   @nhost/react@3.4.0
    -   @nhost/nextjs@2.1.9

## @nhost-examples/node-storage@0.2.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/nextjs-server-components@0.4.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/sveltekit@0.4.0

### Minor Changes

-   768ca17: chore: update dependencies

## @nhost-examples/react-apollo@0.8.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   863b37d: chore: bump hasura-auth
-   Updated dependencies [768ca17]
    -   @nhost/react-apollo@11.0.0
    -   @nhost/react@3.4.0

## @nhost-examples/react-gqty@1.2.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/react@3.4.0

## @nhost-examples/serverless-functions@0.2.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/stripe-graphql-js@1.2.0

## @nhost-examples/vue-apollo@0.6.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/apollo@6.2.0
    -   @nhost/vue@2.5.0
    -   @nhost/nhost-js@3.0.10

## @nhost-examples/vue-quickstart@0.2.0

### Minor Changes

-   768ca17: chore: update dependencies

### Patch Changes

-   Updated dependencies [768ca17]
    -   @nhost/apollo@6.2.0
    -   @nhost/vue@2.5.0

## @nhost/docgen@0.3.0

### Minor Changes

-   768ca17: chore: update dependencies

## @nhost/sync-versions@0.2.0

### Minor Changes

-   768ca17: chore: update dependencies

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Hassan Ben Jobrane <hsanbenjobrane@gmail.com>
2024-04-03 13:29:25 +01:00
Hassan Ben Jobrane
91c2bb6f53 feat: dashboard: restrict signup/signin to verified emails only (#2610)
resolves https://github.com/nhost/nhost/issues/2585
2024-04-03 12:52:47 +01:00
David Barroso
9f2bf9ec2b chore (docs): added hasura's authHook settings (#2630) 2024-04-03 09:01:28 +02:00
Nuno Pato
d62bd0fc9a fix: dashboard: SQL editor "track this" (#2626)
fixes https://github.com/nhost/nhost/issues/2625

---------

Co-authored-by: Hassan Ben Jobrane <hsanbenjobrane@gmail.com>
2024-04-02 16:50:26 +00:00
github-actions[bot]
768ca17494 [Scheduled] Update dependencies (#2627)
Dependencies updated

Note - If you see this PR and the checks haven't run, close and reopen
the PR. See
https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#triggering-further-workflow-runs

---------

Co-authored-by: dbarrosop <dbarrosop@users.noreply.github.com>
Co-authored-by: Hassan Ben Jobrane <hsanbenjobrane@gmail.com>
2024-04-02 16:44:24 +01:00
Hassan Ben Jobrane
943831fe2e fix: await unpauseApplication promise (#2621)
fixes https://github.com/nhost/nhost/issues/2620
2024-03-26 09:29:10 +01:00
Hassan Ben Jobrane
f242e4b92f feat: connect with github (#2616)
fixes https://github.com/nhost/nhost/issues/2581
2024-03-25 13:22:15 +01:00
David Barroso
863b37d313 chore (examples/apollo): bump hasura-auth (#2617) 2024-03-23 12:07:22 +01:00
github-actions[bot]
c8a8d4fca3 chore: update versions (#2609)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/hasura-auth-js@2.4.0

### Minor Changes

- 311374e: fix: ensure that the user remains signed in even after being
redirected with an error following an attempt to connect with a social
provider

### Patch Changes

-   1623e9b: chore: update `@simplewebauthn/browser` to `9.0.1`

## @nhost/vue@2.4.0

### Minor Changes

-   311374e: feat: add `connect` param to `useProviderLink` hook

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost/apollo@6.1.2

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost/react-apollo@10.0.2

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2
    -   @nhost/apollo@6.1.2

## @nhost/react-urql@7.0.2

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2

## @nhost/nextjs@2.1.8

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2

## @nhost/nhost-js@3.0.10

### Patch Changes

-   Updated dependencies [1623e9b]
-   Updated dependencies [311374e]
    -   @nhost/hasura-auth-js@2.4.0

## @nhost/react@3.3.2

### Patch Changes

-   311374e: feat: add `connect` param to `useProviderLink` hook
    -   @nhost/nhost-js@3.0.10

## @nhost-examples/docker-compose@0.3.0

### Minor Changes

- e40a452: chore: clarification on greyed-out options in the dashboard
when self-hosting

## @nhost-examples/react-apollo@0.7.0

### Minor Changes

- 311374e: feat: add example of how to connect a social auth provider to
an existing account

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2
    -   @nhost/react-apollo@10.0.2

## @nhost-examples/vue-apollo@0.5.0

### Minor Changes

- 311374e: feat: add example of how to connect a social auth provider to
an existing account

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/vue@2.4.0
    -   @nhost/nhost-js@3.0.10
    -   @nhost/apollo@6.1.2

## @nhost/dashboard@1.11.2

### Patch Changes

-   @nhost/react-apollo@10.0.2
-   @nhost/nextjs@2.1.8

## @nhost/docs@2.7.2

### Patch Changes

-   5c47e8e: feat: added hasura's stringifyNumericTypes setting

## @nhost-examples/cli@0.2.2

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/codegen-react-apollo@0.3.1

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2
    -   @nhost/react-apollo@10.0.2

## @nhost-examples/codegen-react-query@0.3.1

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2

## @nhost-examples/codegen-react-urql@0.2.1

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2
    -   @nhost/react-urql@7.0.2

## @nhost-examples/multi-tenant-one-to-many@2.1.2

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/nextjs@0.2.2

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2
    -   @nhost/react-apollo@10.0.2
    -   @nhost/nextjs@2.1.8

## @nhost-examples/node-storage@0.1.2

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/nextjs-server-components@0.3.2

### Patch Changes

-   @nhost/nhost-js@3.0.10

## @nhost-examples/react-gqty@1.1.2

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/react@3.3.2

## @nhost-examples/vue-quickstart@0.1.2

### Patch Changes

-   Updated dependencies [311374e]
    -   @nhost/vue@2.4.0
    -   @nhost/apollo@6.1.2

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-03-21 17:54:02 +01:00
Hassan Ben Jobrane
311374e3fb feat: react-apollo: add example of how to connect github to an existing account (#2615)
fixes https://github.com/nhost/nhost/issues/2582
2024-03-21 17:38:54 +01:00
Seth Deegan
e40a4529b4 chore (examples/docker-compose): clarification on greyed-out options in the dashboard when self-hosting (#2564) 2024-03-18 11:03:10 +01:00
Hassan Ben Jobrane
1623e9bd20 chore: hasura-auth-js: upgrade @simplewebauthn/browser to 9.0.1 (#2611)
fixes https://github.com/nhost/nhost/issues/2597
2024-03-13 17:25:29 +01:00
David Barroso
5c47e8e675 feat (docs): added hasura's stringifyNumericTypes setting (#2608) 2024-03-12 11:29:53 +01:00
github-actions[bot]
9f9f1c64f4 chore: update versions (#2605)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/dashboard@1.11.1

### Patch Changes

-   981404f: fix: set default value for healthCheck field validation

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-03-11 11:02:17 +01:00
Hassan Ben Jobrane
981404f0b9 fix(dashboard): set default value for healthCheck field validation (#2604) 2024-03-11 10:45:33 +01:00
github-actions[bot]
4ad27e9d72 chore: update versions (#2599)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/apollo@6.1.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost/react-apollo@10.0.1

### Patch Changes

-   @nhost/apollo@6.1.1
-   @nhost/react@3.3.1

## @nhost/react-urql@7.0.1

### Patch Changes

-   @nhost/react@3.3.1

## @nhost/stripe-graphql-js@1.1.1

### Patch Changes

-   7789469: chore: address linter errors and remove unnecessary imports

## @nhost/graphql-js@0.1.9

### Patch Changes

- 7789469: fix: resolve process is undefined error when running with
vitejs

## @nhost/nextjs@2.1.7

### Patch Changes

-   @nhost/react@3.3.1

## @nhost/nhost-js@3.0.9

### Patch Changes

-   Updated dependencies [7789469]
    -   @nhost/graphql-js@0.1.9

## @nhost/react@3.3.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost/vue@2.3.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost/dashboard@1.11.0

### Minor Changes

- 7789469: chore: upgrade dependency `@graphql-codegen/cli` to `5.0.2`
to address vulnerability
- 6c11b75: feat: add update user displayName section in account settings

### Patch Changes

-   @nhost/react-apollo@10.0.1
-   @nhost/nextjs@2.1.7

## @nhost-examples/codegen-react-apollo@0.3.0

### Minor Changes

- 7789469: chore: upgrade dependency `@graphql-codegen/cli` to `5.0.2`
to address vulnerability

### Patch Changes

-   @nhost/react@3.3.1
-   @nhost/react-apollo@10.0.1

## @nhost-examples/codegen-react-query@0.3.0

### Minor Changes

- 7789469: chore: upgrade dependency `@graphql-codegen/cli` to `5.0.2`
to address vulnerability

### Patch Changes

-   @nhost/react@3.3.1

## @nhost-examples/codegen-react-urql@0.2.0

### Minor Changes

- 7789469: chore: upgrade dependency `@graphql-codegen/cli` to `5.0.2`
to address vulnerability

### Patch Changes

-   @nhost/react@3.3.1
-   @nhost/react-urql@7.0.1

## @nhost-examples/react-apollo@0.6.0

### Minor Changes

- 7789469: chore: upgrade dependency `@graphql-codegen/cli` to `5.0.2`
to address vulnerability

### Patch Changes

-   @nhost/react@3.3.1
-   @nhost/react-apollo@10.0.1

## @nhost-examples/cli@0.2.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost-examples/multi-tenant-one-to-many@2.1.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost-examples/nextjs@0.2.1

### Patch Changes

-   @nhost/react@3.3.1
-   @nhost/react-apollo@10.0.1
-   @nhost/nextjs@2.1.7

## @nhost-examples/node-storage@0.1.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost-examples/nextjs-server-components@0.3.1

### Patch Changes

-   @nhost/nhost-js@3.0.9

## @nhost-examples/react-gqty@1.1.1

### Patch Changes

-   @nhost/react@3.3.1

## @nhost-examples/serverless-functions@0.1.1

### Patch Changes

-   Updated dependencies [7789469]
    -   @nhost/stripe-graphql-js@1.1.1

## @nhost-examples/vue-apollo@0.4.1

### Patch Changes

-   7789469: chore: address linter errors and remove unnecessary imports
    -   @nhost/nhost-js@3.0.9
    -   @nhost/apollo@6.1.1
    -   @nhost/vue@2.3.1

## @nhost-examples/vue-quickstart@0.1.1

### Patch Changes

-   @nhost/apollo@6.1.1
-   @nhost/vue@2.3.1

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-03-08 15:51:16 +01:00
Hassan Ben Jobrane
778946998a fix: graphql-js: resolve process is undefined error when running with vitejs (#2601)
fixes https://github.com/nhost/nhost/issues/2600
2024-03-08 15:23:13 +01:00
Hassan Ben Jobrane
6c11b75807 feat: dashboard: add update user displayName section in account settings (#2598)
fixes https://github.com/nhost/nhost/issues/1489
2024-03-07 17:23:35 +01:00
github-actions[bot]
2dc031d16c chore: update versions (#2592)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost-examples/react-apollo@0.5.0

### Minor Changes

- 08a7dd9: feat: add example workaround to the reset password ticket
expired issue

### Patch Changes

- f0a994a: fix: update allowedUrls and redirectTo to point to the
profile page

## @nhost-examples/vue-apollo@0.4.0

### Minor Changes

- 08a7dd9: feat: add example workaround to the reset password ticket
expired issue

### Patch Changes

- f0a994a: fix: update allowedUrls and redirectTo to point to the
profile page

## @nhost/docs@2.7.1

### Patch Changes

-   6cb2b63: feat: added nhost run env documentation
-   40bd3e4: fix: fixed wrong links in documentation

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-03-06 16:56:26 +01:00
Nicolas Bourdin
40bd3e4572 doc(link): fix wrong links in documentation (#2596)
Co-authored-by: Nicolas Bourdin <nicolas@epeak.co>
Co-authored-by: David Barroso <dbarrosop@dravetech.com>
2024-03-06 14:50:32 +01:00
David Barroso
6cb2b6331a feat (docs): added nhost run env documentation (#2594) 2024-03-06 14:13:02 +01:00
Hassan Ben Jobrane
08a7dd9894 feat(examples): add reset password ticket expired workarounds in the examples (#2590)
fixes https://github.com/nhost/nhost/issues/2314
2024-03-05 15:48:46 +01:00
Hassan Ben Jobrane
f0a994a26e fix(examples): update allowedUrls and redirectTo to point to /profile (#2591) 2024-03-05 14:17:01 +01:00
Hassan Ben Jobrane
4fbd6bd4fa chore: fix release with missing changeset (#2588)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-03-04 16:51:57 +01:00
github-actions[bot]
67fc77486c chore: update versions (#2578)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/apollo@6.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost/google-translation@0.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

## @nhost/react-apollo@10.0.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/apollo@6.1.0
    -   @nhost/react@3.3.0

## @nhost/react-urql@7.0.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react@3.3.0

## @nhost/stripe-graphql-js@1.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

## @nhost/react@3.3.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost/vue@2.3.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost/nextjs@2.1.6

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react@3.3.0

## @nhost/dashboard@1.10.0

### Minor Changes

-   49a80c2: chore: update dependencies
-   150c04a: feat: add healthcheck config to run services

### Patch Changes

- e03f141: fix: allow insert, update and delete on tables in `auth` and
`storage` schemas
- 28676f4: feat: add min postgres version check to enable the ai service
-   Updated dependencies [49a80c2]
    -   @nhost/react-apollo@10.0.0
    -   @nhost/nextjs@2.1.6

## @nhost/docs@2.7.0

### Minor Changes

-   49a80c2: chore: update dependencies

## @nhost-examples/cli@0.2.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost-examples/codegen-react-apollo@0.2.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react-apollo@10.0.0
    -   @nhost/react@3.3.0

## @nhost-examples/codegen-react-query@0.2.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react@3.3.0

## @nhost-examples/codegen-react-urql@0.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react-urql@7.0.0
    -   @nhost/react@3.3.0

## @nhost-examples/docker-compose@0.2.0

### Minor Changes

-   49a80c2: chore: update dependencies

## @nhost-examples/multi-tenant-one-to-many@2.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost-examples/nextjs@0.2.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react-apollo@10.0.0
    -   @nhost/react@3.3.0
    -   @nhost/nextjs@2.1.6

## @nhost-examples/node-storage@0.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost-examples/nextjs-server-components@0.3.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   @nhost/nhost-js@3.0.8

## @nhost-examples/sveltekit@0.3.0

### Minor Changes

-   49a80c2: chore: update dependencies

## @nhost-examples/react-apollo@0.4.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

- 4f3fb34: fix: set redirectTo when doing sign in with github and
include vercel previews in allowed redirect URLs
-   Updated dependencies [49a80c2]
    -   @nhost/react-apollo@10.0.0
    -   @nhost/react@3.3.0

## @nhost-examples/react-gqty@1.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/react@3.3.0

## @nhost-examples/serverless-functions@0.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/stripe-graphql-js@1.1.0

## @nhost-examples/vue-apollo@0.3.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

- 4f3fb34: fix: set redirectTo when doing sign in with github and
include vercel previews in allowed redirect URLs
-   Updated dependencies [49a80c2]
    -   @nhost/apollo@6.1.0
    -   @nhost/vue@2.3.0
    -   @nhost/nhost-js@3.0.8

## @nhost-examples/vue-quickstart@0.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

### Patch Changes

-   Updated dependencies [49a80c2]
    -   @nhost/apollo@6.1.0
    -   @nhost/vue@2.3.0

## @nhost/docgen@0.2.0

### Minor Changes

-   49a80c2: chore: update dependencies

## @nhost/sync-versions@0.1.0

### Minor Changes

-   49a80c2: chore: update dependencies

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Hassan Ben Jobrane <hsanbenjobrane@gmail.com>
2024-03-04 16:16:06 +01:00
Hassan Ben Jobrane
4f3fb3446e fix: set redirectTo in oauth examples (#2586) 2024-03-04 15:33:24 +01:00
Hassan Ben Jobrane
49a80c22be chore: add changeset (#2584)
adds missing changeset for this PR
https://github.com/nhost/nhost/pull/2574
2024-03-04 13:52:38 +01:00
Hassan Ben Jobrane
28676f4cdc feat: dashboard: add min postgres version check to enable the ai service (#2576)
fixes https://github.com/nhost/nhost/issues/2439
2024-03-02 22:33:49 +01:00
Hassan Ben Jobrane
e03f14133c fix: dashboard: refactor database datagrid to allow insert/update/delete for tables auth and storage (#2577)
fixes https://github.com/nhost/nhost/issues/2476
2024-03-02 22:04:23 +01:00
Hassan Ben Jobrane
150c04a4f4 feat: dashboard: add healthcheck config to run services (#2575)
fixes https://github.com/nhost/nhost/issues/2410
2024-03-02 19:28:13 +01:00
github-actions[bot]
bccd67b1b1 [Scheduled] Update dependencies (#2574)
Dependencies updated

Note - If you see this PR and the checks haven't run, close and reopen
the PR. See
https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#triggering-further-workflow-runs

---------

Co-authored-by: David Barroso <dbarrosop@dravetech.com>
Co-authored-by: dbarrosop <dbarrosop@users.noreply.github.com>
Co-authored-by: Hassan Ben Jobrane <hsanbenjobrane@gmail.com>
2024-03-02 18:40:03 +01:00
David Barroso
b14fd2f14c chore: fix role to assume in gen update dependencies (#2573) 2024-03-01 12:21:38 +01:00
github-actions[bot]
68b3d23cd9 chore: update versions (#2572)
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @nhost/dashboard@1.9.0

### Minor Changes

-   d86e5c9: feat: add support for filtering the logs using a RegExp

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-02-29 17:54:02 +01:00
Hassan Ben Jobrane
d86e5c9c16 feat(dashboard): query services list from be and filter the logs using a regex (#2552)
fixes: https://github.com/nhost/nhost/issues/2391
2024-02-29 17:38:38 +01:00
208 changed files with 7916 additions and 5880 deletions

View File

@@ -22,7 +22,7 @@ jobs:
- name: Configure aws
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_PRODUCTION_CORE_ACCOUNT_ID }}:role/github-actions-nhost-be
role-to-assume: arn:aws:iam::${{ secrets.AWS_PRODUCTION_CORE_ACCOUNT_ID }}:role/github-actions-nhost-${{ github.event.repository.name }}
aws-region: eu-central-1
- uses: nixbuild/nix-quick-install-action@v26

3
config/.husky/pre-commit Executable file → Normal file
View File

@@ -1,4 +1,7 @@
#!/bin/sh
#
[ -n "$CI" ] && exit 0
. "$(dirname "$0")/_/husky.sh"
pnpm dlx lint-staged --config config/.lintstagedrc.js

View File

@@ -1,5 +1,75 @@
# @nhost/dashboard
## 1.12.1
### Patch Changes
- 93ebdf8: fix: use service urls when initilizaing NhostClient running local dashboard
- @nhost/react-apollo@11.0.1
- @nhost/nextjs@2.1.10
## 1.12.0
### Minor Changes
- f242e4b: feat: add connect with github to the user's account settings
- 768ca17: chore: update dependencies
- d62bd0f: fix: "Track this" option within the SQL editor now correctly updates the metadata
- 91c2bb6: feat: refactor sign-in and sign-up pages to enforce email verification
### Patch Changes
- 943831f: fix: resolve an error toast issue when unpausing a project
- Updated dependencies [768ca17]
- @nhost/react-apollo@11.0.0
- @nhost/nextjs@2.1.9
## 1.11.2
### Patch Changes
- @nhost/react-apollo@10.0.2
- @nhost/nextjs@2.1.8
## 1.11.1
### Patch Changes
- 981404f: fix: set default value for healthCheck field validation
## 1.11.0
### Minor Changes
- 7789469: chore: upgrade dependency `@graphql-codegen/cli` to `5.0.2` to address vulnerability
- 6c11b75: feat: add update user displayName section in account settings
### Patch Changes
- @nhost/react-apollo@10.0.1
- @nhost/nextjs@2.1.7
## 1.10.0
### Minor Changes
- 49a80c2: chore: update dependencies
- 150c04a: feat: add healthcheck config to run services
### Patch Changes
- e03f141: fix: allow insert, update and delete on tables in `auth` and `storage` schemas
- 28676f4: feat: add min postgres version check to enable the ai service
- Updated dependencies [49a80c2]
- @nhost/react-apollo@10.0.0
- @nhost/nextjs@2.1.6
## 1.9.0
### Minor Changes
- d86e5c9: feat: add support for filtering the logs using a RegExp
## 1.8.3
### Patch Changes

View File

@@ -16,8 +16,6 @@ const cspHeader = `
form-action 'self';
frame-ancestors 'none';
frame-src 'self' js.stripe.com;
block-all-mixed-content;
upgrade-insecure-requests;
`;
module.exports = withBundleAnalyzer({
@@ -42,10 +40,6 @@ module.exports = withBundleAnalyzer({
key: 'X-Frame-Options',
value: 'SAMEORIGIN',
},
{
key: 'Content-Security-Policy',
value: cspHeader.replace(/\n/g, ''),
},
],
},
];

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/dashboard",
"version": "1.8.3",
"version": "1.12.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
@@ -19,58 +19,58 @@
"e2e": "pnpm install-browsers && pnpm playwright test"
},
"dependencies": {
"@apollo/client": "^3.9.4",
"@codemirror/lang-sql": "^6.5.5",
"@apollo/client": "^3.9.9",
"@codemirror/lang-sql": "^6.6.2",
"@emotion/cache": "^11.11.0",
"@emotion/react": "^11.11.3",
"@emotion/react": "^11.11.4",
"@emotion/server": "^11.11.0",
"@emotion/styled": "^11.11.0",
"@fontsource/inter": "^5.0.16",
"@fontsource/roboto-mono": "^5.0.16",
"@graphiql/react": "^0.20.2",
"@emotion/styled": "^11.11.5",
"@fontsource/inter": "^5.0.17",
"@fontsource/roboto-mono": "^5.0.17",
"@graphiql/react": "^0.20.3",
"@graphiql/toolkit": "^0.9.1",
"@headlessui/react": "^1.7.18",
"@heroicons/react": "^1.0.6",
"@hookform/resolvers": "^3.3.4",
"@mui/base": "5.0.0-beta.31",
"@mui/material": "^5.15.7",
"@mui/system": "^5.15.7",
"@mui/material": "^5.15.14",
"@mui/system": "^5.15.14",
"@mui/x-date-pickers": "^5.0.20",
"@nhost/nextjs": "workspace:*",
"@nhost/react-apollo": "workspace:*",
"@segment/snippet": "^4.16.2",
"@stripe/react-stripe-js": "^2.4.0",
"@stripe/react-stripe-js": "^2.6.2",
"@stripe/stripe-js": "^1.54.2",
"@tailwindcss/forms": "^0.5.7",
"@tanstack/react-query": "^4.36.1",
"@tanstack/react-table": "^8.11.7",
"@tanstack/react-virtual": "^3.0.2",
"@uiw/codemirror-theme-github": "^4.21.21",
"@uiw/react-codemirror": "^4.21.21",
"@tanstack/react-table": "^8.15.3",
"@tanstack/react-virtual": "^3.2.0",
"@uiw/codemirror-theme-github": "^4.21.25",
"@uiw/react-codemirror": "^4.21.25",
"analytics-node": "^6.2.0",
"bcryptjs": "^2.4.3",
"clsx": "^1.2.1",
"date-fns": "^2.30.0",
"framer-motion": "^10.18.0",
"generate-password": "^1.7.1",
"graphiql": "^3.1.0",
"graphiql": "^3.1.1",
"graphql": "16.8.1",
"graphql-request": "^6.1.0",
"graphql-tag": "^2.12.6",
"graphql-ws": "^5.14.3",
"graphql-ws": "^5.16.0",
"just-kebab-case": "^4.2.0",
"lodash.debounce": "^4.0.8",
"next": "^14.1.0",
"next-seo": "^6.4.0",
"next": "^14.1.4",
"next-seo": "^6.5.0",
"node-pg-format": "^1.3.5",
"pluralize": "^8.0.0",
"react": "18.2.0",
"react-children-utilities": "^2.10.0",
"react-dom": "18.2.0",
"react-error-boundary": "^4.0.12",
"react-hook-form": "^7.50.0",
"react-error-boundary": "^4.0.13",
"react-hook-form": "^7.51.2",
"react-hot-toast": "^2.4.1",
"react-intersection-observer": "^9.5.4",
"react-intersection-observer": "^9.8.1",
"react-is": "18.2.0",
"react-loading-skeleton": "^2.2.0",
"react-markdown": "^9.0.1",
@@ -87,13 +87,13 @@
"tailwind-merge": "^1.14.0",
"utility-types": "^3.11.0",
"validator": "^13.11.0",
"yup": "^1.3.3",
"yup": "^1.4.0",
"yup-password": "^0.2.2"
},
"devDependencies": {
"@babel/core": "^7.23.9",
"@babel/core": "^7.24.3",
"@faker-js/faker": "^7.6.0",
"@graphql-codegen/cli": "^3.3.1",
"@graphql-codegen/cli": "^5.0.2",
"@graphql-codegen/typescript": "^3.0.4",
"@graphql-codegen/typescript-operations": "^3.0.4",
"@graphql-codegen/typescript-react-apollo": "^3.3.7",
@@ -106,50 +106,50 @@
"@storybook/addon-postcss": "^2.0.0",
"@storybook/builder-webpack5": "^6.5.16",
"@storybook/manager-webpack5": "^6.5.16",
"@storybook/react": "^7.6.15",
"@storybook/react": "^7.6.17",
"@storybook/testing-library": "^0.2.2",
"@tailwindcss/typography": "^0.5.10",
"@tailwindcss/typography": "^0.5.12",
"@testing-library/dom": "^9.3.4",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^14.2.0",
"@testing-library/react": "^14.2.2",
"@testing-library/user-event": "^14.5.2",
"@types/ace": "^0.0.48",
"@types/bcryptjs": "^2.4.6",
"@types/jest": "^29.5.11",
"@types/jest": "^29.5.12",
"@types/lodash.debounce": "^4.0.9",
"@types/node": "^16.18.78",
"@types/node": "^16.18.93",
"@types/pluralize": "^0.0.30",
"@types/react": "^18.2.50",
"@types/react-dom": "^18.2.18",
"@types/react-table": "^7.7.19",
"@types/react": "^18.2.73",
"@types/react-dom": "^18.2.23",
"@types/react-table": "^7.7.20",
"@types/shell-quote": "^1.7.5",
"@types/testing-library__jest-dom": "^5.14.9",
"@types/validator": "^13.11.8",
"@typescript-eslint/eslint-plugin": "^6.20.0",
"@typescript-eslint/parser": "^6.20.0",
"@types/validator": "^13.11.9",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"@vitejs/plugin-react": "^4.2.1",
"@vitest/coverage-v8": "^0.32.4",
"autoprefixer": "^10.4.17",
"autoprefixer": "^10.4.19",
"babel-loader": "^8.3.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"csstype": "^3.1.3",
"dotenv": "^16.4.1",
"dotenv": "^16.4.5",
"encoding": "^0.1.13",
"eslint": "^8.56.0",
"eslint": "^8.57.0",
"eslint-config-airbnb": "19.0.4",
"eslint-config-airbnb-typescript": "^17.1.0",
"eslint-config-next": "^13.5.6",
"eslint-config-prettier": "^8.10.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0",
"jsdom": "^22.1.0",
"lint-staged": "^15.2.1",
"msw": "^1.3.2",
"lint-staged": "^15.2.2",
"msw": "^1.3.3",
"msw-storybook-addon": "^1.10.0",
"node-fetch": "^3.3.2",
"postcss": "^8.4.33",
"postcss": "^8.4.38",
"prettier": "^2.8.8",
"prettier-plugin-organize-imports": "^3.2.4",
"prettier-plugin-tailwindcss": "^0.4.1",
@@ -157,11 +157,11 @@
"require-from-string": "^2.0.2",
"snake-case": "^3.0.4",
"storybook-addon-next-router": "^4.0.2",
"tailwindcss": "^3.4.1",
"tailwindcss": "^3.4.3",
"ts-node": "^10.9.2",
"tsconfig-paths-webpack-plugin": "^4.1.0",
"vite": "^5.0.12",
"vite-tsconfig-paths": "^4.3.1",
"vite": "^5.2.7",
"vite-tsconfig-paths": "^4.3.2",
"vitest": "^0.32.4"
},
"browserslist": {

View File

@@ -35,7 +35,7 @@ function InsertPlaceholderTableRow({
...props
}: InsertPlaceholderTableRowProps) {
return (
<Box className="h-12 border-r-1 border-b-1" {...props}>
<Box className="h-12 border-b-1 border-r-1" {...props}>
<Button
onClick={onInsertRow}
variant="borderless"
@@ -209,7 +209,7 @@ export default function DataGridBody<T extends object>({
/>
) : (
<Box
className="inline-flex h-12 items-center border-b-1 border-r-1 py-1.5 px-2 text-xs"
className="inline-flex h-12 items-center border-b-1 border-r-1 px-2 py-1.5 text-xs"
sx={{ color: 'text.secondary' }}
style={{
width: allowInsertColumn
@@ -281,8 +281,8 @@ export default function DataGridBody<T extends object>({
}}
className={twMerge(
'h-12 font-display text-xs motion-safe:transition-colors',
'border-r-1 border-b-1',
'scroll-mt-[57px] scroll-ml-8',
'border-b-1 border-r-1',
'scroll-ml-8 scroll-mt-[57px]',
column.id === 'selection' &&
'sticky left-0 z-20 justify-center px-0',
)}
@@ -296,7 +296,7 @@ export default function DataGridBody<T extends object>({
})}
{allowInsertColumn && (
<Box className="h-12 w-25 border-r-1 border-b-1" />
<Box className="h-12 w-25 border-b-1 border-r-1" />
)}
</div>

View File

@@ -8,7 +8,15 @@ import type {
DataBrowserGridCellProps,
} from '@/features/database/dataGrid/types/dataBrowser';
import { triggerToast } from '@/utils/toast';
import type { FocusEvent, JSXElementConstructor, KeyboardEvent, MouseEvent, ReactElement, ReactNode, ReactPortal } from 'react';
import type {
FocusEvent,
JSXElementConstructor,
KeyboardEvent,
MouseEvent,
ReactElement,
ReactNode,
ReactPortal,
} from 'react';
import {
Children,
cloneElement,
@@ -308,7 +316,7 @@ function DataGridCellContent<TData extends object = {}, TValue = unknown>({
isEditable &&
'focus-within:outline-none focus-within:ring-0 focus:ring-0',
isSelected && 'shadow-outline',
isEditing ? 'p-0.5 shadow-outline-dark' : 'py-1.5 px-2',
isEditing ? 'p-0.5 shadow-outline-dark' : 'px-2 py-1.5',
className,
)}
onFocus={handleFocus}
@@ -320,20 +328,28 @@ function DataGridCellContent<TData extends object = {}, TValue = unknown>({
sx={{ backgroundColor: 'transparent' }}
{...props}
>
{Children.map(children, (child: ReactNode | ReactPortal | ReactElement<unknown, string | JSXElementConstructor<any>>) => {
if (!isValidElement(child)) {
return null;
}
{Children.map(
children,
(
child:
| ReactNode
| ReactPortal
| ReactElement<unknown, string | JSXElementConstructor<any>>,
) => {
if (!isValidElement(child)) {
return null;
}
return cloneElement(child, {
...child.props,
onSave: handleSave,
optimisticValue,
onOptimisticValueChange: setOptimisticValue,
temporaryValue,
onTemporaryValueChange: setTemporaryValue,
});
})}
return cloneElement(child, {
...child.props,
onSave: handleSave,
optimisticValue,
onOptimisticValueChange: setOptimisticValue,
temporaryValue,
onTemporaryValueChange: setTemporaryValue,
});
},
)}
</Box>
);

View File

@@ -1,6 +1,6 @@
import { PlusCircleIcon } from '@/components/ui/v2/icons/PlusCircleIcon';
import { PlusIcon } from '@/components/ui/v2/icons/PlusIcon';
import type { ComponentMeta, ComponentStory } from '@storybook/react';
import type { Meta, StoryFn } from '@storybook/react';
import type { ButtonProps } from './Button';
import Button from './Button';
@@ -24,9 +24,9 @@ export default {
control: { type: 'radio' },
},
},
} as ComponentMeta<typeof Button>;
} as Meta<typeof Button>;
const Template: ComponentStory<typeof Button> = function Template(
const Template: StoryFn<ButtonProps> = function TemplateFunction(
args: ButtonProps,
) {
return <Button {...args} />;

View File

@@ -1,5 +1,5 @@
import { Option } from '@/components/ui/v2/Option';
import type { ComponentMeta, ComponentStory } from '@storybook/react';
import type { Meta, StoryFn } from '@storybook/react';
import type { SelectProps } from './Select';
import Select from './Select';
@@ -7,11 +7,9 @@ export default {
title: 'UI Library / Select',
component: Select,
argTypes: {},
} as ComponentMeta<typeof Select>;
} as Meta<typeof Select>;
const Template: ComponentStory<typeof Select> = function Template(
args: SelectProps<any>,
) {
const Template: StoryFn<SelectProps<any>> = function TemplateFunction(args) {
return (
<Select className="w-64" {...args}>
<Option value="value1">Value 1</Option>

View File

@@ -1,4 +1,4 @@
import type { ComponentMeta, ComponentStory } from '@storybook/react';
import type { Meta, StoryFn } from '@storybook/react';
import type { SwitchProps } from './Switch';
import Switch from './Switch';
@@ -6,9 +6,9 @@ export default {
title: 'UI Library / Switch',
component: Switch,
argTypes: {},
} as ComponentMeta<typeof Switch>;
} as Meta<typeof Switch>;
const Template: ComponentStory<typeof Switch> = function Template(
const Template: StoryFn<SwitchProps> = function TemplateFunction(
args: SwitchProps,
) {
return <Switch label="Accept Rules" {...args} />;

View File

@@ -0,0 +1,85 @@
import { Form } from '@/components/form/Form';
import { SettingsContainer } from '@/components/layout/SettingsContainer';
import { Input } from '@/components/ui/v2/Input';
import { execPromiseWithErrorToast } from '@/utils/execPromiseWithErrorToast';
import { useUpdateUserDisplayNameMutation } from '@/utils/__generated__/graphql';
import { yupResolver } from '@hookform/resolvers/yup';
import { useUserData } from '@nhost/nextjs';
import { FormProvider, useForm } from 'react-hook-form';
import * as Yup from 'yup';
const validationSchema = Yup.object({
displayName: Yup.string()
.label('Display Name')
.required('This field is required.'),
});
export type DisplayNameSettingFormValues = Yup.InferType<
typeof validationSchema
>;
export default function DisplayNameSetting() {
const { id: userID, displayName } = useUserData();
const [updateUserDisplayName] = useUpdateUserDisplayNameMutation();
const form = useForm<DisplayNameSettingFormValues>({
reValidateMode: 'onSubmit',
defaultValues: {
displayName,
},
resolver: yupResolver(validationSchema),
});
const { register, formState } = form;
const isDirty = Object.keys(formState.dirtyFields).length > 0;
async function handleSubmit(formValues: DisplayNameSettingFormValues) {
await execPromiseWithErrorToast(
async () => {
await updateUserDisplayName({
variables: {
id: userID,
displayName: formValues.displayName,
},
});
form.reset({ displayName: formValues.displayName });
},
{
loadingMessage: 'Updating your display name...',
successMessage: 'Your display name has been updated successfully.',
errorMessage:
'An error occurred while trying to update your display name. Please try again.',
},
);
}
return (
<FormProvider {...form}>
<Form onSubmit={handleSubmit}>
<SettingsContainer
title="Update your display name"
slotProps={{
submitButton: {
disabled: !isDirty,
loading: formState.isSubmitting,
},
}}
className="grid grid-flow-row lg:grid-cols-5"
>
<Input
{...register('displayName')}
className="col-span-2"
type="text"
id="display-name"
label="Display Name"
fullWidth
helperText={formState.errors.displayName?.message}
error={Boolean(formState.errors.displayName)}
/>
</SettingsContainer>
</Form>
</FormProvider>
);
}

View File

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

View File

@@ -0,0 +1,76 @@
import { SettingsContainer } from '@/components/layout/SettingsContainer';
import { ActivityIndicator } from '@/components/ui/v2/ActivityIndicator';
import { Box } from '@/components/ui/v2/Box';
import { Button } from '@/components/ui/v2/Button';
import { GitHubIcon } from '@/components/ui/v2/icons/GitHubIcon';
import { Text } from '@/components/ui/v2/Text';
import { useGetAuthUserProvidersQuery } from '@/utils/__generated__/graphql';
import { useProviderLink } from '@nhost/nextjs';
import NavLink from 'next/link';
export default function SocialProvidersSettings() {
const { data, loading, error } = useGetAuthUserProvidersQuery();
const isGithubConnected = data?.authUserProviders?.some(
(item) => item.providerId === 'github',
);
const { github } = useProviderLink({
connect: true,
redirectTo: `${window.location.origin}/account`,
});
if (!data && loading) {
return (
<ActivityIndicator
delay={1000}
label="Loading personal access tokens..."
/>
);
}
if (error) {
throw error;
}
return (
<SettingsContainer
title="Authentication providers"
description=""
rootClassName="gap-0 flex flex-col items-start"
className="my-2"
slotProps={{
submitButton: { className: 'hidden' },
footer: { className: 'hidden' },
}}
>
{isGithubConnected ? (
<Box
sx={{ backgroundColor: 'grey.200' }}
className="flex flex-row items-center justify-start space-x-2 rounded-md p-2"
>
<GitHubIcon />
<Text className="font-medium ">Connected</Text>
</Box>
) : (
<Box>
<NavLink
href={github}
passHref
target="_blank"
rel="noreferrer noopener"
legacyBehavior
>
<Button
className=""
variant="outlined"
color="secondary"
startIcon={<GitHubIcon />}
>
Connect with GitHub
</Button>
</NavLink>
</Box>
)}
</SettingsContainer>
);
}

View File

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

View File

@@ -0,0 +1,6 @@
query getAuthUserProviders {
authUserProviders {
id
providerId
}
}

View File

@@ -0,0 +1,6 @@
mutation updateUserDisplayName($id: uuid!, $displayName: String!) {
updateUser(pk_columns: { id: $id }, _set: { displayName: $displayName }) {
id
displayName
}
}

View File

@@ -21,13 +21,17 @@ import {
useUpdateConfigMutation,
} from '@/generated/graphql';
import { RESOURCE_VCPU_MULTIPLIER } from '@/utils/constants/common';
import { getToastStyleProps } from '@/utils/constants/settings';
import { execPromiseWithErrorToast } from '@/utils/execPromiseWithErrorToast';
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';
import { DisableAIServiceConfirmationDialog } from './DisableAIServiceConfirmationDialog';
const MIN_POSTGRES_VERSION_SUPPORTING_AI = '14.6-20231018-1';
const validationSchema = Yup.object({
version: Yup.object({
label: Yup.string().required(),
@@ -54,7 +58,9 @@ export default function AISettings() {
const [aiServiceEnabled, setAIServiceEnabled] = useState(true);
const {
data: { config: { ai } = {} } = {},
data: {
config: { ai, postgres: { version: postgresVersion } = {} } = {},
} = {},
loading: loadingAiSettings,
error: errorGettingAiSettings,
} = useGetAiSettingsQuery({
@@ -150,6 +156,17 @@ export default function AISettings() {
]);
const toggleAIService = async (enabled: boolean) => {
if (postgresVersion < MIN_POSTGRES_VERSION_SUPPORTING_AI) {
toast.error(
'In order to enable the AI service you need to update your database version to 14.6-20231018-1 or newer.',
{
style: getToastStyleProps().style,
...getToastStyleProps().error,
},
);
return;
}
setAIServiceEnabled(enabled);
if (!enabled && ai) {

View File

@@ -1,5 +1,8 @@
query GetAISettings($appId: uuid!) {
config(appID: $appId, resolve: false) {
postgres {
version
}
ai {
version
webhookSecret

View File

@@ -275,7 +275,7 @@ export default function DataBrowserGrid({
() =>
columns
.map((column) => ({
...createDataGridColumn(column, isSchemaEditable),
...createDataGridColumn(column, true),
onCellEdit: async (variables: UpdateRecordVariables) => {
const result = await updateRow(variables);
await queryClient.invalidateQueries([currentTablePath]);
@@ -288,7 +288,6 @@ export default function DataBrowserGrid({
[
columns,
currentTablePath,
isSchemaEditable,
optimisticlyRemovedColumnId,
queryClient,
removableColumnId,
@@ -422,7 +421,7 @@ export default function DataBrowserGrid({
loading={status === 'loading'}
sortBy={sortBy}
className="pb-17 sm:pb-0"
onInsertRow={isSchemaEditable ? handleInsertRowClick : undefined}
onInsertRow={handleInsertRowClick}
onInsertColumn={isSchemaEditable ? handleInsertColumnClick : undefined}
onEditColumn={isSchemaEditable ? handleEditColumnClick : undefined}
onRemoveColumn={isSchemaEditable ? handleColumnRemoveClick : undefined}
@@ -445,7 +444,7 @@ export default function DataBrowserGrid({
onInsertColumnClick={
isSchemaEditable ? handleInsertColumnClick : undefined
}
onInsertRowClick={isSchemaEditable ? handleInsertRowClick : undefined}
onInsertRowClick={handleInsertRowClick}
paginationProps={{
currentPage: Math.max(currentPage, 1),
totalPages: Math.max(numberOfPages, 1),

View File

@@ -12,11 +12,9 @@ import { PlusIcon } from '@/components/ui/v2/icons/PlusIcon';
import { RowIcon } from '@/components/ui/v2/icons/RowIcon';
import { useDeleteRecordMutation } from '@/features/database/dataGrid/hooks/useDeleteRecordMutation';
import type { DataBrowserGridColumn } from '@/features/database/dataGrid/types/dataBrowser';
import { isSchemaLocked } from '@/features/database/dataGrid/utils/schemaHelpers/isSchemaLocked';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { triggerToast } from '@/utils/toast';
import { useQueryClient } from '@tanstack/react-query';
import { useRouter } from 'next/router';
import { useState } from 'react';
import type { Row } from 'react-table';
import { twMerge } from 'tailwind-merge';
@@ -58,11 +56,6 @@ export default function DataBrowserGridControls({
const { className: paginationClassName, ...restPaginationProps } =
paginationProps || ({} as DataGridPaginationProps);
const {
query: { schemaSlug },
} = useRouter();
const isSchemaEditable = !isSchemaLocked(schemaSlug as string);
const {
selectedFlatRows: selectedRows,
columns,
@@ -126,7 +119,7 @@ export default function DataBrowserGridControls({
numberOfSelectedRows > 0 ? 'justify-between' : 'justify-end',
)}
>
{isSchemaEditable && numberOfSelectedRows > 0 && (
{numberOfSelectedRows > 0 && (
<div className="grid grid-flow-col place-content-start items-center gap-2">
<Chip
size="small"

View File

@@ -43,7 +43,13 @@ export default async function deleteRecord({
(row) =>
`(${primaryOrUniqueColumns
.map((primaryOrUniqueColumn) =>
format('%I=%L', primaryOrUniqueColumn, row[primaryOrUniqueColumn]),
row[primaryOrUniqueColumn] === null
? format('%I IS NULL', primaryOrUniqueColumn)
: format(
'%I=%L',
primaryOrUniqueColumn,
row[primaryOrUniqueColumn],
),
)
.join(' AND ')})`,
);

View File

@@ -1,5 +1,6 @@
import { useDatabaseQuery } from '@/features/database/dataGrid/hooks/useDatabaseQuery';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { useIsPlatform } from '@/features/projects/common/hooks/useIsPlatform';
import { generateAppServiceUrl } from '@/features/projects/common/utils/generateAppServiceUrl';
import { getToastStyleProps } from '@/utils/constants/settings';
import { getHasuraAdminSecret } from '@/utils/env';
@@ -17,6 +18,7 @@ export default function useRunSQL(
migrationName: string,
) {
const { currentProject } = useCurrentWorkspaceAndProject();
const isPlatform = useIsPlatform();
const [loading, setLoading] = useState(false);
const [commandOk, setCommandOk] = useState(false);
@@ -179,8 +181,34 @@ export default function useRunSQL(
}
};
const trackAll = async (objects: any[]): Promise<Response[]> => {
const apiPath = isPlatform ? '/v1/metadata' : '/apis/migrate';
const responses: Response[] = await Promise.all(
objects.map((object) =>
fetch(`${appUrl}${apiPath}`, {
method: 'POST',
headers: { 'x-hasura-admin-secret': adminSecret },
body: JSON.stringify(object),
}).then((response) => {
if (!response.ok) {
console.error('failed to track:', response);
}
return response;
}),
),
).catch((error) => {
console.error('Error in trackAll:', error);
throw error;
});
return responses;
};
const updateMetadata = async (inputSQL: string) => {
const entities = parseIdentifiersFromSQL(inputSQL);
if (entities.length === 0) {
return;
}
const tablesOrViewEntities = entities.filter(
(entity) => entity.type !== 'function',
@@ -189,47 +217,75 @@ export default function useRunSQL(
(entity) => entity.type === 'function',
);
const trackTablesOrViews = tablesOrViewEntities.map(({ name, schema }) => ({
type: 'pg_track_table',
args: {
source: 'default',
table: {
name,
schema,
let trackTablesOrViews: any[] = [];
let trackFunctions: any[] = [];
if (isPlatform) {
// use v2/query
trackTablesOrViews = tablesOrViewEntities.map(({ name, schema }) => ({
type: 'pg_track_table',
args: {
source: 'default',
table: {
name,
schema,
},
},
},
}));
const trackFunctions = functionEntities.map(({ name, schema }) => ({
type: 'pg_track_function',
args: {
source: 'default',
function: {
name,
schema,
configuration: {},
}));
trackFunctions = functionEntities.map(({ name, schema }) => ({
type: 'pg_track_function',
args: {
source: 'default',
function: {
name,
schema,
configuration: {},
},
},
},
}));
const metaDataPayload = {
source: 'default',
type: 'bulk',
args: [...trackTablesOrViews, ...trackFunctions],
};
}));
} else {
// use apis/migrate
trackTablesOrViews = tablesOrViewEntities.map(({ name, schema }) => ({
name: `add_existing_table_or_view_${schema}_${name}`,
datasource: 'default',
down: [],
skip_execution: false,
up: [
{
type: 'pg_track_table',
args: {
table: { name, schema },
source: 'default',
},
},
],
}));
trackFunctions = functionEntities.map(({ name, schema }) => ({
name: `add_existing_function_or_view_${schema}_${name}`,
datasource: 'default',
down: [],
skip_execution: false,
up: [
{
type: 'pg_track_function',
args: {
function: { name, schema },
source: 'default',
},
},
],
}));
}
try {
if (entities.length > 0) {
const metadataApiResponse = await fetch(`${appUrl}/v1/metadata`, {
method: 'POST',
headers: { 'x-hasura-admin-secret': adminSecret },
body: JSON.stringify(metaDataPayload),
});
if (!metadataApiResponse.ok) {
throw new Error('Metadata API call failed');
}
}
await trackAll([...trackTablesOrViews, ...trackFunctions]).then(
(responses) => {
responses.forEach((response) => {
if (!response.ok) {
console.error('Error tracking table or view:', response);
}
});
},
);
} catch (error) {
toast.error('An error happened when calling the metadata API', {
style: toastStyle.style,

View File

@@ -47,7 +47,7 @@ export default function ApplicationPaused() {
async function handleTriggerUnpausing() {
await execPromiseWithErrorToast(
async () => {
unpauseApplication({ variables: { appId: currentProject.id } });
await unpauseApplication({ variables: { appId: currentProject.id } });
await refetchWorkspaceAndProject();
},
{

View File

@@ -25,12 +25,12 @@ function Plan({ planName, price, setPlan, planId, selectedPlanId }: any) {
return (
<button
type="button"
className="grid items-center justify-between w-full grid-flow-col gap-2 px-1 my-4"
className="my-4 grid w-full grid-flow-col items-center justify-between gap-2 px-1"
onClick={setPlan}
tabIndex={-1}
>
<div className="grid grid-flow-row gap-y-0.5">
<div className="grid items-center justify-start grid-flow-col gap-2">
<div className="grid grid-flow-col items-center justify-start gap-2">
<Checkbox
onChange={setPlan}
checked={selectedPlanId === planId}
@@ -40,7 +40,7 @@ function Plan({ planName, price, setPlan, planId, selectedPlanId }: any) {
<Text
variant="h3"
component="p"
className="self-center font-medium text-left"
className="self-center text-left font-medium"
>
Upgrade to {planName}
</Text>
@@ -119,7 +119,7 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
const handleUpdateAppPlan = async () => {
await execPromiseWithErrorToast(
async () => {
updateApp({
await updateApp({
variables: {
appId: app.id,
app: {
@@ -156,7 +156,7 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
if (pollingCurrentProject) {
return (
<Box className="w-full max-w-xl p-6 mx-auto text-left rounded-lg">
<Box className="mx-auto w-full max-w-xl rounded-lg p-6 text-left">
<div className="flex flex-col">
<div className="mx-auto">
<Image
@@ -179,7 +179,7 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
<Button
variant="outlined"
color="secondary"
className="w-full max-w-sm mx-auto mt-4"
className="mx-auto mt-4 w-full max-w-sm"
onClick={() => {
if (close) {
close();
@@ -196,7 +196,7 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
}
return (
<Box className="w-full max-w-xl p-6 text-left rounded-lg">
<Box className="w-full max-w-xl rounded-lg p-6 text-left">
<BaseDialog
open={showPaymentModal}
onClose={() => setShowPaymentModal(false)}
@@ -241,7 +241,7 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
))}
</div>
<div className="grid grid-flow-row gap-2 mt-2">
<div className="mt-2 grid grid-flow-row gap-2">
<Button
onClick={handleChangePlanClick}
disabled={!selectedPlan}

View File

@@ -131,7 +131,7 @@ export default function LogsBody({ logsData, loading, error }: LogsBodyProps) {
count: rows.length,
getScrollElement: () => tableRef.current,
estimateSize: () => 63,
overscan: 5,
overscan: 50,
});
if (loading && !error) {
@@ -214,7 +214,7 @@ export default function LogsBody({ logsData, loading, error }: LogsBodyProps) {
<TableCell
key={cell.id}
component="td"
className="break-words py-2.5 px-2 align-top text-xs- font-normal tracking-tight"
className="break-words px-2 py-2.5 align-top text-xs- font-normal tracking-tight"
style={{
width: cell.column.getSize() || 'auto',
minWidth: !cell.column.getSize() ? 300 : 'initial',

View File

@@ -52,7 +52,7 @@ function LogsDatePicker({
<Text
htmlFor={label}
component="label"
className="self-center text-sm+ font-normal"
className="min-w-14 self-center text-sm+ font-normal"
color="secondary"
>
{label}

View File

@@ -1,246 +1,240 @@
import { ControlledSelect } from '@/components/form/ControlledSelect';
import { Form } from '@/components/form/Form';
import { ActivityIndicator } from '@/components/ui/v2/ActivityIndicator';
import type { BoxProps } from '@/components/ui/v2/Box';
import { Box } from '@/components/ui/v2/Box';
import { Button } from '@/components/ui/v2/Button';
import { ClockIcon } from '@/components/ui/v2/icons/ClockIcon';
import { InfoIcon } from '@/components/ui/v2/icons/InfoIcon';
import { SearchIcon } from '@/components/ui/v2/icons/SearchIcon';
import { Input } from '@/components/ui/v2/Input';
import { Link } from '@/components/ui/v2/Link';
import { Option } from '@/components/ui/v2/Option';
import { Select } from '@/components/ui/v2/Select';
import { Tooltip } from '@/components/ui/v2/Tooltip';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { LogsDatePicker } from '@/features/projects/logs/components/LogsDatePicker';
import type { LogsCustomInterval } from '@/features/projects/logs/utils/constants/intervals';
import { LOGS_AVAILABLE_INTERVALS } from '@/features/projects/logs/utils/constants/intervals';
import type { AvailableLogsService } from '@/features/projects/logs/utils/constants/services';
import { LOGS_AVAILABLE_SERVICES } from '@/features/projects/logs/utils/constants/services';
import { useGetRunServicesQuery } from '@/utils/__generated__/graphql';
import { LogsRangeSelector } from '@/features/projects/logs/components/LogsRangeSelector';
import { AvailableLogsService } from '@/features/projects/logs/utils/constants/services';
import { MINUTES_TO_DECREASE_FROM_CURRENT_DATE } from '@/utils/constants/common';
import { useGetServiceLabelValuesQuery } from '@/utils/__generated__/graphql';
import { yupResolver } from '@hookform/resolvers/yup';
import { subMinutes } from 'date-fns';
import { useEffect, useState } from 'react';
import { twMerge } from 'tailwind-merge';
import { FormProvider, useForm } from 'react-hook-form';
import * as Yup from 'yup';
export interface LogsHeaderProps extends Omit<BoxProps, 'children'> {
export const validationSchema = Yup.object({
from: Yup.date(),
to: Yup.date().nullable(),
service: Yup.string().oneOf(Object.values(AvailableLogsService)),
regexFilter: Yup.string(),
});
export type LogsFilterFormValues = Yup.InferType<typeof validationSchema>;
interface LogsHeaderProps extends Omit<BoxProps, 'children'> {
/**
* The date to be displayed in the date picker for the from date.
* This is used to indicate that a query is currently inflight
*/
fromDate: Date;
loading: boolean;
/**
* The date to be displayed in the date picker for the to date.
*
* Function to be called when the user submits the filters form
*/
toDate: Date | null;
/**
* Service to where to fetch logs from.
*/
service: AvailableLogsService;
/**
* Function to be called when the user changes the from date.
*/
onFromDateChange: (value: Date) => void;
/**
* Function to be called when the user changes the `to` date.
*/
onToDateChange: (value: Date) => void;
/**
* Function to be called when the user changes service to which to query logs from.
*/
onServiceChange: (value: AvailableLogsService) => void;
}
type LogsToDatePickerLiveButtonProps = Pick<
LogsHeaderProps,
'fromDate' | 'toDate' | 'onToDateChange'
>;
function LogsToDatePickerLiveButton({
fromDate,
toDate,
onToDateChange,
}: LogsToDatePickerLiveButtonProps) {
const [currentTime, setCurrentTime] = useState(new Date());
const isLive = !toDate;
function handleLiveButtonClick() {
if (isLive) {
return;
}
onToDateChange(null);
setCurrentTime(new Date());
}
// if isLive is true, we want to update the current time every second
// and set the toDate to the current time.
useEffect(() => {
let interval = null;
if (!interval && isLive) {
interval = setInterval(() => {
setCurrentTime(new Date());
}, 1000);
}
return () => {
clearInterval(interval);
};
}, [isLive, onToDateChange]);
return (
<div className="text-greyscaleMedium grid grid-flow-col">
<LogsDatePicker
label="To"
value={!isLive ? toDate : currentTime}
disabled={isLive}
onChange={onToDateChange}
minDate={fromDate}
maxDate={toDate || new Date()}
componentsProps={{
button: {
className: twMerge(
'rounded-r-none pr-3',
isLive ? 'border-r-0 hover:border-r-0 z-0' : 'z-10',
),
color: toDate ? 'inherit' : 'secondary',
},
}}
/>
<Button
variant="outlined"
color={isLive ? 'primary' : 'secondary'}
sx={{
backgroundColor: (theme) =>
!isLive ? `${theme.palette.grey[200]} !important` : 'transparent',
color: !isLive ? 'text.secondary' : undefined,
}}
className={twMerge(
'min-w-[77px] rounded-l-none',
!isLive ? 'z-0 border-l-0 hover:border-l-0' : 'z-10',
)}
startIcon={<ClockIcon className="h-4 w-4 self-center align-middle" />}
onClick={handleLiveButtonClick}
>
Live
</Button>
</div>
);
onSubmitFilterValues: (value: LogsFilterFormValues) => void;
}
export default function LogsHeader({
fromDate,
toDate,
service,
onFromDateChange,
onToDateChange,
onServiceChange,
loading,
onSubmitFilterValues,
...props
}: LogsHeaderProps) {
const { currentProject } = useCurrentWorkspaceAndProject();
const applicationCreationDate = new Date(currentProject.createdAt);
const [runServices, setRunServices] = useState<
{
label: string;
value: string;
}[]
const [serviceLabels, setServiceLabels] = useState<
{ label: string; value: string }[]
>([]);
const { data, loading } = useGetRunServicesQuery({
variables: {
appID: currentProject.id,
resolve: false,
limit: 1000,
offset: 0,
},
});
const { data, loading: loadingServiceLabelValues } =
useGetServiceLabelValuesQuery({
variables: { appID: currentProject.id },
});
useEffect(() => {
if (!loading) {
const services = data.app?.runServices ?? [];
if (!loadingServiceLabelValues) {
const labels = data.getServiceLabelValues ?? [];
setServiceLabels(labels.map((l) => ({ label: l, value: l })));
}
}, [loadingServiceLabelValues, data]);
setRunServices(
services
.filter((s) => !!s.config?.name)
.map((s) => ({
label: s.config.name,
value: `run-${s.config.name}`,
})),
useEffect(() => {
if (!loadingServiceLabelValues) {
const labels = data.getServiceLabelValues ?? [];
const labelMappings = {
'hasura-auth': 'Auth',
'hasura-storage': 'Storage',
postgres: 'Postgres',
functions: 'Functions',
hasura: 'Hasura',
grafana: 'Grafana',
'job-backup': 'Backup Jobs',
ai: 'AI',
};
setServiceLabels(
labels.map((l) => ({ label: labelMappings[l] ?? l, value: l })),
);
}
}, [loading, data]);
}, [loadingServiceLabelValues, data]);
/**
* Will subtract the `customInterval` time in minutes from the current date.
*/
function handleIntervalChange({
minutesToDecreaseFromCurrentDate,
}: LogsCustomInterval) {
onFromDateChange(subMinutes(new Date(), minutesToDecreaseFromCurrentDate));
onToDateChange(new Date());
}
const form = useForm<LogsFilterFormValues>({
defaultValues: {
from: subMinutes(new Date(), MINUTES_TO_DECREASE_FROM_CURRENT_DATE),
to: new Date(),
regexFilter: '',
service: AvailableLogsService.ALL,
},
reValidateMode: 'onSubmit',
resolver: yupResolver(validationSchema),
});
const { register, watch, getValues } = form;
const service = watch('service');
useEffect(() => {
onSubmitFilterValues(getValues());
}, [service, getValues, onSubmitFilterValues]);
const handleSubmit = (values: LogsFilterFormValues) =>
onSubmitFilterValues(values);
return (
<Box
className="sticky top-0 z-10 grid w-full grid-flow-row gap-x-6 gap-y-2 border-b py-2.5 px-4 lg:grid-flow-col lg:justify-between"
className="sticky top-0 z-10 grid w-full grid-flow-row gap-x-6 gap-y-2 border-b px-4 py-2.5 lg:grid-flow-col"
{...props}
>
<Box className="grid w-full grid-flow-row items-center justify-center gap-2 md:w-[initial] md:grid-flow-col md:gap-3 lg:justify-start">
<div className="grid grid-flow-col items-center gap-3 md:justify-start">
<LogsDatePicker
label="From"
value={fromDate}
onChange={onFromDateChange}
minDate={applicationCreationDate}
maxDate={toDate || new Date()}
/>
<FormProvider {...form}>
<Form
onSubmit={handleSubmit}
className="grid w-full grid-flow-row items-center gap-2 md:w-[initial] md:grid-flow-col md:gap-3 lg:justify-end"
>
<Box className="flex flex-row space-x-2">
<ControlledSelect
{...register('service')}
className="w-full text-sm font-normal min-w-fit"
placeholder="All Services"
aria-label="Select service"
hideEmptyHelperText
slotProps={{
root: {
className: 'min-h-[initial] h-10 leading-[initial]',
},
}}
>
{[{ label: 'All services', value: '' }, ...serviceLabels].map(
({ value, label }) => (
<Option
key={value}
value={value}
className="text-sm+ font-medium"
>
{label}
</Option>
),
)}
</ControlledSelect>
<div className="w-full min-w-fit">
<LogsRangeSelector onSubmitFilterValues={onSubmitFilterValues} />
</div>
</Box>
<LogsToDatePickerLiveButton
fromDate={fromDate}
toDate={toDate}
onToDateChange={onToDateChange}
/>
</div>
<Box className="-my-2.5 px-0 py-2.5 lg:border-l lg:px-3">
<Select
className="w-full text-sm font-normal"
placeholder="All Services"
onChange={(_e, value) => {
if (typeof value !== 'string') {
return;
}
onServiceChange(value as AvailableLogsService);
}}
value={service}
aria-label="Select service"
<Input
{...register('regexFilter')}
placeholder="Filter logs with a regular expression"
hideEmptyHelperText
slotProps={{
root: { className: 'min-h-[initial] h-9 leading-[initial]' },
}}
>
{[...LOGS_AVAILABLE_SERVICES, ...runServices].map(
({ value, label }) => (
<Option
key={value}
value={value}
className="text-sm+ font-medium"
>
{label}
</Option>
),
)}
</Select>
</Box>
</Box>
autoComplete="off"
fullWidth
className="min-w-80"
startAdornment={
<Tooltip
componentsProps={{
tooltip: {
sx: {
maxWidth: '30rem',
},
},
}}
title={
<div className="p-2 space-y-4">
<h2>Here are some useful regular expressions:</h2>
<ul className="pl-3 space-y-2 list-disc">
<li>
use
<code className="px-1 py-px mx-1 rounded-md bg-slate-500 text-slate-100">
(?i)error
</code>
to search for lines with the word <b>error</b> (case
insenstive)
</li>
<li>
use
<code className="px-1 py-px mx-1 rounded-md bg-slate-500 text-slate-100">
error
</code>
to search for lines with the word <b>error</b> (case
sensitive)
</li>
<li>
use
<code className="px-1 py-px mx-1 rounded-md bg-slate-500 text-slate-100">
/metadata.*error
</code>
to search for errors in hasura&apos;s metadata endpoint
</li>
<li>
See
<Link
href="https://github.com/google/re2/wiki/Syntax"
target="_blank"
rel="noopener noreferrer"
underline="hover"
className="mx-1"
>
here
</Link>
for more patterns
</li>
</ul>
</div>
}
>
<Box className="ml-2 rounded-full cursor-pointer">
<InfoIcon
aria-label="Info"
className="w-5 h-5"
color="info"
/>
</Box>
</Tooltip>
}
/>
<Box className="hidden grid-flow-col items-center justify-center gap-3 md:grid lg:justify-end">
{LOGS_AVAILABLE_INTERVALS.map((logInterval) => (
<Button
key={logInterval.label}
variant="outlined"
color="secondary"
className="self-center"
onClick={() => handleIntervalChange(logInterval)}
type="submit"
className="h-10"
startIcon={
loading ? (
<ActivityIndicator className="w-4 h-4" />
) : (
<SearchIcon />
)
}
disabled={loading}
>
{logInterval.label}
Search
</Button>
))}
</Box>
</Form>
</FormProvider>
</Box>
);
}

View File

@@ -1,2 +1 @@
export * from './LogsHeader';
export { default as LogsHeader } from './LogsHeader';
export { default as LogsHeader, type LogsFilterFormValues } from './LogsHeader';

View File

@@ -0,0 +1,170 @@
import { Box } from '@/components/ui/v2/Box';
import { Button } from '@/components/ui/v2/Button';
import { Dropdown, useDropdown } from '@/components/ui/v2/Dropdown';
import { ClockIcon } from '@/components/ui/v2/icons/ClockIcon';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { LogsDatePicker } from '@/features/projects/logs/components/LogsDatePicker';
import type { LogsFilterFormValues } from '@/features/projects/logs/components/LogsHeader';
import {
LOGS_AVAILABLE_INTERVALS,
type LogsCustomInterval,
} from '@/features/projects/logs/utils/constants/intervals';
import { useInterval } from '@/hooks/useInterval';
import { ChevronDownIcon } from '@graphiql/react';
import { formatDistance, subMinutes } from 'date-fns';
import { useState } from 'react';
import { useFormContext, useWatch } from 'react-hook-form';
import { twMerge } from 'tailwind-merge';
function LogsToDatePickerLiveButton() {
const [currentTime, setCurrentTime] = useState(new Date());
const { setValue } = useFormContext<LogsFilterFormValues>();
const { from, to } = useWatch<LogsFilterFormValues>();
const isLive = !to;
function handleLiveButtonClick() {
if (isLive) {
setValue('from', subMinutes(new Date(), 20));
setValue('to', new Date());
return;
}
setValue('to', null);
setCurrentTime(new Date());
}
useInterval(() => setCurrentTime(new Date()), isLive ? 1000 : 0);
return (
<div className="text-greyscaleMedium flex flex-col">
{!isLive && (
<LogsDatePicker
label="To"
value={!isLive ? to : currentTime}
disabled={isLive}
onChange={(date: Date) => setValue('to', date)}
minDate={from}
maxDate={new Date()}
componentsProps={{
button: {
className: twMerge('rounded-r-none', isLive ? 'z-0' : 'z-10'),
color: to ? 'inherit' : 'secondary',
},
}}
/>
)}
<Button
variant="outlined"
color={isLive ? 'primary' : 'secondary'}
sx={{
backgroundColor: (theme) =>
!isLive ? `${theme.palette.grey[200]} !important` : 'transparent',
color: !isLive ? 'text.secondary' : undefined,
}}
className={twMerge(!isLive ? 'z-0 mt-4' : 'z-10')}
startIcon={<ClockIcon className="h-4 w-4 self-center align-middle" />}
onClick={handleLiveButtonClick}
>
Live
</Button>
</div>
);
}
interface LogsRangeSelectorProps {
onSubmitFilterValues: (value: LogsFilterFormValues) => void;
}
function LogsRangeSelectorIntervalPickers({
onSubmitFilterValues,
}: LogsRangeSelectorProps) {
const { currentProject } = useCurrentWorkspaceAndProject();
const applicationCreationDate = new Date(currentProject.createdAt);
const { setValue, getValues } = useFormContext<LogsFilterFormValues>();
const { from } = useWatch<LogsFilterFormValues>();
const { handleClose } = useDropdown();
const handleApply = () => {
onSubmitFilterValues(getValues());
handleClose();
};
/**
* Will subtract the `customInterval` time in minutes from the current date.
*/
function handleIntervalChange({
minutesToDecreaseFromCurrentDate,
}: LogsCustomInterval) {
setValue('from', subMinutes(new Date(), minutesToDecreaseFromCurrentDate));
setValue('to', new Date());
}
return (
<Box className="flex flex-col space-y-4">
<div className="flex flex-col space-y-4">
<LogsDatePicker
label="From"
value={from}
onChange={(date) => setValue('from', date)}
minDate={applicationCreationDate}
maxDate={new Date()}
/>
<LogsToDatePickerLiveButton />
</div>
<Box className="grid grid-cols-2 gap-2">
{LOGS_AVAILABLE_INTERVALS.map((logInterval) => (
<Button
key={logInterval.label}
variant="outlined"
color="secondary"
className="self-center"
onClick={() => handleIntervalChange(logInterval)}
>
Last {logInterval.label}
</Button>
))}
</Box>
<Button color="primary" variant="contained" onClick={handleApply}>
Apply
</Button>
</Box>
);
}
export default function LogsRangeSelector({
onSubmitFilterValues,
}: LogsRangeSelectorProps) {
const { from, to } = useWatch<LogsFilterFormValues>();
return (
<Dropdown.Root>
<Dropdown.Trigger hideChevron className="flex w-full rounded-full">
<Button
component="a"
className="h-10 w-full min-w-40 items-center justify-between"
variant="outlined"
>
<span>
{to === null
? 'Live'
: `${formatDistance(to.getTime(), from.getTime())}`}
</span>
<ChevronDownIcon className="h-3 w-3" />
</Button>
</Dropdown.Trigger>
<Dropdown.Content PaperProps={{ className: 'mt-1 max-w-xs w-full p-3' }}>
<LogsRangeSelectorIntervalPickers
onSubmitFilterValues={onSubmitFilterValues}
/>
</Dropdown.Content>
</Dropdown.Root>
);
}

View File

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

View File

@@ -89,7 +89,7 @@ function LogsTimePicker({
</Button>
<Button variant="contained" color="primary" onClick={handleApply}>
Apply
Set
</Button>
</Box>
</div>

View File

@@ -26,4 +26,12 @@ export const LOGS_AVAILABLE_INTERVALS: LogsCustomInterval[] = [
label: '60 min',
minutesToDecreaseFromCurrentDate: 60,
},
{
label: '12 hours',
minutesToDecreaseFromCurrentDate: 720,
},
{
label: '24 hours',
minutesToDecreaseFromCurrentDate: 1440,
},
];

View File

@@ -38,6 +38,7 @@ import { yupResolver } from '@hookform/resolvers/yup';
import { useEffect, useState } from 'react';
import { FormProvider, useForm } from 'react-hook-form';
import { parse } from 'shell-quote';
import { HealthCheckFormSection } from './components/HealthCheckFormSection';
import { ServiceConfirmationDialog } from './components/ServiceConfirmationDialog';
import { ServiceDetailsDialog } from './components/ServiceDetailsDialog';
@@ -118,6 +119,13 @@ export default function ServiceForm({
type: item.type,
publish: item.publish,
})),
healthCheck: values.healthCheck
? {
port: values.healthCheck?.port,
initialDelaySeconds: values.healthCheck?.initialDelaySeconds,
probePeriodSeconds: values.healthCheck?.probePeriodSeconds,
}
: null,
};
return config;
@@ -375,6 +383,8 @@ export default function ServiceForm({
<StorageFormSection />
<HealthCheckFormSection />
{createServiceFormError && (
<Alert
severity="error"

View File

@@ -41,6 +41,14 @@ export const validationSchema = Yup.object({
})
.required(),
),
healthCheck: Yup.object()
.shape({
port: Yup.number().required(),
initialDelaySeconds: Yup.number().required(),
probePeriodSeconds: Yup.number().required(),
})
.nullable()
.default(undefined),
});
export type ServiceFormValues = Yup.InferType<typeof validationSchema>;

View File

@@ -0,0 +1,112 @@
import { Box } from '@/components/ui/v2/Box';
import { InfoIcon } from '@/components/ui/v2/icons/InfoIcon';
import { Input } from '@/components/ui/v2/Input';
import { Switch } from '@/components/ui/v2/Switch';
import { Text } from '@/components/ui/v2/Text';
import { Tooltip } from '@/components/ui/v2/Tooltip';
import type { ServiceFormValues } from '@/features/services/components/ServiceForm/ServiceFormTypes';
import { useState } from 'react';
import { useFormContext } from 'react-hook-form';
export default function HealthCheckFormSection() {
const {
watch,
setValue,
register,
formState: { errors },
} = useFormContext<ServiceFormValues>();
const healthCheck = watch('healthCheck');
const [healthCheckEnabled, setHealthCheckEnabled] = useState(!!healthCheck);
const toggleHealthCheckEnabled = async (enabled: boolean) => {
setHealthCheckEnabled(enabled);
if (!enabled) {
setValue('healthCheck', null);
}
};
return (
<Box className="space-y-4 rounded border-1 p-4">
<Box className="flex flex-row items-center justify-between ">
<Box className="flex flex-row items-center space-x-2">
<Text variant="h4" className="font-semibold">
Health Check
</Text>
<Tooltip
title={
<span>
Monitor the health and availability of a service. Refer to{' '}
<a
target="_blank"
rel="noopener noreferrer"
href="https://docs.nhost.io/guides/run/health-checks"
className="underline"
>
Health Check
</a>{' '}
for more information.
</span>
}
>
<InfoIcon aria-label="Info" className="h-4 w-4" color="primary" />
</Tooltip>
</Box>
<Switch
checked={healthCheckEnabled}
onChange={(e) => toggleHealthCheckEnabled(e.target.checked)}
className="self-center"
/>
</Box>
{healthCheckEnabled && (
<Box className="flex flex-col space-y-4">
<Input
{...register(`healthCheck.port`)}
id="healthCheck.port"
label="Port"
placeholder="3000"
className="w-full"
hideEmptyHelperText
error={!!errors?.healthCheck?.port}
helperText={errors?.healthCheck?.port?.message}
fullWidth
autoComplete="off"
type="number"
/>
<Input
{...register(`healthCheck.initialDelaySeconds`)}
id="healthCheck.initialDelaySeconds"
label="Initial delay seconds"
placeholder="30"
className="w-full"
hideEmptyHelperText
error={!!errors?.healthCheck?.initialDelaySeconds}
helperText={errors?.healthCheck?.initialDelaySeconds?.message}
fullWidth
autoComplete="off"
type="number"
/>
<Input
{...register(`healthCheck.probePeriodSeconds`)}
id="healthCheck.probePeriodSeconds"
label="Probe period seconds"
placeholder="60"
className="w-full"
hideEmptyHelperText
error={!!errors?.healthCheck?.probePeriodSeconds}
helperText={errors?.healthCheck?.probePeriodSeconds?.message}
fullWidth
autoComplete="off"
type="number"
/>
</Box>
)}
</Box>
);
}

View File

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

View File

@@ -1,4 +1,4 @@
fragment EnvironmentVariable on ConfigEnvironmentVariable {
fragment EnvironmentVariable on ConfigGlobalEnvironmentVariable {
id: name
name
value

View File

@@ -3,8 +3,15 @@ query getProjectLogs(
$service: String
$from: Timestamp
$to: Timestamp
$regexFilter: String
) {
logs(appID: $appID, service: $service, from: $from, to: $to) {
logs(
appID: $appID
service: $service
from: $from
to: $to
regexFilter: $regexFilter
) {
log
service
timestamp
@@ -15,8 +22,14 @@ subscription getLogsSubscription(
$appID: String!
$service: String
$from: Timestamp
$regexFilter: String
) {
logs(appID: $appID, service: $service, from: $from) {
logs(
appID: $appID
service: $service
from: $from
regexFilter: $regexFilter
) {
log
service
timestamp

View File

@@ -0,0 +1,3 @@
query getServiceLabelValues($appID: String!) {
getServiceLabelValues(appID: $appID)
}

View File

@@ -40,6 +40,11 @@ query getRunServices(
fqdn
}
}
healthCheck {
port
initialDelaySeconds
probePeriodSeconds
}
}
}
runServices_aggregate {

View File

@@ -35,7 +35,24 @@ export default function useRemoteApplicationGQLClientWithSubscriptions() {
);
return new ApolloClient({
cache: new InMemoryCache(),
cache: new InMemoryCache({
typePolicies: {
Subscription: {
fields: {
logs: {
keyArgs: false,
},
},
},
Query: {
fields: {
logs: {
keyArgs: false,
},
},
},
},
}),
connectToDevTools: true,
link: split(
({ query }) => {

View File

@@ -2,49 +2,53 @@ import { ProjectLayout } from '@/components/layout/ProjectLayout';
import { RetryableErrorBoundary } from '@/components/presentational/RetryableErrorBoundary';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { LogsBody } from '@/features/projects/logs/components/LogsBody';
import { LogsHeader } from '@/features/projects/logs/components/LogsHeader';
import {
LogsHeader,
type LogsFilterFormValues,
} from '@/features/projects/logs/components/LogsHeader';
import { AvailableLogsService } from '@/features/projects/logs/utils/constants/services';
import { useRemoteApplicationGQLClientWithSubscriptions } from '@/hooks/useRemoteApplicationGQLClientWithSubscriptions';
import { MINUTES_TO_DECREASE_FROM_CURRENT_DATE } from '@/utils/constants/common';
import {
GetLogsSubscriptionDocument,
useGetProjectLogsQuery,
} from '@/utils/__generated__/graphql';
import { subMinutes } from 'date-fns';
import type { ReactElement } from 'react';
import { useCallback, useEffect, useRef, useState } from 'react';
import {
useCallback,
useEffect,
useRef,
useState,
type ReactElement,
} from 'react';
const MINUTES_TO_DECREASE_FROM_CURRENT_DATE = 20;
interface LogsFilters {
from: Date;
to: Date | null;
service: AvailableLogsService;
regexFilter: string;
}
export default function LogsPage() {
const { currentProject } = useCurrentWorkspaceAndProject();
const [fromDate, setFromDate] = useState<Date>(
subMinutes(new Date(), MINUTES_TO_DECREASE_FROM_CURRENT_DATE),
);
const [toDate, setToDate] = useState<Date | null>(new Date());
const [service, setService] = useState<AvailableLogsService>(
AvailableLogsService.ALL,
);
// create a client that sends http requests to Hasura but websocket requests to Bragi
const clientWithSplit = useRemoteApplicationGQLClientWithSubscriptions();
const subscriptionReturn = useRef(null);
/**
* Will change the specific service from which we query logs.
*/
function handleServiceChange(value: AvailableLogsService) {
setService(value);
}
const [filters, setFilters] = useState<LogsFilters>({
from: subMinutes(new Date(), MINUTES_TO_DECREASE_FROM_CURRENT_DATE),
to: new Date(),
regexFilter: '',
service: AvailableLogsService.ALL,
});
const { data, loading, error, subscribeToMore, client } =
const { data, error, subscribeToMore, client, loading, refetch } =
useGetProjectLogsQuery({
variables: {
appID: currentProject.id,
from: fromDate,
to: toDate,
service,
},
variables: { appID: currentProject.id, ...filters },
client: clientWithSplit,
fetchPolicy: 'cache-and-network',
notifyOnNetworkStatusChange: true,
});
const subscribeToMoreLogs = useCallback(
@@ -53,8 +57,9 @@ export default function LogsPage() {
document: GetLogsSubscriptionDocument,
variables: {
appID: currentProject.id,
service,
from: fromDate,
service: filters.service,
from: filters.from,
regexFilter: filters.regexFilter,
},
updateQuery: (prev, { subscriptionData }) => {
// if there is no new data, just return the previous data
@@ -93,40 +98,47 @@ export default function LogsPage() {
};
},
}),
[subscribeToMore, currentProject.id, service, fromDate],
[subscribeToMore, currentProject.id, filters],
);
useEffect(() => {
if (toDate && subscriptionReturn.current !== null) {
if (filters.to && subscriptionReturn.current !== null) {
subscriptionReturn.current();
subscriptionReturn.current = null;
return () => {};
}
if (toDate) {
if (filters.to) {
return () => {};
}
if (subscriptionReturn.current) {
subscriptionReturn.current();
subscriptionReturn.current = null;
}
// This will open the websocket connection and it will return a function to close it.
subscriptionReturn.current = subscribeToMoreLogs();
// get rid of the current apollo client instance (will also close the websocket if it's the live status)
return () => client.stop();
}, [subscribeToMoreLogs, toDate, client]);
return () => {};
}, [filters, subscribeToMoreLogs, client]);
const onSubmitFilterValues = useCallback(
async (values: LogsFilterFormValues) => {
setFilters({ ...(values as LogsFilters) });
await refetch();
},
[setFilters, refetch],
);
return (
<div className="flex h-full w-full flex-col">
<RetryableErrorBoundary>
<LogsHeader
fromDate={fromDate}
toDate={toDate}
service={service}
onServiceChange={handleServiceChange}
onFromDateChange={setFromDate}
onToDateChange={setToDate}
loading={loading}
onSubmitFilterValues={onSubmitFilterValues}
/>
<LogsBody error={error} loading={loading} logsData={data} />
</RetryableErrorBoundary>
</div>

View File

@@ -2,8 +2,10 @@ import { Container } from '@/components/layout/Container';
import { RetryableErrorBoundary } from '@/components/presentational/RetryableErrorBoundary';
import { AccountSettingsLayout } from '@/features/account/settings/components/AccountSettingsLayout';
import { DeleteAccount } from '@/features/account/settings/components/DeleteAccount';
import { DisplayNameSetting } from '@/features/account/settings/components/DisplayNameSetting';
import { PasswordSettings } from '@/features/account/settings/components/PasswordSettings';
import { PATSettings } from '@/features/account/settings/components/PATSettings';
import { SocialProvidersSettings } from '@/features/account/settings/components/SocialProvidersSettings';
import type { ReactElement } from 'react';
export default function AccountSettingsPage() {
@@ -12,10 +14,18 @@ export default function AccountSettingsPage() {
className="grid max-w-5xl grid-flow-row gap-8 bg-transparent"
rootClassName="bg-transparent"
>
<RetryableErrorBoundary>
<DisplayNameSetting />
</RetryableErrorBoundary>
<RetryableErrorBoundary>
<PasswordSettings />
</RetryableErrorBoundary>
<RetryableErrorBoundary>
<SocialProvidersSettings />
</RetryableErrorBoundary>
<RetryableErrorBoundary>
<PATSettings />
</RetryableErrorBoundary>

View File

@@ -0,0 +1,94 @@
import { NavLink } from '@/components/common/NavLink';
import { UnauthenticatedLayout } from '@/components/layout/UnauthenticatedLayout';
import { Box } from '@/components/ui/v2/Box';
import { Button } from '@/components/ui/v2/Button';
import { Text } from '@/components/ui/v2/Text';
import { getToastStyleProps } from '@/utils/constants/settings';
import { useNhostClient } from '@nhost/nextjs';
import { useRouter } from 'next/router';
import { useEffect, useState, type ReactElement } from 'react';
import { toast } from 'react-hot-toast';
export default function VerifyEmailPage() {
const router = useRouter();
const nhost = useNhostClient();
const {
query: { email },
} = router;
const [resendVerificationEmailLoading, setResendVerificationEmailLoading] =
useState(false);
useEffect(() => {
if (!email) {
router.push('/signin');
}
}, [email, router]);
const resendVerificationEmail = async () => {
setResendVerificationEmailLoading(true);
try {
await nhost.auth.sendVerificationEmail({ email: email as string });
toast.success(
`An new email has been sent to ${email}. Please follow the link to verify your email address and to
complete your registration.`,
getToastStyleProps(),
);
} catch {
toast.error(
'An error occurred while sending the verification email. Please try again.',
getToastStyleProps(),
);
} finally {
setResendVerificationEmailLoading(false);
}
};
return (
<>
<Text
variant="h2"
component="h1"
className="text-center text-3.5xl font-semibold lg:text-4.5xl"
>
Verify your email
</Text>
<Box className="grid grid-flow-row gap-4 rounded-md border bg-transparent p-6 lg:p-12">
<div className="relative py-2">
<Text color="secondary" className="text-center text-sm">
Please check your inbox for the verification email. Follow the link
to verify your email address and complete your registration.
</Text>
</div>
<Button
className="!bg-white !text-black disabled:!text-black disabled:!text-opacity-60"
size="large"
disabled={resendVerificationEmailLoading}
loading={resendVerificationEmailLoading}
type="button"
onClick={resendVerificationEmail}
>
Resend verification email
</Button>
<div className="flex justify-center">
<NavLink href="/signin" color="white" className="font-medium">
Sign In
</NavLink>
</div>
</Box>
</>
);
}
VerifyEmailPage.getLayout = function getLayout(page: ReactElement) {
return (
<UnauthenticatedLayout title="Verify your email">
{page}
</UnauthenticatedLayout>
);
};

View File

@@ -9,8 +9,8 @@ import { getToastStyleProps } from '@/utils/constants/settings';
import { yupResolver } from '@hookform/resolvers/yup';
import { styled } from '@mui/material';
import { useSignInEmailPassword } from '@nhost/nextjs';
import type { ReactElement } from 'react';
import { useEffect } from 'react';
import { useRouter } from 'next/router';
import { useEffect, type ReactElement } from 'react';
import { FormProvider, useForm } from 'react-hook-form';
import { toast } from 'react-hot-toast';
import * as Yup from 'yup';
@@ -31,6 +31,7 @@ const StyledInput = styled(Input)({
export default function EmailSignUpPage() {
const { signInEmailPassword, error } = useSignInEmailPassword();
const router = useRouter();
const form = useForm<EmailSignUpFormValues>({
reValidateMode: 'onSubmit',
@@ -56,7 +57,14 @@ export default function EmailSignUpPage() {
async function handleSubmit({ email, password }: EmailSignUpFormValues) {
try {
await signInEmailPassword(email, password);
const { needsEmailVerification } = await signInEmailPassword(
email,
password,
);
if (needsEmailVerification) {
router.push(`/email/verify?email=${email}`);
}
} catch {
toast.error(
'An error occurred while signing in. Please try again.',

View File

@@ -12,6 +12,7 @@ import { nhost } from '@/utils/nhost';
import { yupResolver } from '@hookform/resolvers/yup';
import { styled } from '@mui/material';
import { useSignUpEmailPassword } from '@nhost/nextjs';
import { useRouter } from 'next/router';
import type { ReactElement } from 'react';
import { useEffect, useState } from 'react';
import { FormProvider, useForm } from 'react-hook-form';
@@ -36,6 +37,7 @@ const StyledInput = styled(Input)({
export default function SignUpPage() {
const { signUpEmailPassword, error } = useSignUpEmailPassword();
const [loading, setLoading] = useState(false);
const router = useRouter();
const form = useForm<SignUpFormValues>({
reValidateMode: 'onSubmit',
@@ -65,7 +67,15 @@ export default function SignUpPage() {
displayName,
}: SignUpFormValues) {
try {
await signUpEmailPassword(email, password, { displayName });
const { needsEmailVerification } = await signUpEmailPassword(
email,
password,
{ displayName },
);
if (needsEmailVerification) {
router.push(`/email/verify?email=${email}`);
}
} catch {
toast.error(
'An error occurred while signing up. Please try again.',

View File

@@ -196,6 +196,7 @@ export type ConfigAppSystemConfig = {
*/
export type ConfigAuth = {
__typename?: 'ConfigAuth';
elevatedPrivileges?: Maybe<ConfigAuthElevatedPrivileges>;
method?: Maybe<ConfigAuthMethod>;
redirections?: Maybe<ConfigAuthRedirections>;
/** Resources for the service */
@@ -219,6 +220,7 @@ export type ConfigAuthComparisonExp = {
_and?: InputMaybe<Array<ConfigAuthComparisonExp>>;
_not?: InputMaybe<ConfigAuthComparisonExp>;
_or?: InputMaybe<Array<ConfigAuthComparisonExp>>;
elevatedPrivileges?: InputMaybe<ConfigAuthElevatedPrivilegesComparisonExp>;
method?: InputMaybe<ConfigAuthMethodComparisonExp>;
redirections?: InputMaybe<ConfigAuthRedirectionsComparisonExp>;
resources?: InputMaybe<ConfigResourcesComparisonExp>;
@@ -229,7 +231,28 @@ export type ConfigAuthComparisonExp = {
version?: InputMaybe<ConfigStringComparisonExp>;
};
export type ConfigAuthElevatedPrivileges = {
__typename?: 'ConfigAuthElevatedPrivileges';
mode?: Maybe<Scalars['String']>;
};
export type ConfigAuthElevatedPrivilegesComparisonExp = {
_and?: InputMaybe<Array<ConfigAuthElevatedPrivilegesComparisonExp>>;
_not?: InputMaybe<ConfigAuthElevatedPrivilegesComparisonExp>;
_or?: InputMaybe<Array<ConfigAuthElevatedPrivilegesComparisonExp>>;
mode?: InputMaybe<ConfigStringComparisonExp>;
};
export type ConfigAuthElevatedPrivilegesInsertInput = {
mode?: InputMaybe<Scalars['String']>;
};
export type ConfigAuthElevatedPrivilegesUpdateInput = {
mode?: InputMaybe<Scalars['String']>;
};
export type ConfigAuthInsertInput = {
elevatedPrivileges?: InputMaybe<ConfigAuthElevatedPrivilegesInsertInput>;
method?: InputMaybe<ConfigAuthMethodInsertInput>;
redirections?: InputMaybe<ConfigAuthRedirectionsInsertInput>;
resources?: InputMaybe<ConfigResourcesInsertInput>;
@@ -808,6 +831,7 @@ export type ConfigAuthTotpUpdateInput = {
};
export type ConfigAuthUpdateInput = {
elevatedPrivileges?: InputMaybe<ConfigAuthElevatedPrivilegesUpdateInput>;
method?: InputMaybe<ConfigAuthMethodUpdateInput>;
redirections?: InputMaybe<ConfigAuthRedirectionsUpdateInput>;
resources?: InputMaybe<ConfigResourcesUpdateInput>;
@@ -1248,22 +1272,47 @@ export type ConfigFunctionsUpdateInput = {
export type ConfigGlobal = {
__typename?: 'ConfigGlobal';
/** User-defined environment variables that are spread over all services */
environment?: Maybe<Array<ConfigEnvironmentVariable>>;
environment?: Maybe<Array<ConfigGlobalEnvironmentVariable>>;
};
export type ConfigGlobalComparisonExp = {
_and?: InputMaybe<Array<ConfigGlobalComparisonExp>>;
_not?: InputMaybe<ConfigGlobalComparisonExp>;
_or?: InputMaybe<Array<ConfigGlobalComparisonExp>>;
environment?: InputMaybe<ConfigEnvironmentVariableComparisonExp>;
environment?: InputMaybe<ConfigGlobalEnvironmentVariableComparisonExp>;
};
export type ConfigGlobalEnvironmentVariable = {
__typename?: 'ConfigGlobalEnvironmentVariable';
name: Scalars['String'];
/** Value of the environment variable */
value: Scalars['String'];
};
export type ConfigGlobalEnvironmentVariableComparisonExp = {
_and?: InputMaybe<Array<ConfigGlobalEnvironmentVariableComparisonExp>>;
_not?: InputMaybe<ConfigGlobalEnvironmentVariableComparisonExp>;
_or?: InputMaybe<Array<ConfigGlobalEnvironmentVariableComparisonExp>>;
name?: InputMaybe<ConfigStringComparisonExp>;
value?: InputMaybe<ConfigStringComparisonExp>;
};
export type ConfigGlobalEnvironmentVariableInsertInput = {
name: Scalars['String'];
value: Scalars['String'];
};
export type ConfigGlobalEnvironmentVariableUpdateInput = {
name?: InputMaybe<Scalars['String']>;
value?: InputMaybe<Scalars['String']>;
};
export type ConfigGlobalInsertInput = {
environment?: InputMaybe<Array<ConfigEnvironmentVariableInsertInput>>;
environment?: InputMaybe<Array<ConfigGlobalEnvironmentVariableInsertInput>>;
};
export type ConfigGlobalUpdateInput = {
environment?: InputMaybe<Array<ConfigEnvironmentVariableUpdateInput>>;
environment?: InputMaybe<Array<ConfigGlobalEnvironmentVariableUpdateInput>>;
};
export type ConfigGrafana = {
@@ -1404,6 +1453,8 @@ export type ConfigHasuraSettings = {
enabledAPIs?: Maybe<Array<Scalars['ConfigHasuraAPIs']>>;
/** HASURA_GRAPHQL_LIVE_QUERIES_MULTIPLEXED_REFETCH_INTERVAL */
liveQueriesMultiplexedRefetchInterval?: Maybe<Scalars['ConfigUint32']>;
/** HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES */
stringifyNumericTypes?: Maybe<Scalars['Boolean']>;
};
export type ConfigHasuraSettingsComparisonExp = {
@@ -1417,6 +1468,7 @@ export type ConfigHasuraSettingsComparisonExp = {
enableRemoteSchemaPermissions?: InputMaybe<ConfigBooleanComparisonExp>;
enabledAPIs?: InputMaybe<ConfigHasuraApIsComparisonExp>;
liveQueriesMultiplexedRefetchInterval?: InputMaybe<ConfigUint32ComparisonExp>;
stringifyNumericTypes?: InputMaybe<ConfigBooleanComparisonExp>;
};
export type ConfigHasuraSettingsInsertInput = {
@@ -1427,6 +1479,7 @@ export type ConfigHasuraSettingsInsertInput = {
enableRemoteSchemaPermissions?: InputMaybe<Scalars['Boolean']>;
enabledAPIs?: InputMaybe<Array<Scalars['ConfigHasuraAPIs']>>;
liveQueriesMultiplexedRefetchInterval?: InputMaybe<Scalars['ConfigUint32']>;
stringifyNumericTypes?: InputMaybe<Scalars['Boolean']>;
};
export type ConfigHasuraSettingsUpdateInput = {
@@ -1437,6 +1490,7 @@ export type ConfigHasuraSettingsUpdateInput = {
enableRemoteSchemaPermissions?: InputMaybe<Scalars['Boolean']>;
enabledAPIs?: InputMaybe<Array<Scalars['ConfigHasuraAPIs']>>;
liveQueriesMultiplexedRefetchInterval?: InputMaybe<Scalars['ConfigUint32']>;
stringifyNumericTypes?: InputMaybe<Scalars['Boolean']>;
};
export type ConfigHasuraUpdateInput = {
@@ -2486,6 +2540,14 @@ export type Metrics = {
value: Scalars['float64'];
};
export type StatsDailyLiveFreeApps = {
__typename?: 'StatsDailyLiveFreeApps';
avg: Scalars['Int'];
max: Scalars['Int'];
min: Scalars['Int'];
raw: Array<Scalars['Int']>;
};
export type StatsLiveApps = {
__typename?: 'StatsLiveApps';
appID: Array<Scalars['uuid']>;
@@ -5238,9 +5300,9 @@ export type AuthUserProviders_Bool_Exp = {
export enum AuthUserProviders_Constraint {
/** unique or primary key constraint on columns "id" */
UserProvidersPkey = 'user_providers_pkey',
/** unique or primary key constraint on columns "provider_id", "provider_user_id" */
/** unique or primary key constraint on columns "provider_user_id", "provider_id" */
UserProvidersProviderIdProviderUserIdKey = 'user_providers_provider_id_provider_user_id_key',
/** unique or primary key constraint on columns "provider_id", "user_id" */
/** unique or primary key constraint on columns "user_id", "provider_id" */
UserProvidersUserIdProviderIdKey = 'user_providers_user_id_provider_id_key'
}
@@ -15774,6 +15836,7 @@ export type Query_Root = {
runServiceConfig?: Maybe<ConfigRunServiceConfig>;
runServiceConfigRawJSON: Scalars['String'];
runServiceConfigs: Array<ConfigRunServiceConfigWithId>;
runServiceConfigsAll: Array<ConfigRunServiceConfigWithId>;
/** An array relationship */
runServices: Array<Run_Service>;
/** fetch aggregated fields from the table: "run_service" */
@@ -15796,6 +15859,12 @@ export type Query_Root = {
softwareVersions: Array<Software_Versions>;
/** fetch aggregated fields from the table: "software_versions" */
softwareVersionsAggregate: Software_Versions_Aggregate;
/**
* Returns the per-day number of free live apps in the given time range, as well as the min, max and avg.
*
* Requests that returned a 4xx or 5xx status code are not counted as live traffic.
*/
statsDailyLiveFreeApps: StatsDailyLiveFreeApps;
/**
* Returns lists of apps that have some live traffic in the give time range.
* From defaults to 24 hours ago and to defaults to now.
@@ -16755,6 +16824,12 @@ export type Query_RootRunServiceConfigRawJsonArgs = {
export type Query_RootRunServiceConfigsArgs = {
appID: Scalars['uuid'];
resolve: Scalars['Boolean'];
};
export type Query_RootRunServiceConfigsAllArgs = {
resolve: Scalars['Boolean'];
where?: InputMaybe<ConfigRunServiceConfigComparisonExp>;
};
@@ -16847,6 +16922,12 @@ export type Query_RootSoftwareVersionsAggregateArgs = {
};
export type Query_RootStatsDailyLiveFreeAppsArgs = {
from?: InputMaybe<Scalars['Timestamp']>;
to?: InputMaybe<Scalars['Timestamp']>;
};
export type Query_RootStatsLiveAppsArgs = {
from?: InputMaybe<Scalars['Timestamp']>;
to?: InputMaybe<Scalars['Timestamp']>;
@@ -21355,7 +21436,7 @@ export type WorkspaceMemberInvites_Bool_Exp = {
/** unique or primary key constraints on table "workspace_member_invites" */
export enum WorkspaceMemberInvites_Constraint {
/** unique or primary key constraint on columns "email", "workspace_id" */
/** unique or primary key constraint on columns "workspace_id", "email" */
WorkspaceMemberInvitesEmailWorkspaceIdKey = 'workspace_member_invites_email_workspace_id_key',
/** unique or primary key constraint on columns "id" */
WorkspaceMemberInvitesPkey = 'workspace_member_invites_pkey'
@@ -22408,6 +22489,11 @@ export type DeleteUserAccountMutationVariables = Exact<{
export type DeleteUserAccountMutation = { __typename?: 'mutation_root', deleteUser?: { __typename: 'users' } | null };
export type GetAuthUserProvidersQueryVariables = Exact<{ [key: string]: never; }>;
export type GetAuthUserProvidersQuery = { __typename?: 'query_root', authUserProviders: Array<{ __typename?: 'authUserProviders', id: any, providerId: string }> };
export type GetPersonalAccessTokensQueryVariables = Exact<{ [key: string]: never; }>;
@@ -22420,12 +22506,20 @@ export type DeletePersonalAccessTokenMutationVariables = Exact<{
export type DeletePersonalAccessTokenMutation = { __typename?: 'mutation_root', deletePersonalAccessToken?: { __typename?: 'authRefreshTokens', id: any, metadata?: any | null } | null };
export type UpdateUserDisplayNameMutationVariables = Exact<{
id: Scalars['uuid'];
displayName: Scalars['String'];
}>;
export type UpdateUserDisplayNameMutation = { __typename?: 'mutation_root', updateUser?: { __typename?: 'users', id: any, displayName: string } | null };
export type GetAiSettingsQueryVariables = Exact<{
appId: Scalars['uuid'];
}>;
export type GetAiSettingsQuery = { __typename?: 'query_root', config?: { __typename?: 'ConfigConfig', ai?: { __typename?: 'ConfigAI', version?: string | null, webhookSecret: string, autoEmbeddings?: { __typename?: 'ConfigAIAutoEmbeddings', synchPeriodMinutes?: any | null } | null, openai: { __typename?: 'ConfigAIOpenai', apiKey: string, organization?: string | null }, resources: { __typename?: 'ConfigAIResources', compute: { __typename?: 'ConfigComputeResources', cpu: any, memory: any } } } | null } | null };
export type GetAiSettingsQuery = { __typename?: 'query_root', config?: { __typename?: 'ConfigConfig', postgres?: { __typename?: 'ConfigPostgres', version?: string | null } | null, ai?: { __typename?: 'ConfigAI', version?: string | null, webhookSecret: string, autoEmbeddings?: { __typename?: 'ConfigAIAutoEmbeddings', synchPeriodMinutes?: any | null } | null, openai: { __typename?: 'ConfigAIOpenai', apiKey: string, organization?: string | null }, resources: { __typename?: 'ConfigAIResources', compute: { __typename?: 'ConfigComputeResources', cpu: any, memory: any } } } | null } | null };
export type GetAuthenticationSettingsQueryVariables = Exact<{
appId: Scalars['uuid'];
@@ -22598,7 +22692,7 @@ export type DnsLookupCnameQueryVariables = Exact<{
export type DnsLookupCnameQuery = { __typename?: 'query_root', dnsLookupCNAME: string };
export type EnvironmentVariableFragment = { __typename?: 'ConfigEnvironmentVariable', name: string, value: string, id: string };
export type EnvironmentVariableFragment = { __typename?: 'ConfigGlobalEnvironmentVariable', name: string, value: string, id: string };
export type JwtSecretFragment = { __typename?: 'ConfigJWTSecret', issuer?: string | null, key?: string | null, type?: string | null, jwk_url?: any | null, header?: string | null, claims_namespace_path?: string | null, claims_namespace?: string | null, claims_format?: string | null, audience?: string | null, allowed_skew?: any | null };
@@ -22607,7 +22701,7 @@ export type GetEnvironmentVariablesQueryVariables = Exact<{
}>;
export type GetEnvironmentVariablesQuery = { __typename?: 'query_root', config?: { __typename: 'ConfigConfig', id: 'ConfigConfig', global?: { __typename?: 'ConfigGlobal', environment?: Array<{ __typename?: 'ConfigEnvironmentVariable', name: string, value: string, id: string }> | null } | null, hasura: { __typename?: 'ConfigHasura', adminSecret: string, webhookSecret: string, jwtSecrets?: Array<{ __typename?: 'ConfigJWTSecret', issuer?: string | null, key?: string | null, type?: string | null, jwk_url?: any | null, header?: string | null, claims_namespace_path?: string | null, claims_namespace?: string | null, claims_format?: string | null, audience?: string | null, allowed_skew?: any | null }> | null } } | null };
export type GetEnvironmentVariablesQuery = { __typename?: 'query_root', config?: { __typename: 'ConfigConfig', id: 'ConfigConfig', global?: { __typename?: 'ConfigGlobal', environment?: Array<{ __typename?: 'ConfigGlobalEnvironmentVariable', name: string, value: string, id: string }> | null } | null, hasura: { __typename?: 'ConfigHasura', adminSecret: string, webhookSecret: string, jwtSecrets?: Array<{ __typename?: 'ConfigJWTSecret', issuer?: string | null, key?: string | null, type?: string | null, jwk_url?: any | null, header?: string | null, claims_namespace_path?: string | null, claims_namespace?: string | null, claims_format?: string | null, audience?: string | null, allowed_skew?: any | null }> | null } } | null };
export type PermissionVariableFragment = { __typename?: 'ConfigAuthsessionaccessTokenCustomClaims', key: string, value: string, id: string };
@@ -22772,6 +22866,7 @@ export type GetProjectLogsQueryVariables = Exact<{
service?: InputMaybe<Scalars['String']>;
from?: InputMaybe<Scalars['Timestamp']>;
to?: InputMaybe<Scalars['Timestamp']>;
regexFilter?: InputMaybe<Scalars['String']>;
}>;
@@ -22781,11 +22876,19 @@ export type GetLogsSubscriptionSubscriptionVariables = Exact<{
appID: Scalars['String'];
service?: InputMaybe<Scalars['String']>;
from?: InputMaybe<Scalars['Timestamp']>;
regexFilter?: InputMaybe<Scalars['String']>;
}>;
export type GetLogsSubscriptionSubscription = { __typename?: 'subscription_root', logs: Array<{ __typename?: 'Log', log: string, service: string, timestamp: any }> };
export type GetServiceLabelValuesQueryVariables = Exact<{
appID: Scalars['String'];
}>;
export type GetServiceLabelValuesQuery = { __typename?: 'query_root', getServiceLabelValues: Array<string> };
export type DeletePaymentMethodMutationVariables = Exact<{
paymentMethodId: Scalars['uuid'];
}>;
@@ -22960,7 +23063,7 @@ export type GetRunServicesQueryVariables = Exact<{
}>;
export type GetRunServicesQuery = { __typename?: 'query_root', app?: { __typename?: 'apps', runServices: Array<{ __typename?: 'run_service', id: any, createdAt: any, updatedAt: any, subdomain: string, config?: { __typename?: 'ConfigRunServiceConfig', name: any, command?: Array<string> | null, image: { __typename?: 'ConfigRunServiceImage', image: string }, resources: { __typename?: 'ConfigRunServiceResources', replicas: any, compute: { __typename?: 'ConfigComputeResources', cpu: any, memory: any }, storage?: Array<{ __typename?: 'ConfigRunServiceResourcesStorage', name: any, path: string, capacity: any }> | null }, environment?: Array<{ __typename?: 'ConfigEnvironmentVariable', name: string, value: string }> | null, ports?: Array<{ __typename?: 'ConfigRunServicePort', port: any, type: string, publish?: boolean | null, ingresses?: Array<{ __typename?: 'ConfigIngress', fqdn?: Array<string> | null }> | null }> | null } | null }>, runServices_aggregate: { __typename?: 'run_service_aggregate', aggregate?: { __typename?: 'run_service_aggregate_fields', count: number } | null } } | null };
export type GetRunServicesQuery = { __typename?: 'query_root', app?: { __typename?: 'apps', runServices: Array<{ __typename?: 'run_service', id: any, createdAt: any, updatedAt: any, subdomain: string, config?: { __typename?: 'ConfigRunServiceConfig', name: any, command?: Array<string> | null, image: { __typename?: 'ConfigRunServiceImage', image: string }, resources: { __typename?: 'ConfigRunServiceResources', replicas: any, compute: { __typename?: 'ConfigComputeResources', cpu: any, memory: any }, storage?: Array<{ __typename?: 'ConfigRunServiceResourcesStorage', name: any, path: string, capacity: any }> | null }, environment?: Array<{ __typename?: 'ConfigEnvironmentVariable', name: string, value: string }> | null, ports?: Array<{ __typename?: 'ConfigRunServicePort', port: any, type: string, publish?: boolean | null, ingresses?: Array<{ __typename?: 'ConfigIngress', fqdn?: Array<string> | null }> | null }> | null, healthCheck?: { __typename?: 'ConfigHealthCheck', port: any, initialDelaySeconds?: number | null, probePeriodSeconds?: number | null } | null } | null }>, runServices_aggregate: { __typename?: 'run_service_aggregate', aggregate?: { __typename?: 'run_service_aggregate_fields', count: number } | null } } | null };
export type InsertRunServiceMutationVariables = Exact<{
object: Run_Service_Insert_Input;
@@ -23187,7 +23290,7 @@ export const PrefetchNewAppWorkspaceFragmentDoc = gql`
}
`;
export const EnvironmentVariableFragmentDoc = gql`
fragment EnvironmentVariable on ConfigEnvironmentVariable {
fragment EnvironmentVariable on ConfigGlobalEnvironmentVariable {
id: name
name
value
@@ -23444,6 +23547,44 @@ export function useDeleteUserAccountMutation(baseOptions?: Apollo.MutationHookOp
export type DeleteUserAccountMutationHookResult = ReturnType<typeof useDeleteUserAccountMutation>;
export type DeleteUserAccountMutationResult = Apollo.MutationResult<DeleteUserAccountMutation>;
export type DeleteUserAccountMutationOptions = Apollo.BaseMutationOptions<DeleteUserAccountMutation, DeleteUserAccountMutationVariables>;
export const GetAuthUserProvidersDocument = gql`
query getAuthUserProviders {
authUserProviders {
id
providerId
}
}
`;
/**
* __useGetAuthUserProvidersQuery__
*
* To run a query within a React component, call `useGetAuthUserProvidersQuery` and pass it any options that fit your needs.
* When your component renders, `useGetAuthUserProvidersQuery` 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 } = useGetAuthUserProvidersQuery({
* variables: {
* },
* });
*/
export function useGetAuthUserProvidersQuery(baseOptions?: Apollo.QueryHookOptions<GetAuthUserProvidersQuery, GetAuthUserProvidersQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetAuthUserProvidersQuery, GetAuthUserProvidersQueryVariables>(GetAuthUserProvidersDocument, options);
}
export function useGetAuthUserProvidersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetAuthUserProvidersQuery, GetAuthUserProvidersQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetAuthUserProvidersQuery, GetAuthUserProvidersQueryVariables>(GetAuthUserProvidersDocument, options);
}
export type GetAuthUserProvidersQueryHookResult = ReturnType<typeof useGetAuthUserProvidersQuery>;
export type GetAuthUserProvidersLazyQueryHookResult = ReturnType<typeof useGetAuthUserProvidersLazyQuery>;
export type GetAuthUserProvidersQueryResult = Apollo.QueryResult<GetAuthUserProvidersQuery, GetAuthUserProvidersQueryVariables>;
export function refetchGetAuthUserProvidersQuery(variables?: GetAuthUserProvidersQueryVariables) {
return { query: GetAuthUserProvidersDocument, variables: variables }
}
export const GetPersonalAccessTokensDocument = gql`
query GetPersonalAccessTokens {
personalAccessTokens: authRefreshTokens(
@@ -23521,9 +23662,47 @@ export function useDeletePersonalAccessTokenMutation(baseOptions?: Apollo.Mutati
export type DeletePersonalAccessTokenMutationHookResult = ReturnType<typeof useDeletePersonalAccessTokenMutation>;
export type DeletePersonalAccessTokenMutationResult = Apollo.MutationResult<DeletePersonalAccessTokenMutation>;
export type DeletePersonalAccessTokenMutationOptions = Apollo.BaseMutationOptions<DeletePersonalAccessTokenMutation, DeletePersonalAccessTokenMutationVariables>;
export const UpdateUserDisplayNameDocument = gql`
mutation updateUserDisplayName($id: uuid!, $displayName: String!) {
updateUser(pk_columns: {id: $id}, _set: {displayName: $displayName}) {
id
displayName
}
}
`;
export type UpdateUserDisplayNameMutationFn = Apollo.MutationFunction<UpdateUserDisplayNameMutation, UpdateUserDisplayNameMutationVariables>;
/**
* __useUpdateUserDisplayNameMutation__
*
* To run a mutation, you first call `useUpdateUserDisplayNameMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useUpdateUserDisplayNameMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [updateUserDisplayNameMutation, { data, loading, error }] = useUpdateUserDisplayNameMutation({
* variables: {
* id: // value for 'id'
* displayName: // value for 'displayName'
* },
* });
*/
export function useUpdateUserDisplayNameMutation(baseOptions?: Apollo.MutationHookOptions<UpdateUserDisplayNameMutation, UpdateUserDisplayNameMutationVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useMutation<UpdateUserDisplayNameMutation, UpdateUserDisplayNameMutationVariables>(UpdateUserDisplayNameDocument, options);
}
export type UpdateUserDisplayNameMutationHookResult = ReturnType<typeof useUpdateUserDisplayNameMutation>;
export type UpdateUserDisplayNameMutationResult = Apollo.MutationResult<UpdateUserDisplayNameMutation>;
export type UpdateUserDisplayNameMutationOptions = Apollo.BaseMutationOptions<UpdateUserDisplayNameMutation, UpdateUserDisplayNameMutationVariables>;
export const GetAiSettingsDocument = gql`
query GetAISettings($appId: uuid!) {
config(appID: $appId, resolve: false) {
postgres {
version
}
ai {
version
webhookSecret
@@ -25558,8 +25737,14 @@ export function refetchGetGithubRepositoriesQuery(variables?: GetGithubRepositor
return { query: GetGithubRepositoriesDocument, variables: variables }
}
export const GetProjectLogsDocument = gql`
query getProjectLogs($appID: String!, $service: String, $from: Timestamp, $to: Timestamp) {
logs(appID: $appID, service: $service, from: $from, to: $to) {
query getProjectLogs($appID: String!, $service: String, $from: Timestamp, $to: Timestamp, $regexFilter: String) {
logs(
appID: $appID
service: $service
from: $from
to: $to
regexFilter: $regexFilter
) {
log
service
timestamp
@@ -25583,6 +25768,7 @@ export const GetProjectLogsDocument = gql`
* service: // value for 'service'
* from: // value for 'from'
* to: // value for 'to'
* regexFilter: // value for 'regexFilter'
* },
* });
*/
@@ -25601,8 +25787,8 @@ export function refetchGetProjectLogsQuery(variables: GetProjectLogsQueryVariabl
return { query: GetProjectLogsDocument, variables: variables }
}
export const GetLogsSubscriptionDocument = gql`
subscription getLogsSubscription($appID: String!, $service: String, $from: Timestamp) {
logs(appID: $appID, service: $service, from: $from) {
subscription getLogsSubscription($appID: String!, $service: String, $from: Timestamp, $regexFilter: String) {
logs(appID: $appID, service: $service, from: $from, regexFilter: $regexFilter) {
log
service
timestamp
@@ -25625,6 +25811,7 @@ export const GetLogsSubscriptionDocument = gql`
* appID: // value for 'appID'
* service: // value for 'service'
* from: // value for 'from'
* regexFilter: // value for 'regexFilter'
* },
* });
*/
@@ -25634,6 +25821,42 @@ export function useGetLogsSubscriptionSubscription(baseOptions: Apollo.Subscript
}
export type GetLogsSubscriptionSubscriptionHookResult = ReturnType<typeof useGetLogsSubscriptionSubscription>;
export type GetLogsSubscriptionSubscriptionResult = Apollo.SubscriptionResult<GetLogsSubscriptionSubscription>;
export const GetServiceLabelValuesDocument = gql`
query getServiceLabelValues($appID: String!) {
getServiceLabelValues(appID: $appID)
}
`;
/**
* __useGetServiceLabelValuesQuery__
*
* To run a query within a React component, call `useGetServiceLabelValuesQuery` and pass it any options that fit your needs.
* When your component renders, `useGetServiceLabelValuesQuery` 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 } = useGetServiceLabelValuesQuery({
* variables: {
* appID: // value for 'appID'
* },
* });
*/
export function useGetServiceLabelValuesQuery(baseOptions: Apollo.QueryHookOptions<GetServiceLabelValuesQuery, GetServiceLabelValuesQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useQuery<GetServiceLabelValuesQuery, GetServiceLabelValuesQueryVariables>(GetServiceLabelValuesDocument, options);
}
export function useGetServiceLabelValuesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetServiceLabelValuesQuery, GetServiceLabelValuesQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return Apollo.useLazyQuery<GetServiceLabelValuesQuery, GetServiceLabelValuesQueryVariables>(GetServiceLabelValuesDocument, options);
}
export type GetServiceLabelValuesQueryHookResult = ReturnType<typeof useGetServiceLabelValuesQuery>;
export type GetServiceLabelValuesLazyQueryHookResult = ReturnType<typeof useGetServiceLabelValuesLazyQuery>;
export type GetServiceLabelValuesQueryResult = Apollo.QueryResult<GetServiceLabelValuesQuery, GetServiceLabelValuesQueryVariables>;
export function refetchGetServiceLabelValuesQuery(variables: GetServiceLabelValuesQueryVariables) {
return { query: GetServiceLabelValuesDocument, variables: variables }
}
export const DeletePaymentMethodDocument = gql`
mutation deletePaymentMethod($paymentMethodId: uuid!) {
deletePaymentMethod(id: $paymentMethodId) {
@@ -26577,6 +26800,11 @@ export const GetRunServicesDocument = gql`
fqdn
}
}
healthCheck {
port
initialDelaySeconds
probePeriodSeconds
}
}
}
runServices_aggregate {

View File

@@ -66,3 +66,8 @@ export const RESOURCE_VCPU_PRICE_PER_MINUTE = 0.0012;
* Maximum number of free projects a user is allowed to have.
*/
export const MAX_FREE_PROJECTS = 1;
/**
* Default value in minutes to use for querying the logs
*/
export const MINUTES_TO_DECREASE_FROM_CURRENT_DATE = 20;

View File

@@ -3,18 +3,14 @@ import {
getFunctionsServiceUrl,
getGraphqlServiceUrl,
getStorageServiceUrl,
isPlatform,
} from '@/utils/env';
import { NhostClient } from '@nhost/nextjs';
// eslint-disable-next-line no-nested-ternary
const nhost = isPlatform()
? new NhostClient({
authUrl: getAuthServiceUrl(),
graphqlUrl: getGraphqlServiceUrl(),
functionsUrl: getFunctionsServiceUrl(),
storageUrl: getStorageServiceUrl(),
})
: new NhostClient({ subdomain: 'local' });
const nhost = new NhostClient({
authUrl: getAuthServiceUrl(),
graphqlUrl: getGraphqlServiceUrl(),
functionsUrl: getFunctionsServiceUrl(),
storageUrl: getStorageServiceUrl(),
});
export default nhost;

View File

@@ -21,6 +21,9 @@ module.exports = {
copper: '#DD792D',
paper: '#171d26',
divider: '#2f363d',
'primary-main': '#0052cd',
'primary-light': '#ebf3ff',
'primary-dark': '#063799',
},
boxShadow: {
outline: 'inset 0 0 0 2px rgba(0, 82, 205, 0.6)',

View File

@@ -1,5 +1,44 @@
# @nhost/docs
## 2.9.0
### Minor Changes
- 3c31657: chore: update docs with provider connect
### Patch Changes
- 992939c: feat: added social connect docs
## 2.8.0
### Minor Changes
- 768ca17: chore: update dependencies
### Patch Changes
- 9f2bf9e: chore: added hasura's authHook settings
## 2.7.2
### Patch Changes
- 5c47e8e: feat: added hasura's stringifyNumericTypes setting
## 2.7.1
### Patch Changes
- 6cb2b63: feat: added nhost run env documentation
- 40bd3e4: fix: fixed wrong links in documentation
## 2.7.0
### Minor Changes
- 49a80c2: chore: update dependencies
## 2.6.0
### Minor Changes

View File

@@ -44,8 +44,22 @@ Below, you will find the official `CUE` schema and an example on how to configur
// HASURA_GRAPHQL_LIVE_QUERIES_MULTIPLEXED_REFETCH_INTERVAL
liveQueriesMultiplexedRefetchInterval: uint32 | *1000
// HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES
stringifyNumericTypes: bool | *false
}
authHook?: {
// HASURA_GRAPHQL_AUTH_HOOK
url: string
// HASURA_GRAPHQL_AUTH_HOOK_MODE
mode: "GET"|*"POST"
// HASURA_GRAPHQL_AUTH_HOOK_SEND_REQUEST_BODY
sendRequestBody: bool | *true
}
logs: {
// HASURA_GRAPHQL_LOG_LEVEL
level: "debug" | "info" | "error" | *"warn"
@@ -83,6 +97,7 @@ enableConsole = true
enableRemoteSchemaPermissions = true
enabledAPIs = ['metadata']
liveQueriesMultiplexedRefetchInterval = 1000
stringifyNumericTypes = false
[hasura.logs]
level = 'warn'

View File

@@ -86,4 +86,4 @@ await nhost.auth.sendVerificationEmail(
</Tab>
</Tabs>
<Tip>It is possible to customize these automatic emails, learn how to [here](/authentication/templates)</Tip>
<Tip>It is possible to customize these automatic emails, learn how to [here](/guides/auth/email-templates)</Tip>

View File

@@ -34,5 +34,5 @@ await nhost.auth.signIn(
<Tip>Users who have signed up with email and password can also sign in with a Magic Link</Tip>
<Tip>It is possible to customize the email with the Magic Link, learn how to [here](/authentication/templates)</Tip>
<Tip>It is possible to customize the email with the Magic Link, learn how to [here](/guides/auth/email-templates)</Tip>

View File

@@ -0,0 +1,43 @@
---
title: Social Provider Connect
sidebarTitle: Social Provider Connect
description: Add social sign in mechanism to existing users
icon: link
---
With the social provider connect feature, users can link their social authentication method to their account, regardless of the initial sign-up method. It enables users to link different social authentication providers to their accounts, even if the email addresses do not match (e.g., linking a GitHub profile to an account registered with a different email). This feature offers flexibility, allowing users to streamline their login process by connecting multiple authentication methods.
To add a social authentication method to an existing user you need to call the url `https://${subdomain}.auth.${region}.nhost.run/v1/signin/provider/${provider}?connect=${jwt}`. This is very easy to achieve with our SDK:
``` js
nhost.auth.connectProvider({
provider: 'github'
})
```
In addition, hooks for react, vue and other frameworks may be provided. Check our [reference](/reference/overview#client-libraries) documentation for more details.
<Note>
Keep in mind that as we need a `JWT` the user needs to be logged in.
</Note>
## Viewing and Deleting Social Provider Authentication Mechanisms
If you want to allow your users to view and/or delete social provider authentication mechanisms, you can provide the necessary permissions to the table `auth.user_providers` (i.e. `select` and/or `delete`) and then use the appropriate GraphQL query. For example, the following permissions should allow users to list their own social providers:
![social connect permissions](/images/guides/auth/social-connect-permissions.png)
Using the following GraphQL query:
``` js
const { error, data } = await nhost.graphql.request(
gql`
query getAuthUserProviders {
authUserProviders {
id
providerId
}
}
`,
)
```

View File

@@ -19,7 +19,7 @@ You're allowed to:
## Roles
Each user has one **default role** and a list of **allowed roles**. These roles are used to resolve permissions for requests to [GraphQL](/graphql/permissions) and [Storage](/storage#permissions).
Each user has one **default role** and a list of **allowed roles**. These roles are used to resolve permissions for requests to [GraphQL](/guides/api/permissions) and [Storage](/guides/storage/overview#permissions).
When the user makes a request, only one role is used to resolve permissions. The default role is used if no role is explicitly specified. Users can only make requests using the default role or one of the allowed roles.

View File

@@ -24,3 +24,65 @@ Based on the information above, if you want to connect directly to your service
<Note>You can also use the environment variable `NHOST_RUN_SERVICE` passing comma-separated values. For instance, the equivalent environment variable for this example would be `NHOST_RUN_SERVICE=../mysvc/nhost-run-service.toml:mysvc,../mysvc/nhost-run-service.toml`</Note>
<Warning>The Nhost CLI doesn't build services so make sure you build any image that might be needed for running `nhost run --run-service...`</Warning>
# Quick Development
While developing your service, you may want to run it locally outside of the Nhost CLI to quickly iterate on it. To simplify this the Nhost CLI includes a command to generate an `.env` file based on your environment variables configuration and secrets. For instance, imagine a service with the following configuration:
<Tabs>
<Tab title="run-service.toml">
```toml
[[environment]]
name = 'HASURA_GRAPHQL_URL'
value = 'http://hasura-service:8080/v1/graphql'
[[environment]]
name = 'SOME_CONFIGURATION_PARAMETER'
value = 'some-value'
[[environment]]
name = 'SECRET_KEY'
value = '{{ secrets.SECRET_KEY }}'
```
</Tab>
<Tab title="overlay">
```json
[
{
"value": {
"name": "ENVIRONMENT",
"value": "dev"
},
"op": "add",
"path": "/environment/-"
},
{
"value": "https://local.graphql.nhost.run/v1/graphql",
"op": "replace",
"path": "/environment/0/value"
}
]
```
</Tab>
<Tab title=".secrets">
```toml
SECRET_KEY = '#asdasd;l;kq23\\n40-0as9d"$\\'
```
</Tab>
</Tabs>
We can then generate an `env` file for our service with the folllowing command:
```
$ nhost run env --config ../mysvc/nhost-run-service.toml --overlay-name local-dev > .env
$ cat .env
HASURA_GRAPHQL_URL="https://local.graphql.nhost.run/v1/graphql"
SOME_CONFIGURATION_PARAMETER="some-value"
SECRET_KEY="#asdasd;l;kq23\\n40-0as9d\"\$\\"
ENVIRONMENT="dev"
```
<Warning>
Keep in mind you may need to use different configuration when attempting to connect to other services in the stack. For instance, in the example above we are using `http://hasura-service:8080/v1/graphql` to connect to hasura in production and in the CLI but when running the service in the host machine using the env file we are using an overlay to change the value to `https://local.graphql.nhost.run/v1/graphql`. Refer to the [network](networking) configuration for more details.
</Warning>

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

View File

@@ -128,6 +128,7 @@
"guides/auth/social/sign-in-workos"
]
},
"guides/auth/social-connect",
"guides/auth/sign-in-email-password",
"guides/auth/sign-in-magic-link",
"guides/auth/sign-in-phone-number",
@@ -197,7 +198,7 @@
"reference/auth/verfiy-fido2-webauthn-authentication-and-complete-signup",
"reference/auth/sign-in-using-email-via-fido2-webauthn-authentication",
"reference/auth/verfiy-fido2-webauthn-authentication-using-public-key-cryptography",
"reference/auth/elevate-webauthn",
"reference/auth/elevate-webauthn",
"reference/auth/elevate-webauthn-verify"
]
},
@@ -319,7 +320,8 @@
"reference/javascript/auth/sign-out",
"reference/javascript/auth/sign-up",
"reference/javascript/auth/add-security-key",
"reference/javascript/auth/elevate-email-security-key"
"reference/javascript/auth/elevate-email-security-key",
"reference/javascript/auth/connect-provider"
]
},
{

View File

@@ -1,11 +1,11 @@
{
"name": "@nhost/docs",
"version": "2.6.0",
"version": "2.9.0",
"private": true,
"scripts": {
"start": "mintlify dev"
},
"devDependencies": {
"mintlify": "^4.0.121"
"mintlify": "^4.0.136"
}
}

View File

@@ -1,16 +0,0 @@
---
title: activateMfaPromise()
sidebarTitle: activateMfaPromise()
---
## Parameters
---
**<span className="parameter-name">service</span>** <span className="optional-status">required</span> <code>Interpreter&lt;EnableMfaContext, any, &#123; type: "GENERATE" &#125; &#124; &#123; type: "ACTIVATE", code: string, activeMfaType: "totp" &#125; &#124; &#123; type: "GENERATED" &#125; &#124; &#123; type: "GENERATED_ERROR", error: null &#124; AuthErrorPayload &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, &#123; value: any, context: EnableMfaContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "GENERATE" &#125; &#124; &#123; type: "ACTIVATE", code: string, activeMfaType: "totp" &#125; &#124; &#123; type: "GENERATED" &#125; &#124; &#123; type: "GENERATED_ERROR", error: null &#124; AuthErrorPayload &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, BaseActionObject, ServiceMap&gt;&gt;</code>
---
**<span className="parameter-name">code</span>** <span className="optional-status">required</span> <code>string</code>
---

View File

@@ -1,16 +0,0 @@
---
title: addSecurityKeyPromise()
sidebarTitle: addSecurityKeyPromise()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> <code>AuthClient</code>
---
**<span className="parameter-name">nickname</span>** <span className="optional-status">optional</span> <code>string</code>
---

View File

@@ -1,24 +0,0 @@
---
title: changeEmailPromise()
sidebarTitle: changeEmailPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;ChangeEmailContext, any, &#123; type: "REQUEST", email: string, options: ChangeEmailOptions &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, &#123; value: any, context: ChangeEmailContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "REQUEST", email: string, options: ChangeEmailOptions &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, BaseActionObject, ChangeEmailServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`ChangeEmailOptions`](/reference/javascript/auth/types/change-email-options)
| Property | Type | Required | Notes |
| :--------------------------------------------------------------------------------------------- | :------------------ | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
---

View File

@@ -1,20 +0,0 @@
---
title: changePasswordPromise()
sidebarTitle: changePasswordPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;ChangePasswordContext, any, &#123; type: "REQUEST", password: string, ticket: string &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, &#123; value: any, context: ChangePasswordContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "REQUEST", password: string, ticket: string &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, BaseActionObject, ChangePasswordServices&gt;&gt;</code>
---
**<span className="parameter-name">password</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">ticket</span>** <span className="optional-status">optional</span> <code>string</code>
---

View File

@@ -1,23 +0,0 @@
---
title: createAuthMachine()
sidebarTitle: createAuthMachine()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> [`AuthMachineOptions`](/reference/javascript/auth/types/auth-machine-options)
| Property | Type | Required | Notes |
| :------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- | :------: | :---------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>clientUrl</span> | <code>string</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>backendUrl</span> | <code>string</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>devTools</span> | <code>boolean</code> | | Activate devTools e.g. the ability to connect to the xstate inspector |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>autoSignIn</span> | <code>boolean</code> | | When set to true, will parse the url on startup to check if it contains a refresh token to start the session with |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>autoRefreshToken</span> | <code>boolean</code> | | When set to true, will automatically refresh token before it expires |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>clientStorage</span> | [`ClientStorage`](/reference/javascript/auth/types/client-storage) | | Object where the refresh token will be persisted and read locally. |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>clientStorageType</span> | [`ClientStorageType`](/reference/javascript/auth/types/client-storage-type) | | Define a way to get information about the refresh token and its exipration date. |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>refreshIntervalTime</span> | <code>number</code> | | Time interval until token refreshes, in seconds |
---

View File

@@ -1,12 +0,0 @@
---
title: createChangeEmailMachine()
sidebarTitle: createChangeEmailMachine()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> <code>AuthClient</code>
---

View File

@@ -1,12 +0,0 @@
---
title: createChangePasswordMachine()
sidebarTitle: createChangePasswordMachine()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> <code>AuthClient</code>
---

View File

@@ -1,12 +0,0 @@
---
title: createEnableMfaMachine()
sidebarTitle: createEnableMfaMachine()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> <code>AuthClient</code>
---

View File

@@ -1,12 +0,0 @@
---
title: createResetPasswordMachine()
sidebarTitle: createResetPasswordMachine()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> <code>AuthClient</code>
---

View File

@@ -1,12 +0,0 @@
---
title: createSendVerificationEmailMachine()
sidebarTitle: createSendVerificationEmailMachine()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> <code>AuthClient</code>
---

View File

@@ -1,16 +0,0 @@
---
title: encodeQueryParameters()
sidebarTitle: encodeQueryParameters()
---
## Parameters
---
**<span className="parameter-name">baseUrl</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">parameters</span>** <span className="optional-status">optional</span> <code>Record&lt;string, unknown&gt;</code>
---

View File

@@ -1,12 +0,0 @@
---
title: generateQrCodePromise()
sidebarTitle: generateQrCodePromise()
---
## Parameters
---
**<span className="parameter-name">service</span>** <span className="optional-status">required</span> <code>Interpreter&lt;EnableMfaContext, any, &#123; type: "GENERATE" &#125; &#124; &#123; type: "ACTIVATE", code: string, activeMfaType: "totp" &#125; &#124; &#123; type: "GENERATED" &#125; &#124; &#123; type: "GENERATED_ERROR", error: null &#124; AuthErrorPayload &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, &#123; value: any, context: EnableMfaContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "GENERATE" &#125; &#124; &#123; type: "ACTIVATE", code: string, activeMfaType: "totp" &#125; &#124; &#123; type: "GENERATED" &#125; &#124; &#123; type: "GENERATED_ERROR", error: null &#124; AuthErrorPayload &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, BaseActionObject, ServiceMap&gt;&gt;</code>
---

View File

@@ -1,21 +0,0 @@
---
title: getAuthenticationResult()
sidebarTitle: getAuthenticationResult()
---
## Parameters
---
**<span className="parameter-name">\_\_namedParameters</span>** <span className="optional-status">required</span> [`SessionActionHandlerResult`](/reference/javascript/auth/types/session-action-handler-result)
| Property | Type | Required | Notes |
| :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- | :------: | :------------------------------------------ |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>refreshToken</span> | <code>null &#124; string</code> | ✔️ | Access token (JWT) |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>accessToken</span> | <code>null &#124; string</code> | ✔️ | Access token (JWT) |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>user</span> | <code>null &#124; [`User`](/reference/javascript/auth/types/user)</code> | ✔️ | User information |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>isSuccess</span> | <code>boolean</code> | ✔️ | Returns `true` if the action is successful. |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>error</span> | <code>null &#124; [`AuthErrorPayload`](/reference/javascript/auth/types/auth-error-payload)</code> | ✔️ | Provides details about the error |
| <span className="parameter-name"><span className="light-grey">\_\_namedParameters.</span>isError</span> | <code>boolean</code> | ✔️ | |
---

View File

@@ -1,16 +0,0 @@
---
title: getFetch()
sidebarTitle: getFetch()
---
## Parameters
---
**<span className="parameter-name">url</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">token</span>** <span className="optional-status">optional</span> <code>null &#124; string</code>
---

View File

@@ -1,16 +0,0 @@
---
title: getParameterByName()
sidebarTitle: getParameterByName()
---
## Parameters
---
**<span className="parameter-name">name</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">url</span>** <span className="optional-status">optional</span> <code>string</code>
---

View File

@@ -1,22 +0,0 @@
---
title: getSession()
sidebarTitle: getSession()
---
## Parameters
---
**<span className="parameter-name">context</span>** <span className="optional-status">optional</span> [`AuthContext`](/reference/javascript/auth/types/auth-context)
| Property | Type | Required | Notes |
| :------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------- | :------: | :------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">context.</span>errors</span> | <code>Partial&lt;Record&lt;StateErrorTypes, AuthErrorPayload&gt;&gt;</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">context.</span>importTokenAttempts</span> | <code>number</code> | ✔️ | Number of times the user tried to get an access token from a refresh token but got a network error |
| <span className="parameter-name"><span className="light-grey">context.</span>refreshToken</span> | <code>&#123; value: string &#124; null, isPAT: boolean &#125;</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">context.</span>refreshTimer</span> | <code>&#123; startedAt: Date &#124; null, attempts: number, lastAttempt: Date &#124; null &#125;</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">context.</span>accessToken</span> | <code>&#123; value: string &#124; null, expiresAt: Date &#124; null, expiresInSeconds: number &#124; null &#125;</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">context.</span>mfa</span> | <code>&#123; ticket: string &#125; &#124; null</code> | ✔️ | |
| <span className="parameter-name"><span className="light-grey">context.</span>user</span> | <code>[`User`](/reference/javascript/auth/types/user) &#124; null</code> | ✔️ | |
---

View File

@@ -1,4 +0,0 @@
---
title: isBrowser()
sidebarTitle: isBrowser()
---

View File

@@ -1,12 +0,0 @@
---
title: isValidEmail()
sidebarTitle: isValidEmail()
---
## Parameters
---
**<span className="parameter-name">email</span>** <span className="optional-status">optional</span> <code>null &#124; string</code>
---

View File

@@ -1,12 +0,0 @@
---
title: isValidPassword()
sidebarTitle: isValidPassword()
---
## Parameters
---
**<span className="parameter-name">password</span>** <span className="optional-status">optional</span> <code>null &#124; string</code>
---

View File

@@ -1,12 +0,0 @@
---
title: isValidPhoneNumber()
sidebarTitle: isValidPhoneNumber()
---
## Parameters
---
**<span className="parameter-name">phoneNumber</span>** <span className="optional-status">optional</span> <code>null &#124; string</code>
---

View File

@@ -1,12 +0,0 @@
---
title: isValidTicket()
sidebarTitle: isValidTicket()
---
## Parameters
---
**<span className="parameter-name">ticket</span>** <span className="optional-status">optional</span> <code>null &#124; string</code>
---

View File

@@ -1,30 +0,0 @@
---
title: localStorageGetter()
sidebarTitle: localStorageGetter()
---
## Parameters
---
**<span className="parameter-name">clientStorageType</span>** <span className="optional-status">required</span> [`ClientStorageType`](/reference/javascript/auth/types/client-storage-type)
---
**<span className="parameter-name">clientStorage</span>** <span className="optional-status">optional</span> [`ClientStorage`](/reference/javascript/auth/types/client-storage)
| Property | Type | Required | Notes |
| :-------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :------: | :---- |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>customSet</span> | <code>(key: string, value: null &#124; string) =&gt; void &#124; Promise&lt;void&gt;</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>customGet</span> | <code>(key: string) =&gt; null &#124; string &#124; Promise&lt;null &#124; string&gt;</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>deleteItemAsync</span> | <code>(key: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>getItemAsync</span> | <code>(key: string) =&gt; any</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>setItemAsync</span> | <code>(key: string, value: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>remove</span> | <code>(options: &#123; key: string &#125;) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>get</span> | <code>(options: &#123; key: string &#125;) =&gt; any</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>set</span> | <code>(options: &#123; key: string, value: string &#125;) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>removeItem</span> | <code>(key: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>getItem</span> | <code>(key: string) =&gt; any</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>setItem</span> | <code>(\_key: string, \_value: string) =&gt; void</code> | | |
---

View File

@@ -1,30 +0,0 @@
---
title: localStorageSetter()
sidebarTitle: localStorageSetter()
---
## Parameters
---
**<span className="parameter-name">clientStorageType</span>** <span className="optional-status">required</span> [`ClientStorageType`](/reference/javascript/auth/types/client-storage-type)
---
**<span className="parameter-name">clientStorage</span>** <span className="optional-status">optional</span> [`ClientStorage`](/reference/javascript/auth/types/client-storage)
| Property | Type | Required | Notes |
| :-------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :------: | :---- |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>setItem</span> | <code>(\_key: string, \_value: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>getItem</span> | <code>(key: string) =&gt; any</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>removeItem</span> | <code>(key: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>set</span> | <code>(options: &#123; key: string, value: string &#125;) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>get</span> | <code>(options: &#123; key: string &#125;) =&gt; any</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>remove</span> | <code>(options: &#123; key: string &#125;) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>setItemAsync</span> | <code>(key: string, value: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>getItemAsync</span> | <code>(key: string) =&gt; any</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>deleteItemAsync</span> | <code>(key: string) =&gt; void</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>customGet</span> | <code>(key: string) =&gt; null &#124; string &#124; Promise&lt;null &#124; string&gt;</code> | | |
| <span className="parameter-name"><span className="light-grey">clientStorage.</span>customSet</span> | <code>(key: string, value: null &#124; string) =&gt; void &#124; Promise&lt;void&gt;</code> | | |
---

View File

@@ -1,20 +0,0 @@
---
title: postFetch()
sidebarTitle: postFetch()
---
## Parameters
---
**<span className="parameter-name">url</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">body</span>** <span className="optional-status">required</span> <code>any</code>
---
**<span className="parameter-name">token</span>** <span className="optional-status">optional</span> <code>null &#124; string</code>
---

View File

@@ -1,12 +0,0 @@
---
title: removeParameterFromWindow()
sidebarTitle: removeParameterFromWindow()
---
## Parameters
---
**<span className="parameter-name">name</span>** <span className="optional-status">required</span> <code>string</code>
---

View File

@@ -1,24 +0,0 @@
---
title: resetPasswordPromise()
sidebarTitle: resetPasswordPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;ResetPasswordContext, any, &#123; type: "REQUEST", email: string, options: ResetPasswordOptions &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, &#123; value: any, context: ResetPasswordContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "REQUEST", email: string, options: ResetPasswordOptions &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, BaseActionObject, ResetPasswordServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`ResetPasswordOptions`](/reference/javascript/auth/types/reset-password-options)
| Property | Type | Required | Notes |
| :--------------------------------------------------------------------------------------------- | :------------------ | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
---

View File

@@ -1,25 +0,0 @@
---
title: rewriteRedirectTo()
sidebarTitle: rewriteRedirectTo()
---
Transform options that include a redirectTo property so the
redirect url is absolute, given a base clientUrl.
If no client url is given, any relative redirectUrl is removed while
the other options are sent as-is.
**`@returns`**
## Parameters
---
**<span className="parameter-name">clientUrl</span>** <span className="optional-status">optional</span> <code>string</code>
base client url
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> <code>T</code>
---

View File

@@ -1,24 +0,0 @@
---
title: sendVerificationEmailPromise()
sidebarTitle: sendVerificationEmailPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;SendVerificationEmailContext, any, &#123; type: "REQUEST", email: string, options: SendVerificationEmailOptions &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, &#123; value: any, context: SendVerificationEmailContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "REQUEST", email: string, options: SendVerificationEmailOptions &#125; &#124; &#123; type: "SUCCESS" &#125; &#124; &#123; type: "ERROR", error: null &#124; AuthErrorPayload &#125;, BaseActionObject, SendVerificationEmailServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`SendVerificationEmailOptions`](/reference/javascript/auth/types/send-verification-email-options)
| Property | Type | Required | Notes |
| :--------------------------------------------------------------------------------------------- | :------------------ | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
---

View File

@@ -1,12 +0,0 @@
---
title: signInAnonymousPromise()
sidebarTitle: signInAnonymousPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---

View File

@@ -1,20 +0,0 @@
---
title: signInEmailPasswordPromise()
sidebarTitle: signInEmailPasswordPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">password</span>** <span className="optional-status">required</span> <code>string</code>
---

View File

@@ -1,29 +0,0 @@
---
title: signInEmailPasswordlessPromise()
sidebarTitle: signInEmailPasswordlessPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`PasswordlessOptions`](/reference/javascript/auth/types/passwordless-options)
| Property | Type | Required | Notes |
| :----------------------------------------------------------------------------------------------- | :----------------------------------------- | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
| <span className="parameter-name"><span className="light-grey">options.</span>metadata</span> | <code>Record&lt;string, unknown&gt;</code> | | Custom additional user information stored in the `metadata` column. Can be any JSON object. |
| <span className="parameter-name"><span className="light-grey">options.</span>displayName</span> | <code>string</code> | | Display name of the user. If not provided, it will use the display name given by the social provider (Oauth) used on registration, or the email address otherwise. |
| <span className="parameter-name"><span className="light-grey">options.</span>defaultRole</span> | <code>string</code> | | Default role of the user. Must be part of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>allowedRoles</span> | <code>Array&lt;string&gt;</code> | | Allowed roles of the user. Must be a subset of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>locale</span> | <code>string</code> | | Locale of the user, in two digits |
---

View File

@@ -1,16 +0,0 @@
---
title: signInEmailSecurityKeyPromise()
sidebarTitle: signInEmailSecurityKeyPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---

View File

@@ -1,20 +0,0 @@
---
title: signInMfaTotpPromise()
sidebarTitle: signInMfaTotpPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">otp</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">ticket</span>** <span className="optional-status">optional</span> <code>string</code>
---

View File

@@ -1,16 +0,0 @@
---
title: signInPATPromise()
sidebarTitle: signInPATPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">pat</span>** <span className="optional-status">required</span> <code>string</code>
---

View File

@@ -1,20 +0,0 @@
---
title: signInSmsPasswordlessOtpPromise()
sidebarTitle: signInSmsPasswordlessOtpPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">phoneNumber</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">otp</span>** <span className="optional-status">required</span> <code>string</code>
---

View File

@@ -1,29 +0,0 @@
---
title: signInSmsPasswordlessPromise()
sidebarTitle: signInSmsPasswordlessPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">phoneNumber</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`PasswordlessOptions`](/reference/javascript/auth/types/passwordless-options)
| Property | Type | Required | Notes |
| :----------------------------------------------------------------------------------------------- | :----------------------------------------- | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>locale</span> | <code>string</code> | | Locale of the user, in two digits |
| <span className="parameter-name"><span className="light-grey">options.</span>allowedRoles</span> | <code>Array&lt;string&gt;</code> | | Allowed roles of the user. Must be a subset of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>defaultRole</span> | <code>string</code> | | Default role of the user. Must be part of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>displayName</span> | <code>string</code> | | Display name of the user. If not provided, it will use the display name given by the social provider (Oauth) used on registration, or the email address otherwise. |
| <span className="parameter-name"><span className="light-grey">options.</span>metadata</span> | <code>Record&lt;string, unknown&gt;</code> | | Custom additional user information stored in the `metadata` column. Can be any JSON object. |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
---

View File

@@ -1,16 +0,0 @@
---
title: signOutPromise()
sidebarTitle: signOutPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">all</span>** <span className="optional-status">optional</span> <code>boolean</code>
---

View File

@@ -1,33 +0,0 @@
---
title: signUpEmailPasswordPromise()
sidebarTitle: signUpEmailPasswordPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">password</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`SignUpOptions`](/reference/javascript/auth/types/sign-up-options)
| Property | Type | Required | Notes |
| :----------------------------------------------------------------------------------------------- | :----------------------------------------- | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
| <span className="parameter-name"><span className="light-grey">options.</span>metadata</span> | <code>Record&lt;string, unknown&gt;</code> | | Custom additional user information stored in the `metadata` column. Can be any JSON object. |
| <span className="parameter-name"><span className="light-grey">options.</span>displayName</span> | <code>string</code> | | Display name of the user. If not provided, it will use the display name given by the social provider (Oauth) used on registration, or the email address otherwise. |
| <span className="parameter-name"><span className="light-grey">options.</span>defaultRole</span> | <code>string</code> | | Default role of the user. Must be part of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>allowedRoles</span> | <code>Array&lt;string&gt;</code> | | Allowed roles of the user. Must be a subset of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>locale</span> | <code>string</code> | | Locale of the user, in two digits |
---

View File

@@ -1,30 +0,0 @@
---
title: signUpEmailSecurityKeyPromise()
sidebarTitle: signUpEmailSecurityKeyPromise()
---
## Parameters
---
**<span className="parameter-name">interpreter</span>** <span className="optional-status">required</span> <code>Interpreter&lt;AuthContext, any, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, &#123; value: any, context: AuthContext &#125;, ResolveTypegenMeta&lt;Typegen0, &#123; type: "SESSION_UPDATE", data: &#123; session: NhostSession &#125; &#125; &#124; &#123; type: "TRY_TOKEN", token: string &#125; &#124; &#123; type: "SIGNIN_ANONYMOUS" &#125; &#124; &#123; type: "SIGNIN_PAT", pat: string &#125; &#124; &#123; type: "SIGNIN_SECURITY_KEY_EMAIL", email: string &#125; &#124; &#123; type: "SIGNIN_PASSWORD", email: string, password: string &#125; &#124; &#123; type: "PASSWORDLESS_EMAIL", email: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS", phoneNumber: string, options: PasswordlessOptions &#125; &#124; &#123; type: "PASSWORDLESS_SMS_OTP", phoneNumber: string, otp: string &#125; &#124; &#123; type: "SIGNUP_EMAIL_PASSWORD", email: string, password: string, options: SignUpOptions &#125; &#124; &#123; type: "SIGNUP_SECURITY_KEY", email: string, options: SignUpSecurityKeyOptions &#125; &#124; &#123; type: "SIGNOUT", all: boolean &#125; &#124; &#123; type: "SIGNIN_MFA_TOTP", ticket: string, otp: string &#125; &#124; &#123; type: "SIGNED_IN" &#125; &#124; &#123; type: "SIGNED_OUT" &#125; &#124; &#123; type: "TOKEN_CHANGED" &#125; &#124; &#123; type: "AWAIT_EMAIL_VERIFICATION" &#125;, BaseActionObject, AuthServices&gt;&gt;</code>
---
**<span className="parameter-name">email</span>** <span className="optional-status">required</span> <code>string</code>
---
**<span className="parameter-name">options</span>** <span className="optional-status">optional</span> [`SignUpSecurityKeyOptions`](/reference/javascript/auth/types/sign-up-security-key-options)
| Property | Type | Required | Notes |
| :----------------------------------------------------------------------------------------------- | :----------------------------------------- | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span className="parameter-name"><span className="light-grey">options.</span>nickname</span> | <code>string</code> | | Optional nickname for the security key |
| <span className="parameter-name"><span className="light-grey">options.</span>redirectTo</span> | <code>string</code> | | Redirection path in the client application that will be used in the link in the verification email. For instance, if you want to redirect to `https://myapp.com/success`, the `redirectTo` value is `'/success'`. |
| <span className="parameter-name"><span className="light-grey">options.</span>metadata</span> | <code>Record&lt;string, unknown&gt;</code> | | Custom additional user information stored in the `metadata` column. Can be any JSON object. |
| <span className="parameter-name"><span className="light-grey">options.</span>displayName</span> | <code>string</code> | | Display name of the user. If not provided, it will use the display name given by the social provider (Oauth) used on registration, or the email address otherwise. |
| <span className="parameter-name"><span className="light-grey">options.</span>defaultRole</span> | <code>string</code> | | Default role of the user. Must be part of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>allowedRoles</span> | <code>Array&lt;string&gt;</code> | | Allowed roles of the user. Must be a subset of the default allowed roles defined in Hasura Auth. |
| <span className="parameter-name"><span className="light-grey">options.</span>locale</span> | <code>string</code> | | Locale of the user, in two digits |
---

View File

@@ -1,6 +1,5 @@
---
title: AuthCookieClient
sidebarTitle: AuthCookieClient
description: No description provided.
---

Some files were not shown because too many files have changed in this diff Show More