Compare commits

..

113 Commits

Author SHA1 Message Date
Hassan Ben Jobrane
b0363a4f4c Merge pull request #2110 from nhost/changeset-release/main
chore: update versions
2023-07-07 17:18:43 +01:00
github-actions[bot]
17045b2018 chore: update versions 2023-07-07 16:07:03 +00:00
Hassan Ben Jobrane
c49cc11862 Merge pull request #2108 from nhost/feat/fix-hasura-storage-file-upload
fix(hasura-storage-js): fix file upload
2023-07-07 17:05:33 +01:00
Hassan Ben Jobrane
c83fe7d776 chore(e2e): change e2e tests timeout 2023-07-07 16:48:49 +01:00
Hassan Ben Jobrane
235b4c7405 chore: wrap secret values in quotes 2023-07-07 16:08:24 +01:00
Hassan Ben Jobrane
c2c0fbd33a chore(e2e): increase timeout 2023-07-07 15:19:02 +01:00
Hassan Ben Jobrane
300e3f49e0 chore: add changeset 2023-07-07 14:21:12 +01:00
Hassan Ben Jobrane
a95a77886b fix(hasura-storage-js): fix file upload 2023-07-07 10:44:42 +01:00
Stephan van Opstal
1f3f683202 Update serverless-functions.mdx (#2105)
Please correct me if I'm wrong but I believe the endpoints in the docs
are wrong.
2023-07-07 08:36:57 +02:00
github-actions[bot]
4c67fd23c4 chore: update versions (#2101)
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@0.19.0

### Minor Changes

- 9c61c69a7: chore(dashboard):add postgres 14.6-20230705-1 to the
version selector

### Patch Changes

-   47bda15ff: feat(settings): add warning to pull config

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-06 20:15:13 +02:00
Hassan Ben Jobrane
93d8d71e34 Merge pull request #2102 from nhost/feat/pull-config-warning
feat(settings): add warning to pull config
2023-07-06 15:06:08 +01:00
Hassan Ben Jobrane
47bda15ff2 chore: add changeset 2023-07-06 14:39:27 +01:00
Hassan Ben Jobrane
4563488b5d feat(settings): show alert when there's a repo 2023-07-06 14:35:31 +01:00
Hassan Ben Jobrane
8fd35f3fea feat(settings): add warning to pull config 2023-07-06 14:26:14 +01:00
David Barroso
9c61c69a7b chore(dashboard):add postgres 14.6-20230705-1 to the version selector (#2100) 2023-07-06 15:24:06 +02:00
github-actions[bot]
030ad4621e chore: update versions (#2098)
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@0.18.0

### Minor Changes

- ee0b9b8ed: chore(dashboard):add hasura v2.28.2 and v2.29.0 to the
version selector

## @nhost/docs@0.4.0

### Minor Changes

-   c6fa8da6d: fix(docs): remove outdated reference/cli

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-07-06 13:34:58 +02:00
David Barroso
ee0b9b8edc chore(dashboard):add hasura v2.28.2 and v2.29.0 to the version selector (#2097) 2023-07-06 13:21:53 +02:00
David Barroso
c6fa8da6df fix(docs): remove outdated reference/cli (#2093)
Fixes nhost/cli/issues/734
2023-07-06 12:21:14 +02:00
github-actions[bot]
dd9dedc226 chore: update versions (#2086) 2023-06-30 10:12:55 +02:00
Hassan Ben Jobrane
5638a91240 Merge pull request #2080 from nhost/renovate/tsconfig-docusaurus-2.x
chore(deps): update dependency @tsconfig/docusaurus to v2
2023-06-29 18:19:00 +01:00
Hassan Ben Jobrane
cdefbdebee chore: remove unchanged packages from changeset 2023-06-29 17:09:27 +01:00
Hassan Ben Jobrane
923abd3655 chore: add changeset 2023-06-29 17:02:26 +01:00
renovate[bot]
ef28540f9a chore(deps): update dependency @tsconfig/docusaurus to v2 2023-06-29 15:10:11 +00:00
Szilárd Dóró
d54e4cdd4e fix(hasura-storage-js): allow using custom buckets for upload (#2085)
This PR is a fix for the [issue mentioned on our Discord
channel](https://discord.com/channels/552499021260914688/1123893547955933214/1123893547955933214).
It wasn't caused by the latest hasura-storage-js release.
2023-06-29 17:07:29 +02:00
David Barroso
4a00963602 feat(observability): added graph with restarts (#2084) 2023-06-29 13:57:37 +02:00
github-actions[bot]
7ea9b890c8 chore: update versions (#2083)
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@0.17.19

### Patch Changes

-   f866120a6: fix(users): use the password length from the config

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-06-29 11:19:53 +02:00
Szilárd Dóró
f866120a65 fix(dashboard): use dynamic validation schema for password editing (#2082)
Fixes #2081
2023-06-29 10:52:40 +02:00
github-actions[bot]
472559276c chore: update versions (#2079)
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-storage-js@2.2.0

### Minor Changes

- 2cdb13b3e: fix(upload): allow specifying `id` and `name` only when not
using `form-data`

## @nhost/apollo@5.2.13

### Patch Changes

-   @nhost/nhost-js@2.2.11

## @nhost/react-apollo@5.0.30

### Patch Changes

-   @nhost/apollo@5.2.13
-   @nhost/react@2.0.26

## @nhost/react-urql@2.0.27

### Patch Changes

-   @nhost/react@2.0.26

## @nhost/nextjs@1.13.32

### Patch Changes

-   @nhost/react@2.0.26

## @nhost/nhost-js@2.2.11

### Patch Changes

-   Updated dependencies [2cdb13b3e]
    -   @nhost/hasura-storage-js@2.2.0

## @nhost/react@2.0.26

### Patch Changes

-   @nhost/nhost-js@2.2.11

## @nhost/vue@1.13.31

### Patch Changes

-   @nhost/nhost-js@2.2.11

## @nhost/dashboard@0.17.18

### Patch Changes

-   @nhost/react-apollo@5.0.30
-   @nhost/nextjs@1.13.32

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

### Patch Changes

- 2cdb13b3e: fix(upload): allow specifying `id` and `name` only when not
using `form-data`
    -   @nhost/nhost-js@2.2.11

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-06-27 16:50:56 +02:00
Szilárd Dóró
2cdb13b3ef fix(hasura-storage-js): streamline file upload API (#2072)
Fixes #2071

This PR changes the API of the `hasura-storage-js` SDK slightly.

Before:
```ts
const formData = new FormData();

// first file
formData.append('file[]', '<file>');

// second file
formData.append('file[]', '<file>');

const { fileMetadata, error } = await nhost.storage.upload({
  formData,
  id: '<custom-uuid>', // ID doesn't make sense anymore when uploading multiple files
  name: '<custom-name>', // Name doesn't make sense anymore when uploading multiple files
});
```

Now:
```ts
const formData = new FormData();

// first file
formData.append('file[]', '<file>', '<custom-name>');
formData.append('metadata[]', JSON.stringify({ id: '<custom-uuid>' }))

// second file
formData.append('file[]', '<file>', '<custom-name>');
formData.append('metadata[]', JSON.stringify({ id: '<custom-uuid>' }))

const { fileMetadata, error } = await nhost.storage.upload({ formData });

// Access the metadata of upload files via fileMetadata.processedFiles
```

The `id` and `name` attributes can only be specified if you want to
upload a single file:

```ts
const file = event.target.files[0];

const { fileMetadata, error } = await nhost.storage.upload({
  file,
  id: '<custom-id>',
  name: '<custom-name>',
});

// Access the metadata of the upload file via fileMetadata
```
2023-06-27 16:20:17 +02:00
github-actions[bot]
a41124c5e0 chore: update versions (#2077)
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/google-translation@0.0.6

### Patch Changes

-   a5305e6b5: docs: update old URLs to the new format

## @nhost/dashboard@0.17.17

### Patch Changes

-   ea7b102c0: fix(pat): highlight expired tokens

## @nhost/docs@0.3.4

### Patch Changes

-   a5305e6b5: docs: update old URLs to the new format

## @nhost-examples/seed-data-storage@0.0.4

### Patch Changes

-   a5305e6b5: docs: update old URLs to the new format

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-06-27 12:59:50 +02:00
Hassan Ben Jobrane
6ecffa81ae Merge pull request #2078 from nhost/fix/highlight-expired-tokens
fix(pat): highlight expired tokens
2023-06-27 11:46:19 +01:00
Hassan Ben Jobrane
ea7b102c07 chroe: add changeset 2023-06-27 11:31:03 +01:00
Hassan Ben Jobrane
e9daf92830 chore: fix code formatting 2023-06-27 10:09:29 +01:00
Hassan Ben Jobrane
9e4ad76e7f style: use darker color 2023-06-27 10:00:34 +01:00
Szilárd Dóró
0fd65db563 chore(dashboard): extend readme (#2076) 2023-06-27 09:19:07 +02:00
Hassan Ben Jobrane
146fbb84b9 fix: highlight expired tokens 2023-06-26 17:57:48 +01:00
Szilárd Dóró
b51c18fedb Merge pull request #2075 from nhost/docs/fix-old-urls
fix(docs): use modern URLs
2023-06-26 16:43:12 +02:00
Szilárd Dóró
a5305e6b56 chore: add changeset 2023-06-26 16:31:36 +02:00
Szilárd Dóró
aa88ef2e5c fix(docs): use correct functions URL 2023-06-26 16:08:58 +02:00
Szilárd Dóró
ee6b3c9ac8 fix(docs): use modern URLs 2023-06-26 16:06:49 +02:00
Szilárd Dóró
79fd86acc5 Merge pull request #2074 from nhost/fix/e2e-timeout
fix(ci): timeout long running e2e tests
2023-06-26 15:43:03 +02:00
Szilárd Dóró
c2cbeddcb8 fix(ci): timeout long running e2e tests 2023-06-26 15:34:36 +02:00
Szilárd Dóró
62b2de59d4 Merge pull request #2073 from nhost/changeset-release/main
chore: update versions
2023-06-25 17:50:18 +02:00
github-actions[bot]
2a760593db chore: update versions 2023-06-25 15:34:14 +00:00
Szilárd Dóró
9288873ce8 Merge pull request #2070 from nhost/renovate/react-monorepo
chore(deps): update react monorepo
2023-06-25 17:32:26 +02:00
Szilárd Dóró
47014be8e3 Merge pull request #2065 from nhost/renovate/turbo-monorepo
chore(deps): update dependency turbo to v1.10.6
2023-06-25 15:37:07 +02:00
Szilárd Dóró
49719f7a84 fix: don't break build 2023-06-25 15:23:22 +02:00
Szilárd Dóró
b3b64a3b74 chore: sync versions and add changeset 2023-06-25 15:21:13 +02:00
Szilárd Dóró
3a56c12df4 chore(dashboard): bump turbo to v1.10.6 2023-06-25 15:15:46 +02:00
renovate[bot]
5b15a4f235 chore(deps): update react monorepo 2023-06-25 13:13:47 +00:00
renovate[bot]
83303017c3 chore(deps): update dependency turbo to v1.10.6 2023-06-25 13:12:39 +00:00
Szilárd Dóró
e0739a5883 Merge pull request #2067 from nhost/renovate/graphiql-react-0.x
fix(deps): update dependency @graphiql/react to ^0.18.0
2023-06-25 15:10:36 +02:00
Szilárd Dóró
0a5a841cc8 fix: don't break builds 2023-06-25 14:57:31 +02:00
Szilárd Dóró
3309835f06 chore: revert PNPM version in flake.nix 2023-06-25 14:05:35 +02:00
Szilárd Dóró
32b221f944 chore: add changeset 2023-06-25 14:02:47 +02:00
renovate[bot]
e8a99badb8 fix(deps): update dependency @graphiql/react to ^0.18.0 2023-06-25 11:54:28 +00:00
Szilárd Dóró
1ea6e01963 Merge pull request #2066 from nhost/renovate/tj-actions-changed-files-37.x
chore(deps): update tj-actions/changed-files action to v37
2023-06-25 13:54:11 +02:00
Szilárd Dóró
958dec5dfe Merge pull request #2060 from nhost/changeset-release/main
chore: update versions
2023-06-25 13:50:55 +02:00
renovate[bot]
09257fbfb2 chore(deps): update tj-actions/changed-files action to v37 2023-06-24 17:15:19 +00:00
github-actions[bot]
61e3497a13 chore: update versions 2023-06-24 17:12:27 +00:00
Szilárd Dóró
a7b4e5606d Merge pull request #2069 from nhost/fix/security-keys
fix(webauthn): don't break webauthn form on save
2023-06-24 19:11:12 +02:00
Szilárd Dóró
34d77c9db1 fix(webauthn): don't break webauthn form on save 2023-06-24 18:54:06 +02:00
Szilárd Dóró
4f1efd28a6 Merge pull request #2058 from nhost/renovate/graphql-16.x
chore(deps): update dependency graphql to v16.7.1
2023-06-23 16:00:02 +02:00
Szilárd Dóró
07a45fde0e chore: add changeset 2023-06-23 14:30:07 +02:00
renovate[bot]
9d0380eef3 chore(deps): update dependency graphql to v16.7.1 2023-06-23 12:12:53 +00:00
Szilárd Dóró
ce3ec36b0a Merge pull request #2059 from nhost/fix/404
fix(dashboard): don't redirect to 404 page
2023-06-23 14:10:21 +02:00
Szilárd Dóró
b62a9d19b5 chore(dashboard): improve verbosity of variables 2023-06-23 13:02:32 +02:00
Szilárd Dóró
c1472079c5 Merge pull request #2057 from nhost/renovate/turbo-monorepo
chore(deps): update dependency turbo to v1.10.5
2023-06-23 12:23:29 +02:00
Szilárd Dóró
dd36971798 chore(pnpm): revert pnpm-lock file 2023-06-23 12:17:08 +02:00
Szilárd Dóró
6199c1c555 fix(dashboard): don't redirect to 404 page 2023-06-23 12:11:22 +02:00
Szilárd Dóró
f41fdc12af chore: bump turbo in the Dockerfile, add changeset 2023-06-23 10:23:43 +02:00
renovate[bot]
fc419ffa4d chore(deps): update dependency turbo to v1.10.5 2023-06-22 19:20:02 +00:00
Szilárd Dóró
b7c102e876 Merge pull request #2056 from nhost/changeset-release/main
chore: update versions
2023-06-21 16:01:32 +02:00
github-actions[bot]
873fc36e61 chore: update versions 2023-06-21 13:29:42 +00:00
Szilárd Dóró
29743f0b71 Merge pull request #2053 from nhost/renovate/react-monorepo
chore(deps): update react monorepo and `@storybook/testing-library`
2023-06-21 15:28:22 +02:00
Szilárd Dóró
d904ca2bbf Merge branch 'renovate/react-monorepo' of https://github.com/nhost/nhost into renovate/react-monorepo 2023-06-21 10:29:52 +02:00
Szilárd Dóró
80b22724de chore(deps): bump @storybook/testing-library 2023-06-21 10:29:38 +02:00
renovate[bot]
80e49f4459 chore(deps): update react monorepo 2023-06-21 07:58:56 +00:00
David Barroso
b3d5ead508 chore(docs): fix stripe reference to env vars (#2054) 2023-06-21 09:55:45 +02:00
renovate[bot]
77dcb8c964 chore(deps): update react monorepo 2023-06-19 16:30:54 +00:00
Szilárd Dóró
3488da9dfd Merge pull request #2052 from nhost/changeset-release/main
chore: update versions
2023-06-19 10:13:57 +02:00
github-actions[bot]
0e68a1fdfd chore: update versions 2023-06-16 12:39:47 +00:00
Szilárd Dóró
8797b2bd17 Merge pull request #2051 from nhost/renovate/commander-11.x
fix(deps): update dependency commander to v11
2023-06-16 14:38:37 +02:00
Szilárd Dóró
5ef0b31573 chore: add changeset 2023-06-16 11:20:58 +02:00
renovate[bot]
86e5e0fb50 fix(deps): update dependency commander to v11 2023-06-16 01:45:29 +00:00
Szilárd Dóró
c2d589dd29 Merge pull request #2049 from nhost/changeset-release/main
chore: update versions
2023-06-15 11:34:48 +02:00
github-actions[bot]
4b807d8134 chore: update versions 2023-06-15 09:16:08 +00:00
Szilárd Dóró
ccdabb707f Merge pull request #2048 from nhost/fix/system-env-var-copy
chore(docs): update environment variable docs
2023-06-15 11:14:40 +02:00
Szilárd Dóró
364bc87fd3 docs: update custom env vars section 2023-06-15 10:48:43 +02:00
Szilárd Dóró
cc02902cbb chore: docs: update env var docs 2023-06-15 10:42:00 +02:00
Szilárd Dóró
0e838b9406 Merge pull request #2043 from nhost/changeset-release/main
chore: update versions
2023-06-15 09:47:18 +02:00
Szilárd Dóró
37ebf7d8e2 Merge pull request #2044 from nhost/chore/update-developers-guide
chore: update DEVELOPERS.md
2023-06-15 09:37:53 +02:00
github-actions[bot]
e23af24bdd chore: update versions 2023-06-15 07:29:50 +00:00
Szilárd Dóró
90eb53cf19 Merge pull request #2045 from nhost/fix/storybook-and-tests
fix(dashboard): don't break storybook and don't show warnings during tests
2023-06-15 09:28:21 +02:00
Szilárd Dóró
7e516d7630 Merge pull request #2046 from nhost/fix/functions-and-graphql-header
fix(nhost-js): pass access token to underlying clients
2023-06-15 08:39:01 +02:00
Szilárd Dóró
0861e41e70 fix: dashboard: correct typo in the readme 2023-06-15 08:38:41 +02:00
Szilárd Dóró
057e7e2572 chore: dashboard: update README 2023-06-14 21:30:43 +02:00
Szilárd Dóró
5a4e237a29 fix(nhost-js): pass access token to underlying clients 2023-06-14 21:17:46 +02:00
Szilárd Dóró
c7501c70ae fix: pin playwright to 1.31.0 2023-06-14 18:57:27 +02:00
Szilárd Dóró
6a45c1abad fix: dashboard: don't break storybook 2023-06-14 15:29:53 +02:00
Szilárd Dóró
660d339e14 fix: dashboard: prevent warnings during tests 2023-06-14 15:29:37 +02:00
Szilárd Dóró
3dca08595d Merge pull request #2038 from nhost/fix/token-reload
fix(hasura-auth-js): prevent infinite token refresh
2023-06-14 14:38:22 +02:00
Szilárd Dóró
7c501c4e4f chore: add section about selecting versions 2023-06-14 14:36:17 +02:00
github-actions[bot]
b9316bb668 chore: update versions (#2041)
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@0.17.11

### Patch Changes

- bd4d0c270: chore(dashboard):add postgres 14.6-20230613-1 to the
version selector

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-06-14 14:29:07 +02:00
Szilárd Dóró
5e1d5b737c chore: extend DEVELOPERS.md with changeset info 2023-06-14 14:27:08 +02:00
David Barroso
bd4d0c2708 chore(dashboard):add postgres 14.6-20230613-1 to the version selector (#2039) 2023-06-14 14:15:12 +02:00
Szilárd Dóró
1d04ad6306 fix: hasura-auth-js: don't break unit tests 2023-06-14 12:01:13 +02:00
Szilárd Dóró
a4fa5f6f59 fix: don't break unit tests 2023-06-14 10:06:31 +02:00
Szilárd Dóró
7e973d568a fix: hasura-auth-js: prevent infinite token refresh 2023-06-14 09:46:58 +02:00
Szilárd Dóró
d81c52209b Merge pull request #2036 from nhost/chore/bump-nhost-cli
chore(nix): bump Nhost CLI and Node.js versions
2023-06-13 16:05:04 +02:00
Szilárd Dóró
72744b3082 chore: remove duplicate nhost package 2023-06-13 14:43:04 +02:00
Szilárd Dóró
ff4efe2712 chore: bump Node version in workspace 2023-06-13 14:42:28 +02:00
Szilárd Dóró
2982b90469 chore: bump Nhost CLI version 2023-06-13 14:35:21 +02:00
180 changed files with 4014 additions and 1953 deletions

View File

@@ -43,7 +43,7 @@ jobs:
BUILD: 'all'
- name: Check if the pnpm lockfile changed
id: changed-lockfile
uses: tj-actions/changed-files@v36
uses: tj-actions/changed-files@v37
with:
files: pnpm-lock.yaml
# * Determine a pnpm filter argument for packages that have been modified.
@@ -146,6 +146,7 @@ jobs:
run: echo "NHOST_TEST_DASHBOARD_URL=https://${{ steps.fetch-dashboard-preview-url.outputs.preview_url }}" >> $GITHUB_ENV
# * Run the `ci` script of the current package of the matrix. Dependencies build is cached by Turborepo
- name: Run e2e tests
timeout-minutes: 7
run: pnpm --filter="${{ matrix.package.name }}" run e2e
- id: file-name
if: ${{ failure() }}

4
.gitignore vendored
View File

@@ -62,3 +62,7 @@ todo.md
# Nhost CLI data
.nhost
# Nix
.envrc
.direnv/

View File

@@ -1,16 +1,37 @@
# Developer guide
# Developer Guide
## Requirements
- This repository works with **Node 16**
### Node.js v18
- We use [pnpm](https://pnpm.io/) as a package manager to speed up development and builds, and as a basis for our monorepo. You need to make sure it's installed on your machine. There are [several ways to install it](https://pnpm.io/installation), but the easiest way is with `npm`:
_⚠️ Node.js v16 is also supported for the time being but support will be dropped in the near future_.
### [pnpm](https://pnpm.io/) package manager
The easiest way to install `pnpm` if it's not installed on your machine yet is to use `npm`:
```sh
$ npm install -g pnpm
```
- Our tests and examples use the Nhost CLI, to run the backend services locally. You can follow the installation instructions in [our documentation](https://docs.nhost.io/get-started/cli-workflow/install-cli).
### [Nhost CLI](https://docs.nhost.io/cli)
- The CLI is primarily used for running the E2E tests
- Please refer to the [installation guide](https://docs.nhost.io/get-started/cli-workflow/install-cli) if you have not installed it yet
## File Structure
The repository is organized as a monorepo, with the following structure (only relevant folders are shown):
```
assets/ # Assets used in the README
config/ # Configuration files for the monorepo
dashboard/ # Dashboard
docs/ # Documentation website
examples/ # Example projects
packages/ # Core packages
integrations/ # These are packages that rely on the core packages
```
## Get started
@@ -31,25 +52,25 @@ $ pnpm install
### Development
Although package references are correctly updated on the fly for TypeScript, example projects won't
see the changes because they are depending on the build output. To fix this, you can run packages
in development mode.
Although package references are correctly updated on the fly for TypeScript, example projects and the dashboard won't see the changes because they are depending on the build output. To fix this, you can run packages in development mode.
Running packages in development mode is as simple as:
Running packages in development mode from the root folder is as simple as:
```sh
$ pnpm dev
```
Our packages are linked together using [PNPM's workspace](https://pnpm.io/workspaces) feature. Vite automatically detects changes in the dependencies and rebuilds everything, so that the changes are immediately reflected in the other packages.
Our packages are linked together using [PNPM's workspace](https://pnpm.io/workspaces) feature. Next.js and Vite automatically detect changes in the dependencies and rebuild everything, so the changes will be reflected in the examples and the dashboard.
### Use examples
**Note:** It's possible that Next.js or Vite throw an error when you run `pnpm dev`. Restarting the process should fix it.
### Use Examples
Examples are a great way to test your changes in practice. Make sure you've `pnpm dev` running in your terminal and then run an example.
Let's follow the instructions to run [react-apollo example](https://github.com/nhost/nhost/blob/main/examples/react-apollo/README.md).
## Run the documentation website locally
## Edit Documentation
The easier way to contribute to our documentation is to go to the `docs` folder and follow the [instructions to start local development](https://github.com/nhost/nhost/blob/main/docs/README.md):
@@ -60,9 +81,9 @@ $ pnpm install
$ pnpm start
```
## Run test suites
## Run Test Suites
### Unit tests
### Unit Tests
You can run the unit tests with the following command from the repository root:
@@ -70,7 +91,7 @@ You can run the unit tests with the following command from the repository root:
$ pnpm test
```
### End-to-end tests
### E2E Tests
Each package that defines end-to-end tests embeds their own Nhost configuration, that will be automatically when running the tests. As a result, you must make sure you are not running the Nhost CLI before running the tests.
@@ -83,24 +104,60 @@ $ pnpm e2e
## Changesets
If you've made changes to the packages, you must describe those changes so that they can be reflected in the next release.
We use [changesets](https://github.com/changesets/changesets) to support our versioning and release workflows. When you submit a pull request, a bot checks if some changesets are present, and if not, it directs you to add them.
We use [changesets](https://github.com/changesets/changesets) to support our versioning and release workflows. When you submit a pull request, a bot checks if changesets are present, and if not, it asks you to add them.
The most comprehensive way to add a changeset is to run the following command in the repository root:
To create a changeset, run the following command from the repository root:
```sh
$ pnpm changeset
```
This will create a file in the `.changeset` directory. You can edit it to give more details about the change you just made.
This command will guide you through the process of creating a changeset. It will create a file in the `.changeset` directory.
You can take a look at the changeset documentation: [How to add a changeset](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).
## Committing changes
### Selecting the Version
You'll notice that `git commit` takes a few seconds to run. We set a commit hook that scans the changes in the code, automatically generates documentation from the inline [TSDoc](https://tsdoc.org/) annotations, and adds these generated documentation files to the commit. They automatically update the [reference documentation](https://docs.nhost.io/reference).
When you create a changeset, you will be asked to select the version of the package that you are bumping. The versioning scheme is as follows:
- **major**
- For breaking changes (e.g: changing the function signature, etc.)
- Should be avoided as much as possible as it will require users to update their code. Instead, consider supporting both the old and the new API simultaneously for a while.
- For example: `v1.5.8` -> `v2.0.0`
- **minor**
- For new features (e.g: adding a new page to the dashboard, etc.)
- For example: `v1.5.8` -> `v1.6.0`
- **patch**
- For bug fixes (e.g: fixing a typo, etc.)
- For example: `v1.5.8` -> `v1.5.9`
<!-- ## Good practices
- lint
- prettier
- documentation -->
### Writing Good Changesets
A concise summary that describes the changes should be added to each PR. This summary will be used as the changeset description.
The following structure is used for describing changes:
- **The type of the change**:
- fix
- feat
- chore
- docs
- **The scope of the change** (_broader scopes (e.g: dashboard, hasura-storage-js, etc.) are not recommended as GitHub Releases already contain which project is being bumped_):
- projects
- deployments
- deps
- etc.
- **A short summary of the changes that were made**
**Examples:**
- `fix(deployments): use correct timestamp for deployment details`
- `chore(deps): bump @types/react to v18.2.8`
- `feat(secrets): enable secrets`
- etc.
You can always take a look at examples of changesets in the [GitHub Releases section](https://github.com/nhost/nhost/releases).

View File

@@ -34,7 +34,7 @@ Nhost consists of open source software:
- Authentication: [Hasura Auth](https://github.com/nhost/hasura-auth/)
- Storage: [Hasura Storage](https://github.com/nhost/hasura-storage)
- Serverless Functions: Node.js (JavaScript and TypeScript)
- [Nhost CLI](https://docs.nhost.io/reference/cli) for local development
- [Nhost CLI](https://docs.nhost.io/cli) for local development
## Architecture of Nhost
@@ -97,7 +97,7 @@ Nhost is frontend agnostic, which means Nhost works with all frontend frameworks
# Resources
- Start developing locally with the [Nhost CLI](https://docs.nhost.io/reference/cli)
- Start developing locally with the [Nhost CLI](https://docs.nhost.io/cli)
## Nhost Clients

View File

@@ -2,13 +2,14 @@ import '@fontsource/inter';
import '@fontsource/inter/500.css';
import '@fontsource/inter/700.css';
import { CssBaseline, ThemeProvider } from '@mui/material';
import { NhostClient, NhostProvider } from '@nhost/nextjs';
import { NhostApolloProvider } from '@nhost/react-apollo';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { Buffer } from 'buffer';
import { initialize, mswDecorator } from 'msw-storybook-addon';
import { RouterContext } from 'next/dist/shared/lib/router-context';
import { createTheme } from '../src/components/ui/v2/createTheme';
import '../src/styles/globals.css';
import createTheme from '../src/theme/createTheme';
global.Buffer = Buffer;
@@ -56,5 +57,10 @@ export const decorators = [
<Story />
</NhostApolloProvider>
),
(Story) => (
<NhostProvider nhost={new NhostClient({ subdomain: 'local' })}>
<Story />
</NhostProvider>
),
mswDecorator,
];

View File

@@ -1,5 +1,102 @@
# @nhost/dashboard
## 0.19.1
### Patch Changes
- @nhost/react-apollo@5.0.32
- @nhost/nextjs@1.13.34
## 0.19.0
### Minor Changes
- 9c61c69a7: chore(dashboard):add postgres 14.6-20230705-1 to the version selector
### Patch Changes
- 47bda15ff: feat(settings): add warning to pull config
## 0.18.0
### Minor Changes
- ee0b9b8ed: chore(dashboard):add hasura v2.28.2 and v2.29.0 to the version selector
## 0.17.20
### Patch Changes
- @nhost/react-apollo@5.0.31
- @nhost/nextjs@1.13.33
## 0.17.19
### Patch Changes
- f866120a6: fix(users): use the password length from the config
## 0.17.18
### Patch Changes
- @nhost/react-apollo@5.0.30
- @nhost/nextjs@1.13.32
## 0.17.17
### Patch Changes
- ea7b102c0: fix(pat): highlight expired tokens
## 0.17.16
### Patch Changes
- b3b64a3b7: chore(deps): bump `@types/react` to `v18.2.14` and `@types/react-dom` to `v18.2.6`
- 32b221f94: chore(deps): bump `graphiql` to `v3`
- 3a56c12df: chore(deps): bump `turbo` to `v1.10.6`
- Updated dependencies [b3b64a3b7]
- @nhost/react-apollo@5.0.29
- @nhost/nextjs@1.13.31
## 0.17.15
### Patch Changes
- f41fdc12a: chore(deps): bump `turbo` to `1.10.5`
- 6199c1c55: fix(projects): don't redirect to 404 page
- Updated dependencies [07a45fde0]
- @nhost/react-apollo@5.0.28
- @nhost/nextjs@1.13.30
## 0.17.14
### Patch Changes
- 80b22724d: chore(deps): bump `@types/react` to `v18.2.13`, `@types/react-dom` to `v18.2.6` and `@storybook/testing-library` to `v0.2.0`
## 0.17.13
### Patch Changes
- cc02902cb: chore(docs): update environment variable documentation
## 0.17.12
### Patch Changes
- 660d339e1: fix(storybook): don't break storybook
- 660d339e1: fix(tests): prevent warnings during tests
- @nhost/react-apollo@5.0.27
- @nhost/nextjs@1.13.29
## 0.17.11
### Patch Changes
- bd4d0c270: chore(dashboard):add postgres 14.6-20230613-1 to the version selector
## 0.17.10
### Patch Changes

View File

@@ -3,7 +3,7 @@ RUN apk add --no-cache libc6-compat
RUN apk update
WORKDIR /app
RUN yarn global add turbo@1.10.3
RUN yarn global add turbo@1.10.6
COPY . .
RUN turbo prune --scope="@nhost/dashboard" --docker

View File

@@ -3,10 +3,26 @@
This is the Nhost Dashboard, a web application that allows you to manage your Nhost projects.
To get started, you need to have an Nhost project. If you don't have one, you can [create a project here](https://app.nhost.io).
First, install the dependencies:
```bash
pnpm install
```
Then, build the packages that are used by the Nhost Dashboard:
```bash
pnpm -w build
```
Finally, run the development server:
```bash
pnpm dev
```
Open [http://localhost:3000](http://localhost:3000) to see the result in your browser.
## Environment
### Setup Environment Variables
@@ -54,6 +70,12 @@ Components are documented using [Storybook](https://storybook.js.org/). To run S
pnpm storybook
```
By default, Storybook will run on port `6006`. You can change this by passing the `--port` flag:
```bash
pnpm storybook --port 6007
```
### General Environment Variables
| Name | Description |
@@ -110,15 +132,19 @@ pnpm storybook
| `@typescript-eslint/naming-convention` | Enforces a consistent naming convention. |
| `no-restricted-imports` | Enforces absolute imports and consistent import paths for components from `src/components/ui` folder. |
### End-to-End Tests
### Unit Tests
End-to-end tests are written using [Playwright](https://playwright.dev/). To run the tests, run the following command:
Unit tests are written using [Vitest](https://vitest.dev/). To run the tests, run the following command:
```bash
pnpm e2e
pnpm test
```
Most of the tests require access to the Nhost test user. To run these tests, you need to set the following environment variables in `.env.test`:
### End-to-End Tests
Most of the end-to-end tests require access to an Nhost test user and a live project. You can register a user and create a test project on the [Nhost Dashboard](https://app.nhost.io/).
Next, you need to create a project. Create a `.env.test` file with the following variables:
```
NHOST_TEST_DASHBOARD_URL=<test_dashboard_url>
@@ -128,3 +154,20 @@ NHOST_TEST_WORKSPACE_NAME=<test_workspace_name>
NHOST_TEST_PROJECT_NAME=<test_project_name>
NHOST_TEST_PROJECT_ADMIN_SECRET=<test_project_admin_secret>
```
**Required Variables**:
- `NHOST_TEST_DASHBOARD_URL`: The URL to run the tests against (e.g: http://localhost:3000 or https://staging.app.nhost.io)
- `NHOST_TEST_USER_EMAIL`: Email address of the test user that owns the test project
- `NHOST_TEST_USER_PASSWORD`: Password of the test user that owns the test project
- `NHOST_TEST_WORKSPACE_NAME`: Name of the workspace that contains the test project
- `NHOST_TEST_PROJECT_NAME`: Name of the test project
- `NHOST_TEST_PROJECT_ADMIN_SECRET`: Admin secret of the test project
Make sure to copy the workspace and project information from the [Nhost Dashboard](https://app.nhost.io/).
End-to-end tests are written using [Playwright](https://playwright.dev/). To run the tests, run the following command:
```bash
pnpm e2e
```

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/dashboard",
"version": "0.17.10",
"version": "0.19.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
@@ -11,11 +11,11 @@
"lint": "next lint --max-warnings 0",
"test": "vitest",
"codegen": "graphql-codegen --config graphql.config.yaml --errors-only",
"nhost:dev": "nhost up",
"format": "prettier --write \"src/**/*.{js,ts,tsx,jsx,json,md}\" --plugin-search-dir=.",
"storybook": "start-storybook -p 6006 -s public",
"build-storybook": "build-storybook",
"e2e": "npx playwright@1.34.0 install --with-deps && playwright test"
"install-browsers": "pnpm dlx playwright@1.31.0 install --with-deps",
"e2e": "pnpm install-browsers && pnpm dlx playwright@1.31.0 test"
},
"dependencies": {
"@apollo/client": "^3.7.10",
@@ -26,7 +26,7 @@
"@emotion/styled": "^11.10.5",
"@fontsource/inter": "^5.0.0",
"@fontsource/roboto-mono": "^5.0.0",
"@graphiql/react": "^0.17.0",
"@graphiql/react": "^0.18.0",
"@graphiql/toolkit": "^0.8.2",
"@headlessui/react": "^1.6.5",
"@heroicons/react": "^1.0.6",
@@ -49,7 +49,7 @@
"clsx": "^1.2.1",
"date-fns": "^2.29.3",
"generate-password": "^1.7.0",
"graphiql": "^2.4.0",
"graphiql": "^3.0.0",
"graphql": "^16.6.0",
"graphql-request": "^6.0.0",
"graphql-tag": "^2.12.6",
@@ -87,7 +87,7 @@
"@graphql-codegen/typescript-operations": "^3.0.0",
"@graphql-codegen/typescript-react-apollo": "^3.3.1",
"@next/bundle-analyzer": "^12.3.1",
"@playwright/test": "^1.34.0",
"@playwright/test": "1.31.0",
"@storybook/addon-actions": "^6.5.14",
"@storybook/addon-essentials": "^6.5.14",
"@storybook/addon-interactions": "^6.5.14",
@@ -96,16 +96,17 @@
"@storybook/builder-webpack5": "^6.5.14",
"@storybook/manager-webpack5": "^6.5.14",
"@storybook/react": "^6.5.14",
"@storybook/testing-library": "^0.0.13",
"@storybook/testing-library": "^0.2.0",
"@testing-library/dom": "^9.0.0",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^14.4.3",
"@types/bcryptjs": "^2.4.2",
"@types/lodash.debounce": "^4.0.7",
"@types/node": "^16.11.7",
"@types/pluralize": "^0.0.29",
"@types/react": "18.2.12",
"@types/react-dom": "18.2.5",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@types/react-table": "^7.7.12",
"@types/testing-library__jest-dom": "^5.14.5",
"@types/validator": "^13.7.10",

View File

@@ -3,7 +3,10 @@ import { ProjectLayout } from '@/components/layout/ProjectLayout';
import type { SettingsSidebarProps } from '@/components/layout/SettingsSidebar';
import { SettingsSidebar } from '@/components/layout/SettingsSidebar';
import { RetryableErrorBoundary } from '@/components/presentational/RetryableErrorBoundary';
import { Alert } from '@/components/ui/v2/Alert';
import { Box } from '@/components/ui/v2/Box';
import { Text } from '@/components/ui/v2/Text';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { twMerge } from 'tailwind-merge';
export interface SettingsLayoutProps extends ProjectLayoutProps {
@@ -22,6 +25,9 @@ export default function SettingsLayout({
sidebarProps: { className: sidebarClassName, ...sidebarProps } = {},
...props
}: SettingsLayoutProps) {
const { currentProject } = useCurrentWorkspaceAndProject();
const hasGitRepo = !!currentProject?.githubRepository;
return (
<ProjectLayout
mainContainerProps={{
@@ -37,9 +43,39 @@ export default function SettingsLayout({
<Box
sx={{ backgroundColor: 'background.default' }}
className="flex w-full flex-auto flex-col overflow-x-hidden"
className="flex w-full flex-auto flex-col overflow-scroll overflow-x-hidden"
>
<RetryableErrorBoundary>{children}</RetryableErrorBoundary>
<RetryableErrorBoundary>
{hasGitRepo && (
<Alert
severity="warning"
className="grid grid-flow-row place-content-center gap-2"
>
<Text color="warning" className="text-sm ">
As you have a connected repository, make sure to synchronize
your changes with{' '}
<code className="rounded-md bg-slate-200 px-2 py-px text-slate-500">
nhost config pull
</code>{' '}
or they may be reverted with the next push.
<br />
If there are multiple projects linked to the same repository and
you only want these changes to apply to a subset of them, please
check out{' '}
<a
target="_blank"
rel="noopener noreferrer"
className="underline"
href="https://docs.nhost.io/cli/overlays"
>
docs.nhost.io/cli/overlays
</a>{' '}
for guidance.
</Text>
</Alert>
)}
{children}
</RetryableErrorBoundary>
</Box>
</ProjectLayout>
);

View File

@@ -1,11 +1,18 @@
import { styled } from '@mui/material';
import { textClasses } from '@/components/ui/v2/Text';
import { getTypographyUtilityClass, styled } from '@mui/material';
import type { ListItemTextProps as MaterialListItemTextProps } from '@mui/material/ListItemText';
import MaterialListItemText, {
listItemTextClasses,
listItemTextClasses as materialListItemTextClasses,
} from '@mui/material/ListItemText';
import clsx from 'clsx';
export interface ListItemTextProps extends MaterialListItemTextProps {}
const listItemTextClasses = {
...materialListItemTextClasses,
warning: getTypographyUtilityClass('colorWarning'),
};
const StyledListItemText = styled(MaterialListItemText)(({ theme }) => ({
color: theme.palette.text.primary,
display: 'grid',
@@ -16,6 +23,9 @@ const StyledListItemText = styled(MaterialListItemText)(({ theme }) => ({
[`&.${listItemTextClasses.root}`]: {
margin: 0,
},
[`&.${listItemTextClasses.warning}`]: {
color: theme.palette.warning.dark,
},
[`& > .${listItemTextClasses.primary}`]: {
fontWeight: 500,
textOverflow: 'ellipsis',
@@ -29,8 +39,23 @@ const StyledListItemText = styled(MaterialListItemText)(({ theme }) => ({
},
}));
function ListItemText({ children, ...props }: ListItemTextProps) {
return <StyledListItemText {...props}>{children}</StyledListItemText>;
function ListItemText({
children,
color = 'primary',
className,
...props
}: ListItemTextProps) {
return (
<StyledListItemText
className={clsx(
color === 'warning' && textClasses.colorWarning,
className,
)}
{...props}
>
{children}
</StyledListItemText>
);
}
ListItemText.displayName = 'NhostListItemText';

View File

@@ -18,7 +18,7 @@ export type TextProps<
*
* @default 'primary'
*/
color?: 'primary' | 'secondary' | 'disabled' | 'error';
color?: 'primary' | 'secondary' | 'disabled' | 'error' | 'warning';
/**
* The component used for the root node.
*/
@@ -31,6 +31,7 @@ const textClasses = {
colorSecondary: getTypographyUtilityClass('colorSecondary'),
colorDisabled: getTypographyUtilityClass('colorDisabled'),
colorError: getTypographyUtilityClass('colorError'),
colorWarning: getTypographyUtilityClass('colorWarning'),
};
const StyledTypography = styled(MaterialTypography)<TextProps>(({ theme }) => ({
@@ -50,6 +51,9 @@ const StyledTypography = styled(MaterialTypography)<TextProps>(({ theme }) => ({
[`&.${textClasses.colorError}`]: {
color: theme.palette.error.main,
},
[`&.${textClasses.colorWarning}`]: {
color: theme.palette.warning.dark,
},
}));
function Text<
@@ -70,6 +74,7 @@ function Text<
color === 'secondary' && textClasses.colorSecondary,
color === 'disabled' && textClasses.colorDisabled,
color === 'error' && textClasses.colorError,
color === 'warning' && textClasses.colorWarning,
className,
)}
{...props}

View File

@@ -0,0 +1,40 @@
import type { IconProps } from '@/components/ui/v2/icons';
import { SvgIcon } from '@/components/ui/v2/icons/SvgIcon';
import type { ForwardedRef } from 'react';
import { forwardRef } from 'react';
function WarningIcon(props: IconProps, ref: ForwardedRef<SVGSVGElement>) {
return (
<SvgIcon
width="16"
height="16"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
aria-label="Warning"
ref={ref}
{...props}
>
<path
d="M8 5.5V9.5"
stroke="currentColor"
strokeWidth="1.5"
strokeLinejoin="round"
/>
<path
d="M7.135 2.49904L1.63648 11.9986C1.5485 12.1506 1.5021 12.3231 1.50195 12.4987C1.50181 12.6743 1.54792 12.8469 1.63565 12.999C1.72338 13.1512 1.84964 13.2776 2.00172 13.3654C2.15379 13.4533 2.32633 13.4995 2.50196 13.4995H13.499C13.6746 13.4995 13.8472 13.4533 13.9992 13.3654C14.1513 13.2776 14.2776 13.1512 14.3653 12.999C14.453 12.8469 14.4991 12.6743 14.499 12.4987C14.4988 12.3231 14.4524 12.1506 14.3645 11.9986L8.86594 2.49904C8.7781 2.34728 8.6519 2.22129 8.49999 2.1337C8.34809 2.04611 8.17582 2 8.00047 2C7.82512 2 7.65285 2.04611 7.50095 2.1337C7.34904 2.22129 7.22284 2.34728 7.135 2.49904V2.49904Z"
fill="none"
stroke="currentColor"
strokeWidth="1.5"
strokeLinejoin="round"
/>
<path
d="M8 12C8.41421 12 8.75 11.6642 8.75 11.25C8.75 10.8358 8.41421 10.5 8 10.5C7.58579 10.5 7.25 10.8358 7.25 11.25C7.25 11.6642 7.58579 12 8 12Z"
fill="currentColor"
/>
</SvgIcon>
);
}
WarningIcon.displayName = 'NhostWarningIcon';
export default forwardRef(WarningIcon);

View File

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

View File

@@ -9,9 +9,11 @@ import { Dropdown } from '@/components/ui/v2/Dropdown';
import { IconButton } from '@/components/ui/v2/IconButton';
import { DotsVerticalIcon } from '@/components/ui/v2/icons/DotsVerticalIcon';
import { PlusIcon } from '@/components/ui/v2/icons/PlusIcon';
import { WarningIcon } from '@/components/ui/v2/icons/WarningIcon';
import { List } from '@/components/ui/v2/List';
import { ListItem } from '@/components/ui/v2/ListItem';
import { Text } from '@/components/ui/v2/Text';
import { Tooltip } from '@/components/ui/v2/Tooltip';
import { CreatePATForm } from '@/features/account/settings/components/CreatePATForm';
import { getToastStyleProps } from '@/utils/constants/settings';
import { getServerError } from '@/utils/getServerError';
@@ -133,69 +135,91 @@ export default function PATSettings() {
<Box className="grid grid-flow-row gap-2">
{availablePersonalAccessTokens.length > 0 && (
<List>
{availablePersonalAccessTokens.map((pat, index) => (
<Fragment key={pat.id}>
<ListItem.Root
className="grid grid-cols-3 gap-2 px-4 pr-12"
secondaryAction={
<Dropdown.Root>
<Dropdown.Trigger
asChild
hideChevron
className="absolute right-4 top-1/2 -translate-y-1/2"
>
<IconButton
variant="borderless"
color="secondary"
disabled={maintenanceActive}
aria-label={`More options for ${pat.name}`}
{availablePersonalAccessTokens.map((pat, index) => {
const tokenHasExpired = new Date(pat.expiresAt) < new Date();
return (
<Fragment key={pat.id}>
<ListItem.Root
className="grid grid-cols-3 gap-2 px-4 pr-12"
secondaryAction={
<Dropdown.Root>
<Dropdown.Trigger
asChild
hideChevron
className="absolute right-4 top-1/2 -translate-y-1/2"
>
<DotsVerticalIcon />
</IconButton>
</Dropdown.Trigger>
<IconButton
variant="borderless"
color="secondary"
disabled={maintenanceActive}
aria-label={`More options for ${pat.name}`}
>
<DotsVerticalIcon />
</IconButton>
</Dropdown.Trigger>
<Dropdown.Content
menu
PaperProps={{ className: 'w-32' }}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'right',
}}
transformOrigin={{
vertical: 'top',
horizontal: 'right',
}}
>
<Dropdown.Item onClick={() => handleConfirmDelete(pat)}>
<Text className="font-medium" color="error">
Delete
</Text>
</Dropdown.Item>
</Dropdown.Content>
</Dropdown.Root>
}
>
<ListItem.Text className="truncate">{pat.name}</ListItem.Text>
<Dropdown.Content
menu
PaperProps={{ className: 'w-32' }}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'right',
}}
transformOrigin={{
vertical: 'top',
horizontal: 'right',
}}
>
<Dropdown.Item
onClick={() => handleConfirmDelete(pat)}
>
<Text className="font-medium" color="error">
Delete
</Text>
</Dropdown.Item>
</Dropdown.Content>
</Dropdown.Root>
}
>
<ListItem.Text
className="truncate"
color={tokenHasExpired ? 'warning' : 'primary'}
>
<span className="mr-2">{pat.name}</span>
{tokenHasExpired && (
<Tooltip title="This personal access token is expired.">
<WarningIcon className="h-4 w-4" />
</Tooltip>
)}
</ListItem.Text>
<Text className="truncate">
{new Date(pat.expiresAt).toLocaleDateString()}
</Text>
<Text
className="truncate"
color={tokenHasExpired ? 'warning' : 'primary'}
>
{new Date(pat.expiresAt).toLocaleDateString()}
</Text>
<Text className="truncate">
{new Date(pat.createdAt).toLocaleDateString()}
</Text>
</ListItem.Root>
<Text
className="truncate"
color={tokenHasExpired ? 'warning' : 'primary'}
>
{new Date(pat.createdAt).toLocaleDateString()}
</Text>
</ListItem.Root>
<Divider
component="li"
className={twMerge(
index === availablePersonalAccessTokens.length - 1
? '!mt-4'
: '!my-4',
)}
/>
</Fragment>
))}
<Divider
component="li"
className={twMerge(
index === availablePersonalAccessTokens.length - 1
? '!mt-4'
: '!my-4',
)}
/>
</Fragment>
);
})}
</List>
)}

View File

@@ -66,7 +66,10 @@ export default function WebAuthnSettings() {
config: {
auth: {
method: {
webauthn: values,
webauthn: {...values,
relyingParty: {
name: currentProject.name,
}},
},
},
},

View File

@@ -3,12 +3,16 @@ import { Form } from '@/components/form/Form';
import { Alert } from '@/components/ui/v2/Alert';
import { Button } from '@/components/ui/v2/Button';
import { Input } from '@/components/ui/v2/Input';
import { useCurrentWorkspaceAndProject } from '@/features/projects/common/hooks/useCurrentWorkspaceAndProject';
import { useRemoteApplicationGQLClient } from '@/hooks/useRemoteApplicationGQLClient';
import type { DialogFormProps } from '@/types/common';
import { getToastStyleProps } from '@/utils/constants/settings';
import { getServerError } from '@/utils/getServerError';
import type { RemoteAppGetUsersQuery } from '@/utils/__generated__/graphql';
import { useUpdateRemoteAppUserMutation } from '@/utils/__generated__/graphql';
import {
useGetSignInMethodsQuery,
useUpdateRemoteAppUserMutation,
} from '@/utils/__generated__/graphql';
import { yupResolver } from '@hookform/resolvers/yup';
import bcrypt from 'bcryptjs';
import { useState } from 'react';
@@ -27,19 +31,6 @@ export interface EditUserPasswordFormProps extends DialogFormProps {
user: RemoteAppGetUsersQuery['users'][0];
}
export const validationSchema = Yup.object({
password: Yup.string()
.label('Users Password')
.min(8, 'Password must be at least 8 characters long.')
.required('This field is required.'),
cpassword: Yup.string()
.required('Confirm Password is required')
.min(8, 'Password must be at least 8 characters long.')
.oneOf([Yup.ref('password')], 'Passwords do not match'),
});
export type EditUserPasswordFormValues = Yup.InferType<typeof validationSchema>;
export default function EditUserPasswordForm({
onCancel,
user,
@@ -49,26 +40,52 @@ export default function EditUserPasswordForm({
client: remoteProjectGQLClient,
});
const { closeDialog } = useDialog();
const { currentProject } = useCurrentWorkspaceAndProject();
const { data } = useGetSignInMethodsQuery({
variables: { appId: currentProject?.id },
skip: !currentProject?.id,
});
const passwordMinLength =
data?.config?.auth?.method?.emailPassword?.passwordMinLength || 1;
const validationSchema = Yup.object({
password: Yup.string()
.label('Password')
.min(
passwordMinLength,
`Password must be at least ${passwordMinLength} characters long.`,
)
.required('This field is required.'),
cpassword: Yup.string()
.label('Password Confirmation')
.min(
passwordMinLength,
`Password must be at least ${passwordMinLength} characters long.`,
)
.oneOf([Yup.ref('password')], 'Passwords do not match')
.required('This field is required.'),
});
const [editUserPasswordFormError, setEditUserPasswordFormError] =
useState<Error | null>(null);
const form = useForm<EditUserPasswordFormValues>({
const form = useForm<Yup.InferType<typeof validationSchema>>({
defaultValues: {},
reValidateMode: 'onSubmit',
resolver: yupResolver(validationSchema),
});
const handleSubmit = async ({ password }: EditUserPasswordFormValues) => {
const handleSubmit = async ({
password,
}: Yup.InferType<typeof validationSchema>) => {
setEditUserPasswordFormError(null);
const passwordHash = await bcrypt.hash(password, 10);
const updateUserPasswordPromise = updateUser({
variables: {
id: user.id,
user: {
passwordHash,
},
user: { passwordHash },
},
client: remoteProjectGQLClient,
});

View File

@@ -3,6 +3,7 @@ import { Button } from '@/components/ui/v2/Button';
import { Text } from '@/components/ui/v2/Text';
import hasuraMetadataQuery from '@/tests/msw/mocks/rest/hasuraMetadataQuery';
import tableQuery from '@/tests/msw/mocks/rest/tableQuery';
import tokenQuery from '@/tests/msw/mocks/rest/tokenQuery';
import type { ComponentMeta, ComponentStory } from '@storybook/react';
import { useState } from 'react';
import { FormProvider, useForm } from 'react-hook-form';
@@ -34,7 +35,7 @@ const defaultParameters = {
},
},
msw: {
handlers: [tableQuery, hasuraMetadataQuery],
handlers: [tokenQuery, tableQuery, hasuraMetadataQuery],
},
};

View File

@@ -187,11 +187,11 @@ export default async function fetchTable({
const queryError = responseData as QueryError;
const schemaNotFound =
POSTGRESQL_ERROR_CODES.SCHEMA_NOT_FOUND ===
queryError.internal.error.status_code;
queryError.internal?.error?.status_code;
const tableNotFound =
POSTGRESQL_ERROR_CODES.TABLE_NOT_FOUND ===
queryError.internal.error.status_code;
queryError.internal?.error?.status_code;
if (schemaNotFound || tableNotFound) {
return {
@@ -203,7 +203,7 @@ export default async function fetchTable({
}
if (
queryError.internal.error.status_code ===
queryError.internal?.error?.status_code ===
POSTGRESQL_ERROR_CODES.COLUMNS_NOT_FOUND
) {
return {
@@ -214,7 +214,7 @@ export default async function fetchTable({
};
}
throw new Error(queryError.internal.error.message);
throw new Error(queryError.internal?.error?.message);
}
if ('error' in responseData) {

View File

@@ -31,6 +31,8 @@ export type DatabaseServiceVersionFormValues = Yup.InferType<
>;
const AVAILABLE_POSTGRES_VERSIONS = [
'14.6-20230705-1',
'14.6-20230613-1',
'14.6-20230525',
'14.6-20230406-2',
'14.6-20230406-1',

View File

@@ -1,3 +1,4 @@
import tokenQuery from '@/tests/msw/mocks/rest/tokenQuery';
import { render, screen, waitFor } from '@/tests/testUtils';
import { graphql } from 'msw';
import { setupServer } from 'msw/node';
@@ -5,6 +6,7 @@ import { beforeAll, expect, test } from 'vitest';
import HasuraCorsDomainSettings from './HasuraCorsDomainSettings';
const server = setupServer(
tokenQuery,
graphql.query('GetHasuraSettings', (_req, res, ctx) =>
res(
ctx.data({
@@ -15,7 +17,14 @@ const server = setupServer(
version: 'v2.25.1-ce',
settings: {
corsDomain: ['*'],
enableAllowList: false,
enableRemoteSchemaPermissions: false,
enableConsole: false,
devMode: false,
enabledAPIs: [],
},
logs: [],
events: [],
},
},
}),
@@ -56,7 +65,14 @@ test('should enable switch by default when CORS domain is set to one or more dom
version: 'v2.25.1-ce',
settings: {
corsDomain: ['https://example.com', 'https://*.example.com'],
enableAllowList: false,
enableRemoteSchemaPermissions: false,
enableConsole: false,
devMode: false,
enabledAPIs: [],
},
logs: [],
events: [],
},
},
}),

View File

@@ -31,6 +31,8 @@ export type HasuraServiceVersionFormValues = Yup.InferType<
>;
const AVAILABLE_HASURA_VERSIONS = [
'v2.29.0-ce',
'v2.28.2-ce',
'v2.27.0-ce',
'v2.25.1-ce',
'v2.25.0-ce',

View File

@@ -3,7 +3,7 @@ import type { Project, Workspace } from '@/types/application';
import { ApplicationStatus } from '@/types/application';
import { getHasuraAdminSecret } from '@/utils/env';
import { GetWorkspaceAndProjectDocument } from '@/utils/__generated__/graphql';
import { useNhostClient, useUserData } from '@nhost/nextjs';
import { useAuthenticationStatus, useNhostClient } from '@nhost/nextjs';
import type { RefetchOptions } from '@tanstack/react-query';
import { useQuery } from '@tanstack/react-query';
import { useRouter } from 'next/router';
@@ -34,14 +34,24 @@ export interface UseCurrentWorkspaceAndProjectReturnType {
export default function useCurrentWorkspaceAndProject(): UseCurrentWorkspaceAndProjectReturnType {
const client = useNhostClient();
const user = useUserData();
const isPlatform = useIsPlatform();
const { isAuthenticated, isLoading: isAuthLoading } =
useAuthenticationStatus();
const {
query: { workspaceSlug, appSlug },
isReady,
isReady: isRouterReady,
} = useRouter();
const isWorkspaceSlugAvailable = Boolean(workspaceSlug);
const shouldFetchWorkspaceAndProject =
isPlatform &&
isRouterReady &&
isWorkspaceSlugAvailable &&
isAuthenticated &&
!isAuthLoading;
// We can't use the hook exported by the codegen here because there are cases
// where it doesn't target the Nhost backend, but the currently active project
// instead.
@@ -59,7 +69,7 @@ export default function useCurrentWorkspaceAndProject(): UseCurrentWorkspaceAndP
}),
{
keepPreviousData: true,
enabled: isPlatform && isReady && !!workspaceSlug && !!user,
enabled: shouldFetchWorkspaceAndProject,
// multiple components are relying on this query, so we don't want to
// refetch it too often - kind of a hack, should be improved later
staleTime: 1000,
@@ -142,7 +152,7 @@ export default function useCurrentWorkspaceAndProject(): UseCurrentWorkspaceAndP
return {
currentWorkspace,
currentProject,
loading: response ? false : isFetching,
loading: response ? false : isFetching || isAuthLoading,
error: response?.error
? new Error(error?.message || 'Unknown error occurred.')
: null,

View File

@@ -1,4 +1,3 @@
import type { ProjectFragment } from '@/utils/__generated__/graphql';
import {
getAuthServiceUrl,
getDatabaseServiceUrl,
@@ -8,6 +7,7 @@ import {
getStorageServiceUrl,
isPlatform,
} from '@/utils/env';
import type { ProjectFragment } from '@/utils/__generated__/graphql';
export type NhostService =
| 'auth'

View File

@@ -123,7 +123,7 @@ export default function SystemEnvironmentVariableSettings() {
return (
<SettingsContainer
title="System Environment Variables"
description="Environment Variables are key-value pairs configured outside your source code. They are used to store environment-specific values such as API keys."
description="System environment variables are automatically generated from the configuration file and your project's subdomain and region."
docsLink="https://docs.nhost.io/platform/environment-variables#system-environment-variables"
rootClassName="gap-0"
className="mt-2 mb-2.5 px-0"

View File

@@ -1,4 +1,5 @@
import { mockApplication, mockWorkspace } from '@/tests/mocks';
import tokenQuery from '@/tests/msw/mocks/rest/tokenQuery';
import { queryClient, render, screen } from '@/tests/testUtils';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
@@ -34,6 +35,7 @@ vi.mock('next/router', () => ({
}));
const server = setupServer(
tokenQuery,
rest.get('https://local.graphql.nhost.run/v1', (_req, res, ctx) =>
res(ctx.status(200)),
),
@@ -135,6 +137,7 @@ test('should render an empty state when GitHub is connected, but there are no de
test('should render a list of deployments', async () => {
server.use(
tokenQuery,
rest.post('https://local.graphql.nhost.run/v1', async (_req, res, ctx) => {
const { operationName } = await _req.json();
@@ -194,6 +197,7 @@ test('should render a list of deployments', async () => {
test('should disable redeployments if a deployment is already in progress', async () => {
server.use(
tokenQuery,
rest.post('https://local.graphql.nhost.run/v1', async (req, res, ctx) => {
const { operationName } = await req.json();

View File

@@ -9,6 +9,7 @@ import {
resourcesUpdatedQuery,
} from '@/tests/msw/mocks/graphql/resourceSettingsQuery';
import updateConfigMutation from '@/tests/msw/mocks/graphql/updateConfigMutation';
import tokenQuery from '@/tests/msw/mocks/rest/tokenQuery';
import {
fireEvent,
render,
@@ -35,6 +36,7 @@ vi.mock('next/router', () => ({
}));
const server = setupServer(
tokenQuery,
resourcesAvailableQuery,
getProPlanOnlyQuery,
getWorkspaceAndProjectQuery,

View File

@@ -88,6 +88,7 @@ export const mockWorkspace: Workspace = {
slug: 'test-workspace',
workspaceMembers: [],
projects: [mockApplication],
creatorUserId: '1',
};
export const mockSession: NhostSession = {

View File

@@ -1,7 +1,7 @@
import { rest } from 'msw';
const hasuraMetadataQuery = rest.post(
'http://localhost:8080/v1/metadata',
'https://local.hasura.nhost.run/v1/metadata',
(_req, res, ctx) =>
res(
ctx.delay(250),

View File

@@ -1,7 +1,7 @@
import { rest } from 'msw';
const tableQuery = rest.post(
'http://localhost:8080/v2/query',
'https://local.hasura.nhost.run/v2/query',
async (req, res, ctx) => {
const body = await req.json();

View File

@@ -0,0 +1,32 @@
import { faker } from '@faker-js/faker';
import type { NhostSession } from '@nhost/nextjs';
import { rest } from 'msw';
const tokenQuery = rest.post(
`https://local.auth.nhost.run/v1/token`,
(_req, res, ctx) =>
res(
ctx.json<NhostSession>({
accessToken: faker.datatype.string(40),
refreshToken: faker.datatype.uuid(),
accessTokenExpiresIn: 900,
user: {
id: faker.datatype.uuid(),
createdAt: faker.date.past().toUTCString(),
displayName: `${faker.name.firstName()} ${faker.name.lastName()}`,
avatarUrl: faker.internet.avatar(),
locale: 'en',
isAnonymous: false,
emailVerified: true,
defaultRole: 'user',
roles: ['user', 'me'],
phoneNumber: null,
phoneNumberVerified: false,
activeMfaType: null,
metadata: {},
},
}),
),
);
export default tokenQuery;

View File

@@ -32,13 +32,13 @@ process.env = {
NODE_ENV: 'development',
NEXT_PUBLIC_NHOST_PLATFORM: 'false',
NEXT_PUBLIC_ENV: 'dev',
NEXT_PUBLIC_NHOST_AUTH_URL: 'https://localdev.nhost.run/v1/auth',
NEXT_PUBLIC_NHOST_FUNCTIONS_URL: 'https://localdev.nhost.run/v1/functions',
NEXT_PUBLIC_NHOST_GRAPHQL_URL: 'https://localdev.nhost.run/v1/graphql',
NEXT_PUBLIC_NHOST_STORAGE_URL: 'https://localdev.nhost.run/v1/storage',
NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL: 'http://localhost:9695',
NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL: 'http://localhost:9693',
NEXT_PUBLIC_NHOST_HASURA_API_URL: 'http://localhost:8080',
NEXT_PUBLIC_NHOST_AUTH_URL: 'https://local.auth.nhost.run/v1',
NEXT_PUBLIC_NHOST_FUNCTIONS_URL: 'https://local.functions.nhost.run/v1',
NEXT_PUBLIC_NHOST_GRAPHQL_URL: 'https://local.graphql.nhost.run/v1',
NEXT_PUBLIC_NHOST_STORAGE_URL: 'https://local.storage.nhost.run/v1',
NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL: 'https://local.hasura.nhost.run',
NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL: 'https://local.hasura.nhost.run',
NEXT_PUBLIC_NHOST_HASURA_API_URL: 'https://local.hasura.nhost.run',
};
export const queryClient = new QueryClient({

View File

@@ -33,5 +33,5 @@
"incremental": true
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules", ".nhost", "nhost", "functions"]
"exclude": ["node_modules", ".nhost", "nhost", "functions", "playwright.config.ts"]
}

View File

@@ -1,5 +1,29 @@
# @nhost/docs
## 0.4.0
### Minor Changes
- c6fa8da6d: fix(docs): remove outdated reference/cli
## 0.3.5
### Patch Changes
- 923abd365: chore(deps): update dependency @tsconfig/docusaurus to v2
## 0.3.4
### Patch Changes
- a5305e6b5: docs: update old URLs to the new format
## 0.3.3
### Patch Changes
- cc02902cb: chore(docs): update environment variable documentation
## 0.3.2
### Patch Changes

View File

@@ -63,8 +63,8 @@ Follow this guide to sign in users with Apple.
- Click the checkbox to enable "Sign in with Apple".
- Click **Configure** next to "Sign in with Apple".
- Make sure your newly created Bundle ID is selected under Primary App ID.
- Add your base auth domain under "Domains and Subdomains". E.g. `<subdomain>.nhost.run`.
- Add the full callback URL under "Return URLs". E.g. `https://<subdomain>.nhost.run/v1/auth/signin/provider/apple/callback`.
- Add your base auth domain under "Domains and Subdomains". E.g. `<subdomain>.auth.<region>.nhost.run`.
- Add the full callback URL under "Return URLs". E.g. `https://<subdomain>.auth.<region>.nhost.run/v1/signin/provider/apple/callback`.
- Click **Next**.
- Click **Done**.
- Click **Continue** in the top right corner.

View File

@@ -35,4 +35,4 @@ sudo nhost sw upgrade
- [Local Development](/cli/local-development)
- [Migrate to Nhost Config](/cli/migrate-config)
- [Multiple Projects in Parallel](/cli/multiple-projects)
- [CLI commands reference](/reference/cli)
- [CLI Documentation](/cli)

View File

@@ -138,13 +138,21 @@ export default server
Add `STRIPE_SECRET_KEY` as an environment variable.
If you're using Nhost, add `STRIPE_SECRET_KEY` to `.env.development` like this:
If you're using Nhost, add `STRIPE_SECRET_KEY` to `nhost.toml` like this:
```
[[ global.environment ]]
name=STRIPE_SECRET_KEY
value='{{ secrets.STRIPE_SECRET_KEY }}'
```
And then add to your `.secrets` file:
```
STRIPE_SECRET_KEY=sk_test_***
```
And add the production key (`sk_live_***`) to [environment variables](/platform/environment-variables) in the Nhost dashboard.
In production set your secret with your stripe production key (`sk_live_***`) in the Nhost dashboard.
Learn more about [Stripe API keys](https://stripe.com/docs/keys#obtain-api-keys).

View File

@@ -6,10 +6,6 @@ image: /img/og/platform/environment-variables.png
Environment Variables are key-value pairs configured outside your source code. They are used to store environment-specific values such as API keys.
You can manage your project's Environment Variables in Nhost Dashboard under **Variables**. When you define a new variable, you can set one value for **production** and one for **development**.
![Environment Variables](/img/platform/environment-variables/environment-variables.png)
Environment Variables are available for:
- [Hasura GraphQL Engine](/graphql)
@@ -17,13 +13,44 @@ Environment Variables are available for:
When an Environment Variable has updated the changes happen immediately for Hasura GraphQL Engine. For Serverless Functions, a new deployment via [Git](/platform/git) is required.
## Custom Environment Variables
You can manage your project's Environment Variables in the Nhost Dashboard or by using the configuration file.
### Dashboard
![Environment Variables](/img/platform/environment-variables/environment-variables.png)
Environment Variables can be managed in the Nhost Dashboard under **Settings** &rarr; **Environment Variables**.
### Configuration File
Environment Variables can also be managed by adding new `[[global.environment]]` sections to the `nhost.toml` file.
```toml
[global]
[[global.environment]]
name = 'MY_ENV_VAR'
value = '<first-value>'
[[global.environment]]
name = 'MY_OTHER_ENV_VAR'
value = '<second-value>'
# ... omitted for brevity
```
These environment variables will also be available on the Nhost Dashboard after committing and pushing the changes to your Git repository.
## System Environment Variables
System Environment Variables are automatically available in production and during local development. The following system Environment Variables are available:
System environment variables are automatically generated from the configuration file and your project's subdomain and region.
The following system environment variables are available:
- `NHOST_ADMIN_SECRET`
- `NHOST_WEBHOOK_SECRET`
- `NHOST_BACKEND_URL` ([deprecated](https://github.com/nhost/nhost/discussions/1319))
- ~~`NHOST_BACKEND_URL`~~ ([deprecated](https://github.com/nhost/nhost/discussions/1319))
- `NHOST_SUBDOMAIN`
- `NHOST_REGION`
- `NHOST_HASURA_URL`
@@ -33,7 +60,9 @@ System Environment Variables are automatically available in production and durin
- `NHOST_FUNCTIONS_URL`
- `NHOST_JWT_SECRET`
Example values:
`NHOST_ADMIN_SECRET`, `NHOST_WEBHOOK_SECRET` and `NHOST_JWT_SECRET` are populated with values from the configuration file. The rest of the system environment variables are populated with values from your project's subdomain and region.
**Example values**:
```text
NHOST_ADMIN_SECRET=e7w36ag287qn5qry795f6ymm57qgvqup
@@ -58,10 +87,3 @@ NHOST_FUNCTIONS_URL=https://abc123abc.functions.eu-central-1.nhost.run/v1
NHOST_JWT_SECRET={"type": "HS256", "key": "vumpbe2w2mgaqj5yqfp7dvxu6kywtvsgb68ejpdaqxerea8jwrsszdp2dhkjxsh4df69pzm3ja6ukedx8ja43zdt6q9kgbgg2w9vh2sedeppukud9a2qzy29v3afdn7m"}
```
## Development Environment Variables
When developing locally using the [CLI](/cli), Environment Variables set in `.env.development` are available in your local environment. There are two ways to manage them:
1. Edit the `.env.development` file manually.
2. Add development Environment Variables in the Nhost Dashboard and use `nhost env pull` to sync them. This way, your team members will also have access to the same Environment Variables.

View File

@@ -1,16 +0,0 @@
---
title: 'down'
sidebar_position: 3
---
Delete all containers created by `nhost up`
```bash
nhost down
```
To delete all containers **and the local database**, append `--data` to the command.
```bash
nhost down --data
```

View File

@@ -1,22 +0,0 @@
---
title: 'Global Flags'
sidebar_position: 9
---
### `--debug`, `-d`
Turn on debug output.
```bash
nhost up --debug
nhost init -d
```
### `--log-file`, `-f`
Save output to a given file.
```bash
nhost up -d --log-file some-file.txt
nhost logs -f some-file.txt
```

View File

@@ -1,6 +0,0 @@
---
title: 'CLI'
sidebar_position: 1
---
This section is a reference for the commands available in the [Nhost CLI](/cli).

View File

@@ -1,24 +0,0 @@
---
title: 'init'
sidebar_position: 1
---
Initialize a local Nhost project.
```
nhost init
```
If you have an existing Nhost project in Nhost Cloud that you want to use as a starting point for local development and for the [Git-based workflow](/platform/git), run `nhost init --remote`.
The `nhost init --remote` command does the following:
- Creates a new local Nhost project.
- Pulls the database migrations and Hasura metadata from the Nhost Cloud project.
- Resets the remote Nhost Cloud project's database migrations.
:::warning
The `nhost init --remote` command should only be run **once**. Running it multiple times will reset the remote Nhost Cloud project's database migrations which can cause migration conflict issues in your development team.
:::

View File

@@ -1,10 +0,0 @@
---
title: 'link'
sidebar_position: 4
---
Link the local Nhost project in your working directory to a project in Nhost Cloud.
```bash
nhost link
```

View File

@@ -1,10 +0,0 @@
---
title: 'list'
sidebar_position: 7
---
List projects in Nhost Cloud.
```bash
nhost list
```

View File

@@ -1,10 +0,0 @@
---
title: 'login'
sidebar_position: 5
---
Authenticate the CLI with your Nhost user.
```bash
nhost login
```

View File

@@ -1,10 +0,0 @@
---
title: 'logout'
sidebar_position: 6
---
Remove authentication for the CLI.
```bash
nhost logout
```

View File

@@ -1,10 +0,0 @@
---
title: 'logs'
sidebar_position: 9
---
View logs of all services.
```bash
nhost logs
```

View File

@@ -1,19 +0,0 @@
---
title: 'up'
sidebar_position: 2
---
To launch the development environment for your project, use the command `nhost up`. Once the environment is running, this command will
- Apply database migrations.
- Apply Hasura metadata.
```bash
nhost up
```
If it's the first time you start the project, [seed data](/database#seed-data) will be applied.
## Stop
Use `ctrl+c` to stop the development environment.

View File

@@ -1,10 +0,0 @@
---
title: 'upgrade'
sidebar_position: 8
---
Upgrade the CLI to the latest version.
```bash
nhost upgrade
```

View File

@@ -30,7 +30,3 @@ In this section:
- [Getting started](/reference/vue)
- [Protecting routes](/reference/vue/protecting-routes)
- [Apollo GraphQL](/reference/vue/apollo)
### Nhost CLI
- [CLI overview](/reference/cli)

View File

@@ -69,12 +69,12 @@ HTTP endpoints are automatically generated based on the file structure inside `f
Here's an example of four Serverless Functions with their files and their HTTP endpoints:
| File | HTTP Endpoint |
| --------------------------- | ----------------------------------------------------------------- |
| `functions/index.js` | `https://[project-subdomain].nhost.run/v1/functions/` |
| `functions/users/index.ts` | `https://[project-subdomain].nhost.run/v1/functions/users` |
| `functions/users/active.ts` | `https://[project-subdomain].nhost.run/v1/functions/users/active` |
| `functions/my-company.js` | `https://[project-subdomain].nhost.run/v1/functions/my-company` |
| File | HTTP Endpoint |
| --------------------------- | ------------------------------------------------------------------ |
| `functions/index.js` | `https://[subdomain].functions.[region].nhost.run/v1/` |
| `functions/users/index.ts` | `https://[subdomain].functions.[region].nhost.run/v1/users` |
| `functions/users/active.ts` | `https://[subdomain].functions.[region].nhost.run/v1/users/active` |
| `functions/my-company.js` | `https://[subdomain].functions.[region].nhost.run/v1/my-company` |
You can prepend files and folders with an underscore (`_`) to prevent them from being treated as Serverless Functions and
be turned into HTTP endpoints. This is useful if you have, for example, a utils file (`functions/_utils.js`) or a utils-f

View File

@@ -48,7 +48,7 @@ Learn more about [`upload()`](/reference/javascript/storage/upload).
<TabItem value="http" label="HTTP" default>
```http
POST /v1/storage/files HTTP/1.1
POST https://local.storage.nhost.run/v1/files HTTP/1.1
```
</TabItem>
@@ -80,7 +80,7 @@ Learn more about [`getPublicUrl()`](/reference/javascript/storage/get-public-url
<TabItem value="http" label="HTTP" default>
```http
GET /v1/storage/files/{file_id} HTTP/1.1
GET https://local.storage.nhost.run/v1/files/{file_id} HTTP/1.1
```
</TabItem>
@@ -109,7 +109,7 @@ Learn more about [`getPresignedUrl()`](/reference/javascript/storage/get-presign
<TabItem value="http" label="HTTP" default>
```http
GET /v1/storage/files/{file_id}/presignedurl HTTP/1.1
GET https://local.storage.nhost.run/v1/files/{file_id}/presignedurl HTTP/1.1
```
</TabItem>
@@ -132,7 +132,7 @@ Learn more about [`delete()`](/reference/javascript/storage/delete).
<TabItem value="http" label="HTTP" default>
```http
DELETE /v1/storage/files/{file_id} HTTP/1.1
DELETE https://local.storage.nhost.run/v1/files/{file_id} HTTP/1.1
```
</TabItem>
@@ -193,7 +193,7 @@ Image Transformation works on both public and pre-signed URLs.
**Example**: Transform an image to 500px width (`?w=500`):
```text
https://[subdomain].nhost.run/v1/storage/files/08e6fa32-0880-4d0e-a832-278198acb363?w=500
https://[subdomain].storage.[region].nhost.run/v1/files/08e6fa32-0880-4d0e-a832-278198acb363?w=500
```
## Example: CRM System

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/docs",
"version": "0.3.2",
"version": "0.4.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
@@ -31,7 +31,7 @@
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.4.1",
"@tsconfig/docusaurus": "^1.0.6",
"@tsconfig/docusaurus": "^2.0.0",
"typescript": "^4.8.4"
},
"browserslist": {

View File

@@ -183,23 +183,6 @@ const sidebars = {
dirName: 'reference/docgen/vue/content'
}
]
},
{
type: 'category',
label: 'CLI',
link: { type: 'doc', id: 'reference/cli/index' },
items: [
'reference/cli/init',
'reference/cli/up',
'reference/cli/down',
'reference/cli/link',
'reference/cli/login',
'reference/cli/logout',
'reference/cli/list',
'reference/cli/upgrade',
'reference/cli/logs',
'reference/cli/global-flags'
]
}
]
}

View File

@@ -1,5 +1,14 @@
# @nhost-examples/codegen-react-apollo
## 0.1.10
### Patch Changes
- b3b64a3b7: chore(deps): bump `@types/react` to `v18.2.14` and `@types/react-dom` to `v18.2.6`
- Updated dependencies [b3b64a3b7]
- @nhost/react-apollo@5.0.29
- @nhost/react@2.0.25
## 0.1.9
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/codegen-react-apollo",
"version": "0.1.9",
"version": "0.1.10",
"private": true,
"scripts": {
"codegen": "graphql-codegen",
@@ -29,8 +29,8 @@
"@graphql-typed-document-node/core": "^3.1.1",
"@tailwindcss/forms": "^0.5.3",
"@types/node": "^18.11.9",
"@types/react": "^18.0.34",
"@types/react-dom": "^18.0.11",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@vitejs/plugin-react": "^3.0.0",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.19",

View File

@@ -1,5 +1,13 @@
# @nhost-examples/codegen-react-query
## 0.1.11
### Patch Changes
- b3b64a3b7: chore(deps): bump `@types/react` to `v18.2.14` and `@types/react-dom` to `v18.2.6`
- Updated dependencies [b3b64a3b7]
- @nhost/react@2.0.25
## 0.1.10
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/codegen-react-query",
"version": "0.1.10",
"version": "0.1.11",
"private": true,
"scripts": {
"codegen": "graphql-codegen",
@@ -30,8 +30,8 @@
"@graphql-typed-document-node/core": "^3.1.1",
"@tailwindcss/forms": "^0.5.3",
"@types/node": "^16.11.56",
"@types/react": "^18.0.34",
"@types/react-dom": "^18.0.11",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"autoprefixer": "^10.4.13",
"eslint": "^8.23.0",
"postcss": "^8.4.20",

View File

@@ -1,5 +1,14 @@
# @nhost-examples/react-urql
## 0.0.7
### Patch Changes
- b3b64a3b7: chore(deps): bump `@types/react` to `v18.2.14` and `@types/react-dom` to `v18.2.6`
- Updated dependencies [b3b64a3b7]
- @nhost/react-urql@2.0.26
- @nhost/react@2.0.25
## 0.0.6
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"name": "@nhost-examples/codegen-react-urql",
"private": true,
"version": "0.0.6",
"version": "0.0.7",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
@@ -23,8 +23,8 @@
"@graphql-typed-document-node/core": "^3.1.1",
"@tailwindcss/forms": "^0.5.3",
"@types/node": "^16.11.7",
"@types/react": "^18.0.34",
"@types/react-dom": "^18.0.11",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@vitejs/plugin-react": "^3.0.0",
"autoprefixer": "^10.4.13",
"postcss": "^8.4.19",

View File

@@ -1,5 +1,15 @@
# @nhost-examples/nextjs
## 0.1.12
### Patch Changes
- b3b64a3b7: chore(deps): bump `@types/react` to `v18.2.14` and `@types/react-dom` to `v18.2.6`
- Updated dependencies [b3b64a3b7]
- @nhost/react-apollo@5.0.29
- @nhost/react@2.0.25
- @nhost/nextjs@1.13.31
## 0.1.11
### Patch Changes

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/nextjs",
"version": "0.1.11",
"version": "0.1.12",
"private": true,
"scripts": {
"dev": "next dev",
@@ -32,7 +32,7 @@
"devDependencies": {
"@next/bundle-analyzer": "^12.2.5",
"@types/node": "^16.11.7",
"@types/react": "18.0.34",
"@types/react": "^18.2.14",
"@xstate/inspect": "^0.6.2",
"eslint-config-next": "12.0.10",
"typescript": "^4.8.2",

View File

@@ -1 +1,3 @@
.secrets.nhost
.secrets
.nhost
cat.jpg

View File

@@ -1,5 +1,19 @@
# @nhost-examples/node-storage
## 0.0.4
### Patch Changes
- d54e4cdd4: fix(buckets): allow using custom buckets for upload
- @nhost/nhost-js@2.2.12
## 0.0.3
### Patch Changes
- 2cdb13b3e: fix(upload): allow specifying `id` and `name` only when not using `form-data`
- @nhost/nhost-js@2.2.11
## 0.0.2
### Patch Changes

View File

@@ -26,5 +26,4 @@ You can use the `.env.example` file as a starting point.
pnpm start
```
The example will download a file from a public URL and upload it to your Nhost
Storage bucket.
The example will run a few upload operations and then exit.

View File

@@ -0,0 +1,6 @@
actions: []
custom_types:
enums: []
input_objects: []
objects: []
scalars: []

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,14 @@
- name: default
kind: postgres
configuration:
connection_info:
database_url:
from_env: HASURA_GRAPHQL_DATABASE_URL
isolation_level: read-committed
pool_settings:
connection_lifetime: 600
idle_timeout: 180
max_connections: 50
retries: 1
use_prepared_statements: true
tables: "!include default/tables/tables.yaml"

View File

@@ -0,0 +1,23 @@
table:
name: provider_requests
schema: auth
configuration:
column_config:
id:
custom_name: id
options:
custom_name: options
custom_column_names:
id: id
options: options
custom_name: authProviderRequests
custom_root_fields:
delete: deleteAuthProviderRequests
delete_by_pk: deleteAuthProviderRequest
insert: insertAuthProviderRequests
insert_one: insertAuthProviderRequest
select: authProviderRequests
select_aggregate: authProviderRequestsAggregate
select_by_pk: authProviderRequest
update: updateAuthProviderRequests
update_by_pk: updateAuthProviderRequest

View File

@@ -0,0 +1,28 @@
table:
name: providers
schema: auth
configuration:
column_config:
id:
custom_name: id
custom_column_names:
id: id
custom_name: authProviders
custom_root_fields:
delete: deleteAuthProviders
delete_by_pk: deleteAuthProvider
insert: insertAuthProviders
insert_one: insertAuthProvider
select: authProviders
select_aggregate: authProvidersAggregate
select_by_pk: authProvider
update: updateAuthProviders
update_by_pk: updateAuthProvider
array_relationships:
- name: userProviders
using:
foreign_key_constraint_on:
column: provider_id
table:
name: user_providers
schema: auth

View File

@@ -0,0 +1,26 @@
table:
name: refresh_token_types
schema: auth
is_enum: true
configuration:
column_config: {}
custom_column_names: {}
custom_name: authRefreshTokenTypes
custom_root_fields:
delete: deleteAuthRefreshTokenTypes
delete_by_pk: deleteAuthRefreshTokenType
insert: insertAuthRefreshTokenTypes
insert_one: insertAuthRefreshTokenType
select: authRefreshTokenTypes
select_aggregate: authRefreshTokenTypesAggregate
select_by_pk: authRefreshTokenType
update: updateAuthRefreshTokenTypes
update_by_pk: updateAuthRefreshTokenType
array_relationships:
- name: refreshTokens
using:
foreign_key_constraint_on:
column: type
table:
name: refresh_tokens
schema: auth

View File

@@ -0,0 +1,55 @@
table:
name: refresh_tokens
schema: auth
configuration:
column_config:
created_at:
custom_name: createdAt
expires_at:
custom_name: expiresAt
refresh_token_hash:
custom_name: refreshTokenHash
user_id:
custom_name: userId
custom_column_names:
created_at: createdAt
expires_at: expiresAt
refresh_token_hash: refreshTokenHash
user_id: userId
custom_name: authRefreshTokens
custom_root_fields:
delete: deleteAuthRefreshTokens
delete_by_pk: deleteAuthRefreshToken
insert: insertAuthRefreshTokens
insert_one: insertAuthRefreshToken
select: authRefreshTokens
select_aggregate: authRefreshTokensAggregate
select_by_pk: authRefreshToken
update: updateAuthRefreshTokens
update_by_pk: updateAuthRefreshToken
object_relationships:
- name: user
using:
foreign_key_constraint_on: user_id
select_permissions:
- role: user
permission:
columns:
- id
- created_at
- expires_at
- metadata
- type
- user_id
filter:
user_id:
_eq: X-Hasura-User-Id
delete_permissions:
- role: user
permission:
filter:
_and:
- user_id:
_eq: X-Hasura-User-Id
- type:
_eq: pat

View File

@@ -0,0 +1,35 @@
table:
name: roles
schema: auth
configuration:
column_config:
role:
custom_name: role
custom_column_names:
role: role
custom_name: authRoles
custom_root_fields:
delete: deleteAuthRoles
delete_by_pk: deleteAuthRole
insert: insertAuthRoles
insert_one: insertAuthRole
select: authRoles
select_aggregate: authRolesAggregate
select_by_pk: authRole
update: updateAuthRoles
update_by_pk: updateAuthRole
array_relationships:
- name: userRoles
using:
foreign_key_constraint_on:
column: role
table:
name: user_roles
schema: auth
- name: usersByDefaultRole
using:
foreign_key_constraint_on:
column: default_role
table:
name: users
schema: auth

View File

@@ -0,0 +1,48 @@
table:
name: user_providers
schema: auth
configuration:
column_config:
access_token:
custom_name: accessToken
created_at:
custom_name: createdAt
id:
custom_name: id
provider_id:
custom_name: providerId
provider_user_id:
custom_name: providerUserId
refresh_token:
custom_name: refreshToken
updated_at:
custom_name: updatedAt
user_id:
custom_name: userId
custom_column_names:
access_token: accessToken
created_at: createdAt
id: id
provider_id: providerId
provider_user_id: providerUserId
refresh_token: refreshToken
updated_at: updatedAt
user_id: userId
custom_name: authUserProviders
custom_root_fields:
delete: deleteAuthUserProviders
delete_by_pk: deleteAuthUserProvider
insert: insertAuthUserProviders
insert_one: insertAuthUserProvider
select: authUserProviders
select_aggregate: authUserProvidersAggregate
select_by_pk: authUserProvider
update: updateAuthUserProviders
update_by_pk: updateAuthUserProvider
object_relationships:
- name: provider
using:
foreign_key_constraint_on: provider_id
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -0,0 +1,36 @@
table:
name: user_roles
schema: auth
configuration:
column_config:
created_at:
custom_name: createdAt
id:
custom_name: id
role:
custom_name: role
user_id:
custom_name: userId
custom_column_names:
created_at: createdAt
id: id
role: role
user_id: userId
custom_name: authUserRoles
custom_root_fields:
delete: deleteAuthUserRoles
delete_by_pk: deleteAuthUserRole
insert: insertAuthUserRoles
insert_one: insertAuthUserRole
select: authUserRoles
select_aggregate: authUserRolesAggregate
select_by_pk: authUserRole
update: updateAuthUserRoles
update_by_pk: updateAuthUserRole
object_relationships:
- name: roleByRole
using:
foreign_key_constraint_on: role
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -0,0 +1,33 @@
table:
name: user_security_keys
schema: auth
configuration:
column_config:
credential_id:
custom_name: credentialId
credential_public_key:
custom_name: credentialPublicKey
id:
custom_name: id
user_id:
custom_name: userId
custom_column_names:
credential_id: credentialId
credential_public_key: credentialPublicKey
id: id
user_id: userId
custom_name: authUserSecurityKeys
custom_root_fields:
delete: deleteAuthUserSecurityKeys
delete_by_pk: deleteAuthUserSecurityKey
insert: insertAuthUserSecurityKeys
insert_one: insertAuthUserSecurityKey
select: authUserSecurityKeys
select_aggregate: authUserSecurityKeysAggregate
select_by_pk: authUserSecurityKey
update: updateAuthUserSecurityKeys
update_by_pk: updateAuthUserSecurityKey
object_relationships:
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -0,0 +1,122 @@
table:
name: users
schema: auth
configuration:
column_config:
active_mfa_type:
custom_name: activeMfaType
avatar_url:
custom_name: avatarUrl
created_at:
custom_name: createdAt
default_role:
custom_name: defaultRole
disabled:
custom_name: disabled
display_name:
custom_name: displayName
email:
custom_name: email
email_verified:
custom_name: emailVerified
id:
custom_name: id
is_anonymous:
custom_name: isAnonymous
last_seen:
custom_name: lastSeen
locale:
custom_name: locale
new_email:
custom_name: newEmail
otp_hash:
custom_name: otpHash
otp_hash_expires_at:
custom_name: otpHashExpiresAt
otp_method_last_used:
custom_name: otpMethodLastUsed
password_hash:
custom_name: passwordHash
phone_number:
custom_name: phoneNumber
phone_number_verified:
custom_name: phoneNumberVerified
ticket:
custom_name: ticket
ticket_expires_at:
custom_name: ticketExpiresAt
totp_secret:
custom_name: totpSecret
updated_at:
custom_name: updatedAt
webauthn_current_challenge:
custom_name: currentChallenge
custom_column_names:
active_mfa_type: activeMfaType
avatar_url: avatarUrl
created_at: createdAt
default_role: defaultRole
disabled: disabled
display_name: displayName
email: email
email_verified: emailVerified
id: id
is_anonymous: isAnonymous
last_seen: lastSeen
locale: locale
new_email: newEmail
otp_hash: otpHash
otp_hash_expires_at: otpHashExpiresAt
otp_method_last_used: otpMethodLastUsed
password_hash: passwordHash
phone_number: phoneNumber
phone_number_verified: phoneNumberVerified
ticket: ticket
ticket_expires_at: ticketExpiresAt
totp_secret: totpSecret
updated_at: updatedAt
webauthn_current_challenge: currentChallenge
custom_name: users
custom_root_fields:
delete: deleteUsers
delete_by_pk: deleteUser
insert: insertUsers
insert_one: insertUser
select: users
select_aggregate: usersAggregate
select_by_pk: user
update: updateUsers
update_by_pk: updateUser
object_relationships:
- name: defaultRoleByRole
using:
foreign_key_constraint_on: default_role
array_relationships:
- name: refreshTokens
using:
foreign_key_constraint_on:
column: user_id
table:
name: refresh_tokens
schema: auth
- name: roles
using:
foreign_key_constraint_on:
column: user_id
table:
name: user_roles
schema: auth
- name: securityKeys
using:
foreign_key_constraint_on:
column: user_id
table:
name: user_security_keys
schema: auth
- name: userProviders
using:
foreign_key_constraint_on:
column: user_id
table:
name: user_providers
schema: auth

View File

@@ -0,0 +1,49 @@
table:
name: buckets
schema: storage
configuration:
column_config:
cache_control:
custom_name: cacheControl
created_at:
custom_name: createdAt
download_expiration:
custom_name: downloadExpiration
id:
custom_name: id
max_upload_file_size:
custom_name: maxUploadFileSize
min_upload_file_size:
custom_name: minUploadFileSize
presigned_urls_enabled:
custom_name: presignedUrlsEnabled
updated_at:
custom_name: updatedAt
custom_column_names:
cache_control: cacheControl
created_at: createdAt
download_expiration: downloadExpiration
id: id
max_upload_file_size: maxUploadFileSize
min_upload_file_size: minUploadFileSize
presigned_urls_enabled: presignedUrlsEnabled
updated_at: updatedAt
custom_name: buckets
custom_root_fields:
delete: deleteBuckets
delete_by_pk: deleteBucket
insert: insertBuckets
insert_one: insertBucket
select: buckets
select_aggregate: bucketsAggregate
select_by_pk: bucket
update: updateBuckets
update_by_pk: updateBucket
array_relationships:
- name: files
using:
foreign_key_constraint_on:
column: bucket_id
table:
name: files
schema: storage

View File

@@ -0,0 +1,51 @@
table:
name: files
schema: storage
configuration:
column_config:
bucket_id:
custom_name: bucketId
created_at:
custom_name: createdAt
etag:
custom_name: etag
id:
custom_name: id
is_uploaded:
custom_name: isUploaded
mime_type:
custom_name: mimeType
name:
custom_name: name
size:
custom_name: size
updated_at:
custom_name: updatedAt
uploaded_by_user_id:
custom_name: uploadedByUserId
custom_column_names:
bucket_id: bucketId
created_at: createdAt
etag: etag
id: id
is_uploaded: isUploaded
mime_type: mimeType
name: name
size: size
updated_at: updatedAt
uploaded_by_user_id: uploadedByUserId
custom_name: files
custom_root_fields:
delete: deleteFiles
delete_by_pk: deleteFile
insert: insertFiles
insert_one: insertFile
select: files
select_aggregate: filesAggregate
select_by_pk: file
update: updateFiles
update_by_pk: updateFile
object_relationships:
- name: bucket
using:
foreign_key_constraint_on: bucket_id

View File

@@ -0,0 +1,11 @@
- "!include auth_provider_requests.yaml"
- "!include auth_providers.yaml"
- "!include auth_refresh_token_types.yaml"
- "!include auth_refresh_tokens.yaml"
- "!include auth_roles.yaml"
- "!include auth_user_providers.yaml"
- "!include auth_user_roles.yaml"
- "!include auth_user_security_keys.yaml"
- "!include auth_users.yaml"
- "!include storage_buckets.yaml"
- "!include storage_files.yaml"

View File

@@ -0,0 +1 @@
disabled_for_roles: []

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1 @@
[]

View File

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

View File

@@ -0,0 +1 @@
DELETE FROM "storage"."buckets" WHERE "id" = 'custom';

View File

@@ -0,0 +1 @@
INSERT INTO "storage"."buckets"("presigned_urls_enabled", "download_expiration", "max_upload_file_size", "min_upload_file_size", "cache_control", "id", "created_at", "updated_at") VALUES (true, 30, 30000000, 1, E'max-age=3600', E'custom', E'2023-06-29T14:30:13.859559+00:00', E'2023-06-29T14:30:13.859559+00:00');

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost-examples/node-storage",
"version": "0.0.2",
"version": "0.0.4",
"private": true,
"description": "This is an example of how to use the Storage with Node.js",
"main": "src/index.mjs",
@@ -14,9 +14,12 @@
"@nhost/nhost-js": "*",
"dotenv": "^16.1.3",
"form-data": "^4.0.0",
"node-fetch": "^3.3.0"
"fs-extra": "^11.1.1",
"node-fetch": "^3.3.0",
"uuid": "^9.0.0"
},
"devDependencies": {
"@types/node": "^18.15.11"
"@types/node": "^18.15.11",
"@types/uuid": "^9.0.1"
}
}

View File

@@ -10,14 +10,23 @@ dependencies:
form-data:
specifier: ^4.0.0
version: 4.0.0
fs-extra:
specifier: ^11.1.1
version: 11.1.1
node-fetch:
specifier: ^3.3.0
version: 3.3.0
uuid:
specifier: ^9.0.0
version: 9.0.0
devDependencies:
'@types/node':
specifier: ^18.15.11
version: 18.15.11
'@types/uuid':
specifier: ^9.0.1
version: 9.0.1
packages:
@@ -32,6 +41,10 @@ packages:
resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==}
dev: true
/@types/uuid@9.0.1:
resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==}
dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
@@ -92,6 +105,27 @@ packages:
fetch-blob: 3.2.0
dev: false
/fs-extra@11.1.1:
resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
engines: {node: '>=14.14'}
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
universalify: 2.0.0
dev: false
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
dev: false
/jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
dependencies:
universalify: 2.0.0
optionalDependencies:
graceful-fs: 4.2.11
dev: false
/jwt-decode@3.1.2:
resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==}
dev: false
@@ -142,6 +176,16 @@ packages:
engines: {node: '>=4'}
dev: false
/universalify@2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'}
dev: false
/uuid@9.0.0:
resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
hasBin: true
dev: false
/web-streams-polyfill@3.2.1:
resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
engines: {node: '>= 8'}

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