Merge branch 'master' into feat/migrate-supabase-ui

This commit is contained in:
Terry Sutton committed 2022-10-05 10:09:23 -02:30
commit e36fabde3e
561 files changed
+39950 -105834

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
node_modules/
.vercel
.next
.env.local
.env.production
.env.dev
.env.*
+2
View File
@@ -6,6 +6,8 @@ name: Studio Unit Tests
on:
push:
branches: [ master ]
paths:
- 'studio/**'
pull_request:
branches: [ master ]
paths:
+1
View File
@@ -225,6 +225,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
- [Portuguese (Brazilian) / Português Brasileiro](/i18n/README.pt-br.md)
- [Romanian / Română](/i18n/README.ro.md)
- [Russian / Pусский](/i18n/README.ru.md)
- [Serbian / Srpski](/i18n/README.sr.md)
- [Sinhala / සිංහල](/i18n/README.si.md)
- [Spanish / Español](/i18n/README.es.md)
- [Simplified Chinese / 简体中文](/i18n/README.zh-cn.md)
+1 -2
View File
@@ -19,5 +19,4 @@ npm-debug.log*
yarn-debug.log*
yarn-error.log*
# _supabase_js/sdk/**/*
# !_supabase_js/sdk/.gitkeep
**/*/generated
+101 -2
View File
@@ -334,6 +334,9 @@ POST https://api.supabase.com/v1/projects
"ap-south-1",
"sa-east-1"
]
},
"kps_enabled": {
"type": "boolean"
}
},
"required": [
@@ -511,6 +514,18 @@ GET https://api.supabase.com/v1/projects/{ref}/functions
```
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -583,7 +598,7 @@ POST https://api.supabase.com/v1/projects/{ref}/functions
"properties": {
"slug": {
"type": "string",
"pattern": {}
"pattern": "/^[A-Za-z0-9_-]+$/"
},
"name": {
"type": "string"
@@ -667,6 +682,18 @@ POST https://api.supabase.com/v1/projects/{ref}/functions
```
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -814,6 +841,18 @@ GET https://api.supabase.com/v1/projects/{ref}/functions/{function_slug}
```
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -979,6 +1018,18 @@ PATCH https://api.supabase.com/v1/projects/{ref}/functions/{function_slug}
```
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -1075,6 +1126,18 @@ DELETE https://api.supabase.com/v1/projects/{ref}/functions/{function_slug}
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -1176,6 +1239,18 @@ GET https://api.supabase.com/v1/projects/{ref}/secrets
```
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -1253,7 +1328,7 @@ POST https://api.supabase.com/v1/projects/{ref}/secrets
},
"value": {
"type": "string",
"pattern": {}
"pattern": "/^(?!SUPABASE_).*/"
}
},
"required": [
@@ -1280,6 +1355,18 @@ POST https://api.supabase.com/v1/projects/{ref}/secrets
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
@@ -1379,6 +1466,18 @@ DELETE https://api.supabase.com/v1/projects/{ref}/secrets
```
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
<TabItem value="403">
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
</TabItem>
-337
View File
@@ -1,337 +0,0 @@
---
id: config
slug: /config
title: Configuration
toc_max_heading_level: 3
---
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
A `config.toml` file is generated after running `supabase init`.
This file is located in the `supabase` folder under `supabase/config.toml`.
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## General {#general}
### `project_id` {#project_id}
A string used to distinguish different Supabase projects on the same host. Defaults to the working directory name when running `supabase init`.
<ul>
<li>
Required: <code>true</code>
</li>
<li>
Default: <code>None</code>
</li>
</ul>
<br />
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## Auth Settings {#auth}
### `auth.site_url` {#auth.site_url}
The base URL of your website. Used as an allow-list for redirects and for constructing URLs used in emails.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>"http://localhost:3000"</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.additional_redirect_urls` {#auth.additional_redirect_urls}
A list of _exact_ URLs that auth providers are permitted to redirect to post authentication.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>["https://localhost:3000"]</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.jwt_expiry` {#auth.jwt_expiry}
How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one week).
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>3600</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.enable_signup` {#auth.enable_signup}
Allow/disallow new user signups to your project.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>true</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.email.enable_signup` {#auth.email.enable_signup}
Allow/disallow new user signups via email to your project.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>true</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.email.double_confirm_changes` {#auth.email.double_confirm_changes}
If enabled, a user will be required to confirm any email change on both the old, and new email addresses. If disabled, only the new email is required to confirm.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>true</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.email.enable_confirmations` {#auth.email.enable_confirmations}
If enabled, users need to confirm their email address before signing in.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>true</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.external.<provider>.enabled` {#auth.external.provider.enabled}
Use an external OAuth provider. The full list of providers are:
- `apple`
- `azure`
- `bitbucket`
- `discord`
- `facebook`
- `github`
- `gitlab`
- `google`
- `twitch`
- `twitter`
- `slack`
- `spotify`
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>true</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.external.<provider>.client_id` {#auth.external.provider.client_id}
Client ID for the external OAuth provider.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>""</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
### `auth.external.<provider>.secret` {#auth.external.provider.secret}
Client secret for the external OAuth provider.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>""</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://supabase.com/docs/reference/auth">Auth Server configuration</a></li></ul>
</li>
</ul>
<br />
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## API Settings {#api}
### `api.port` {#api.port}
Port to use for the API URL.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>54321</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://postgrest.org/en/stable/configuration.html">PostgREST configuration</a></li></ul>
</li>
</ul>
<br />
### `api.extra_search_path` {#api.extra_search_path}
Extra schemas to add to the `search_path` of every request.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>["extensions"]</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://postgrest.org/en/stable/configuration.html">PostgREST configuration</a></li></ul>
</li>
</ul>
<br />
### `api.max_rows` {#api.max_rows}
The maximum number of rows returned from a view, table, or stored procedure. Limits payload size for accidental or malicious requests.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>1000</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://postgrest.org/en/stable/configuration.html">PostgREST configuration</a></li></ul>
</li>
</ul>
<br />
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## Database Settings {#database}
### `db.port` {#db.port}
Port to use for the local database URL.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>54322</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://postgrest.org/en/stable/configuration.html">PostgreSQL configuration</a></li></ul>
</li>
</ul>
<br />
### `db.major_version` {#db.major_version}
The database major version to use. This has to be the same as your remote database's. Run `SHOW server_version;` on the remote database to check.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>14</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://postgrest.org/en/stable/configuration.html">PostgreSQL configuration</a></li></ul>
</li>
</ul>
<br />
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## Dashboard Settings {#dashboard}
### `studio.port` {#studio.port}
Port to use for Supabase Studio.
<ul>
<li>
Required: <code>true</code>
</li>
<li>
Default: <code>54323</code>
</li>
</ul>
<br />
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## Local Development {#local}
### `inbucket.port` {#inbucket.port}
Port to use for the email testing server web interface.
Emails sent with the local dev setup are not actually sent - rather, they are monitored, and you can view the emails that would have been sent from the web interface.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>54324</code></li>
<li>
<span>See also:</span>
<ul><li><a href="https://www.inbucket.org">Inbucket documentation</a></li></ul>
</li>
</ul>
<br />
File diff suppressed because it is too large. Load diff
+14 -223
View File
@@ -1,244 +1,35 @@
---
id: config
slug: /config
title: Configuration
toc_max_heading_level: 3
---
## Security
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
| Parameter | Type | Description |
| :-------------------------------------------------------------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="site_url">`SITE_URL`</span> | `string` | **Required**. The base URL your site is located at. Currently used in combination with other settings to construct URLs used in emails. Any URI that shares a host with `SITE_URL` is a permitted value for `redirect_to` params (see `/authorize` etc.). |
| <span id="uri_allow_list">`URI_ALLOW_LIST`</span> | `string` | A comma separated list of URIs (e.g. `"https://foo.example.com,https://*.foo.example.com"`) which are permitted as valid `redirect_to` destinations. Defaults to [ ].<br/><br/>Supports wildcard matching through globbing. (e.g. `https://*.foo.example.com` will allow `https://a.foo.example.com` and `https://b.foo.example.com` to be accepted.)<br/><br/>Globbing is also supported on subdomains. (e.g. `https://foo.example.com/*` will allow `https://foo.example.com/page1` and `https://foo.example.com/page2` to be accepted.)<br/>For more common glob patterns, check out the [following link](https://pkg.go.dev/github.com/gobwas/glob#Compile). |
| <span id="operator_token">`OPERATOR_TOKEN`</span> | `string` | The shared secret with an operator for this microservice. Used to verify requests have been proxied through the operator and the payload values can be trusted. |
| <span id="disable_signup">`DISABLE_SIGNUP`</span> | `bool` | When signup is disabled the only way to create new users is through invites. Defaults to `false`, all signups enabled. |
| <span id="email_enabled">`EXTERNAL_EMAIL_ENABLED`</span> | `bool` | Use this to disable email signups (users can still use external oauth providers to sign up / sign in) |
| <span id="phone_enabled">`EXTERNAL_PHONE_ENABLED`</span> | `bool` | Use this to disable phone signups (users can still use external oauth providers to sign up / sign in) |
| <span id="rate_limit_token_refresh">`RATE_LIMIT_TOKEN_REFRESH`</span> | `string` | Rate limit the number of requests sent to `/token` |
| <span id="rate_limit_email_sent">`RATE_LIMIT_EMAIL_SENT`</span> | `string` | Rate limit the number of emails sent per hr on the following endpoints: `/signup`, `/invite`, `/magiclink`, `/recover`, `/otp`, & `/user`. |
| <span id="password_min_length">`PASSWORD_MIN_LENGTH`</span> | `int` | Minimum password length, defaults to 6. |
A `config.toml` file is generated after running `supabase init`.
These options control additional security settings available in gotrue. If self-hosting, they need to be prefixed with `GOTRUE_SECURITY_` .
This file is located in the `supabase` folder under `supabase/config.toml`.
| Parameter | Type | Description |
| :---------------------------------------------------------------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="refresh_token_rotation_enabled">`REFRESH_TOKEN_ROTATION_ENABLED`</span> | `bool` | If refresh token rotation is enabled, gotrue will automatically detect malicious attempts to reuse a revoked refresh token. When a malicious attempt is detected, gotrue immediately revokes all tokens that descended from the offending token. |
| <span id="refresh_token_reuse_interval">`REFRESH_TOKEN_REUSE_INTERVAL`</span> | `string` | This setting is only applicable if `REFRESH_TOKEN_ROTATION_ENABLED` is enabled. The reuse interval for a refresh token allows for exchanging the refresh token multiple times during the interval to support concurrency or offline issues.<br/>During the reuse interval, gotrue will not consider using a revoked token as a malicious attempt and will simply return the child refresh token.<br/>Only the previous revoked token can be reused. Using an old refresh token way before the current valid refresh token will trigger the reuse detection. |
| <span id="captcha_enabled">`CAPTCHA_ENABLED`</span> | `string` | Enables the captcha middleware. |
| <span id="captcha_provider">`CAPTCHA_PROVIDER`</span> | `string` | The only captcha provider option supported is: `hcaptcha`. |
| <span id="captcha_secret">`CAPTCHA_SECRET`</span> | `string` | The captcha secret token. Retrieve this from your captcha account. |
| <span id="captcha_timeout">`CAPTCHA_TIMEOUT`</span> | `string` | The http timeout on the captcha request. |
| <span id="update_password_require_reauthentication">`UPDATE_PASSWORD_REQUIRE_REAUTHENTICATION`</span> | `bool` | When enabled, this requires a user to reauthenticate before being able to update their password. |
## API
| Parameter | Type | Description |
| :------------------------------------------------------ | :------- | :--------------------------------------------------------------------------------------------- |
| <span id="api_host">`API_HOST`</span> | `string` | Hostname to listen on. |
| <span id="port">`PORT`</span> | `number` | Port number to listen on. Defaults to `8081`. |
| <span id="request_id_header">`REQUEST_ID_HEADER`</span> | `string` | If you wish to inherit a request ID from the incoming request, specify the name in this value. |
## Database
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
| Parameter | Type | Description |
| :---------------------------------------------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="db_driver">`DB_DRIVER`</span> | `string` | **Required**. Chooses what dialect of database you want. Must be `postgres`. |
| <span id="database_url">`DATABASE_URL`</span> | `string` | **Required**. Connection string for the database. |
| <span id="db_max_pool_size">`DB_MAX_POOL_SIZE`</span> | `int` | Sets the maximum number of open connections to the database. Defaults to 0 which is equivalent to an "unlimited" number of connections. |
| <span id="db_namespace">`DB_NAMESPACE`</span> | `string` | Specifies the schema in which the tables are to be created in. |
## General {#general}
## JSON Web Tokens (JWT)
| Parameter | Type | Description |
| :---------------------------------------------------------------- | :------- | :----------------------------------------------------------------------------------- |
| <span id="jwt_secret">`JWT_SECRET`</span> | `string` | **Required**. The secret used to sign JWT tokens with. |
| <span id="jwt_exp">`JWT_EXP`</span> | `number` | How long tokens are valid for in seconds. Defaults to 3600 (1 hour). |
| <span id="jwt_aud">`JWT_AUD`</span> | `string` | The default JWT audience. Use audiences to group users. Defaults to `authenticated`. |
| <span id="jwt_admin_group_name">`JWT_ADMIN_GROUP_NAME`</span> | `string` | The name of the admin group (if enabled). Defaults to `admin`. |
| <span id="jwt_default_group_name">`JWT_DEFAULT_GROUP_NAME`</span> | `string` | The default group to assign all new users to. |
## External Authentication Providers
### `project_id` {#project_id}
We support `apple`, `azure`, `bitbucket`, `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `spotify`, `slack`, `twitch`, `twitter` and `workos` for external authentication.
A string used to distinguish different Supabase projects on the same host. Defaults to the working directory name when running `supabase init`.
Use the names as the keys underneath `external` to configure each separately.
No external providers are required, but you must provide the required values if you choose to enable any.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
| Parameter | Type | Description |
| :------------------------------------------------------------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <span id="external_x_enabled">`EXTERNAL_X_ENABLED`</span> | `bool` | Whether this external provider is enabled or not |
| <span id="external_x_client_id">`EXTERNAL_X_CLIENT_ID`</span> | `string` | **Required**. The OAuth2 Client ID registered with the external provider. |
| <span id="external_x_client_secret">`EXTERNAL_X_SECRET`</span> | `string` | **Required**. The OAuth2 Client Secret provided by the external provider when you registered. |
| <span id="external_x_redirect_uri">`EXTERNAL_X_REDIRECT_URI`</span> | `string` | **Required**. Also known as the callback url, this is the URI an OAuth2 provider will redirect to with the `code` and `state` values. |
| <span id="external_x_url">`EXTERNAL_X_URL`</span> | `string` | The base URL used for constructing the URLs to request authorization and access tokens. Used by `gitlab` and `keycloak`. For `gitlab` it defaults to `https://gitlab.com`. For `keycloak` you need to set this to your realm url, (e.g. `https://keycloak.example.com/auth/realms/myrealm`) |
<br />
### Apple OAuth
To try out sign-in with Apple locally, you will need to do the following:
1. Run GoTrue over `https` via a reverse proxy (like ngrok).
2. Generate the `crt` and `key` file. See [here](https://www.freecodecamp.org/news/how-to-get-https-working-on-your-local-development-environment-in-5-minutes-7af615770eec/) for more information.
3. Generate the `GOTRUE_EXTERNAL_APPLE_SECRET` by following this [post](https://medium.com/identity-beyond-borders/how-to-configure-sign-in-with-apple-77c61e336003)!
## SMTP Configuration
Sending email is not required, but highly recommended for password recovery. If `mailer_autoconfirm` is enabled, no emails will be sent out for `signup`, `recovery`, `invite`. Emails will only be sent out for `magiclink`.
| Parameter | Type | Description |
| :-------------------------------------------------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="smtp_admin_email">`SMTP_ADMIN_EMAIL`</span> | `string` | **Required**. The `From` email address for all emails sent. |
| <span id="smtp_host">`SMTP_HOST`</span> | `string` | **Required**. The mail server hostname to send emails through. |
| <span id="smtp_port">`SMTP_PORT`</span> | `string` | **Required**. The port number to connect to the mail server on. |
| <span id="smtp_user">`SMTP_USER`</span> | `string` | **Required**. If the mail server requires authentication, the username to use. |
| <span id="smtp_pass">`SMTP_PASS`</span> | `string` | **Required**. If the mail server requires authentication, the password to use. |
| <span id="smtp_max_frequency">`SMTP_MAX_FREQUENCY`</span> | `string` | Controls the minimum amount of time that must pass before sending another signup confirmation or password reset email. The value is the number of seconds. Defaults to 60 seconds. |
| <span id="smtp_sender_name">`SMTP_SENDER_NAME`</span> | `string` | Sets the name of the sender. Defaults to the `SMTP_ADMIN_EMAIL` if not used. |
## Email
These options control the emails sent from GoTrue.
| Parameter | Type | Description |
| :---------------------------------------------------------------------------------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="mailer_autoconfirm">`MAILER_AUTOCONFIRM`</span> | `bool` | If you do not require email confirmation, you may set this to `true`. Defaults to `false`. |
| <span id="mailer_secure_email_change_enabled">`MAILER_SECURE_EMAIL_CHANGE_ENABLED`</span> | `bool` | If `true`, send an email to both the user's current and new email with a confirmation link, otherwise send an email with confirmation link only to new email. Defaults to `true`. |
| <span id="mailer_otp_exp">`MAILER_OTP_EXP`</span> | `string` | Controls the duration an email link or otp is valid for. Defaults to 24 hrs. |
| <span id="mailer_urlpaths_invite">`MAILER_URLPATHS_INVITE`</span> | `string` | URL path to use in the user invite email. Defaults to `/`. |
| <span id="mailer_urlpaths_confirmation">`MAILER_URLPATHS_CONFIRMATION`</span> | `string` | URL path to use in the signup confirmation email. Defaults to `/`. |
| <span id="mailer_urlpaths_recovery">`MAILER_URLPATHS_RECOVERY`</span> | `string` | URL path to use in the password reset email. Defaults to `/`. |
| <span id="mailer_urlpaths_email_change">`MAILER_URLPATHS_EMAIL_CHANGE`</span> | `string` | URL path to use in the email change confirmation email. Defaults to `/`. |
| <span id="mailer_subjects_invite">`MAILER_SUBJECTS_INVITE`</span> | `string` | Email subject to use for user invite. Defaults to `You have been invited`. |
| <span id="mailer_subjects_confirmation">`MAILER_SUBJECTS_CONFIRMATION`</span> | `string` | Email subject to use for signup confirmation. Defaults to `Confirm Your Signup`. |
| <span id="mailer_subjects_recovery">`MAILER_SUBJECTS_RECOVERY`</span> | `string` | Email subject to use for password reset. Defaults to `Reset Your Password`. |
| <span id="mailer_subjects_magiclink">`MAILER_SUBJECTS_MAGIC_LINK`</span> | `string` | Email subject to use for magic link email. Defaults to `Your Magic Link`. |
| <span id="mailer_subjects_email_change">`MAILER_SUBJECTS_EMAIL_CHANGE`</span> | `string` | Email subject to use for email change confirmation. Defaults to `Confirm Email Change`. |
## Email Templates
| Parameter | Type | Description |
| :------------------------------------------------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------- |
| <span id="mailer_templates_invite">`MAILER_TEMPLATES_INVITE`</span> | `string` | URL path to an email template to use when inviting a user. `SiteURL`, `Email`, and `ConfirmationURL` variables are available. |
Default Content (if template is unavailable):
```html
<h2>You have been invited</h2>
<p>
You have been invited to create a user on {{ .SiteURL }}. Follow this link to
accept the invite:
</p>
<p><a href="{{ .ConfirmationURL }}">Accept the invite</a></p>
```
| Parameter | Type | Description |
| :------------------------------------------------------------------------------ | :------- | :-------------------------------------------------------------------------------------------------------------------------------- |
| <span id="mailer_templates_confirmation">`MAILER_TEMPLATES_CONFIRMATION`</span> | `string` | URL path to an email template to use when confirming a signup. `SiteURL`, `Email`, and `ConfirmationURL` variables are available. |
Default Content (if template is unavailable):
```html
<h2>Confirm your signup</h2>
<p>Follow this link to confirm your user:</p>
<p><a href="{{ .ConfirmationURL }}">Confirm your mail</a></p>
```
| Parameter | Type | Description |
| :---------------------------------------------------------------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------- |
| <span id="mailer_templates_recovery">`MAILER_TEMPLATES_RECOVERY`</span> | `string` | URL path to an email template to use when resetting a password. `SiteURL`, `Email`, and `ConfirmationURL` variables are available. |
Default Content (if template is unavailable):
```html
<h2>Reset Password</h2>
<p>Follow this link to reset the password for your user:</p>
<p><a href="{{ .ConfirmationURL }}">Reset Password</a></p>
```
| Parameter | Type | Description |
| :-------------------------------------------------------------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------- |
| <span id="mailer_templates_magic_link">`MAILER_TEMPLATES_MAGIC_LINK`</span> | `string` | URL path to an email template to use when sending magic link. `SiteURL`, `Email`, and `ConfirmationURL` variables are available. |
Default Content (if template is unavailable):
```html
<h2>Magic Link</h2>
<p>Follow this link to login:</p>
<p><a href="{{ .ConfirmationURL }}">Log In</a></p>
```
| Parameter | Type | Description |
| :------------------------------------------------------------------------------ | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="mailer_templates_email_change">`MAILER_TEMPLATES_EMAIL_CHANGE`</span> | `string` | URL path to an email template to use when confirming the change of an email address. `SiteURL`, `Email`, `NewEmail` and `ConfirmationURL` variables are available. |
Default Content (if template is unavailable):
```html
<h2>Confirm Change of Email</h2>
<p>
Follow this link to confirm the update of your email from {{ .Email }} to {{
.NewEmail }}:
</p>
<p><a href="{{ .ConfirmationURL }}">Change Email</a></p>
```
### Phone Auth
These options control the SMS-es sent from GoTrue.
| Parameter | Type | Description |
| :------------------------------------------------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="sms_autoconfirm">`SMS_AUTOCONFIRM`</span> | `bool` | If you do not require phone confirmation, you may set this to `true`. Defaults to `false`. |
| <span id="sms_max_frequency">`SMS_MAX_FREQUENCY`</span> | `number` | Controls the minimum amount of time that must pass before sending another sms otp. The value is the number of seconds. Defaults to 60 (1 minute)). |
| <span id="sms_otp_exp">`SMS_OTP_EXP`</span> | `number` | Controls the duration an sms otp is valid for. |
| <span id="sms_otp_length">`SMS_OTP_LENGTH`</span> | `number` | Controls the number of digits of the sms otp sent. Valid otp lengths are between [6 - 10] digits |
| <span id="sms_provider">`SMS_PROVIDER`</span> | `string` | Available options are: `twilio`, `messagebird`, `textlocal`, and `vonage` |
If you're using twilio, you can obtain your credentials from the [twilio dashboard](https://www.twilio.com/docs/usage/requests-to-twilio#credentials):
You can find the `SMS_TWILIO_ACCOUNT_SID` and `SMS_TWILIO_AUTH_TOKEN` in the account info page of the twilio console dashboard.
| Parameter | Type | Description |
| :---------------------------------------------------------------------------- | :------- | :------------------------------------------- |
| <span id="twilio_account_sid">`SMS_TWILIO_ACCOUNT_SID`</span> | `string` | Your twilio account string identifier (SID). |
| <span id="twilio_auth_token">`SMS_TWILIO_AUTH_TOKEN`</span> | `string` | Your twilio auth token. |
| <span id="twilio_message_service_sid">`SMS_TWILIO_MESSAGE_SERVICE_SID`</span> | `string` | Your twilio sender mobile number |
If you're using MessageBird, you can obtain your credentials from the [MessageBird dashboard](https://dashboard.messagebird.com/en/developers/access):
| Parameter | Type | Description |
| :-------------------------------------------------------------------- | :------- | :----------------------------------------------------------- |
| <span id="messagebird_access_key">`SMS_MESSAGEBIRD_ACCESS_KEY`</span> | `string` | Your MessageBird access key. |
| <span id="messagebird_originator">`SMS_MESSAGEBIRD_ORIGINATOR`</span> | `string` | Your MessageBird sender phone number with + or company name. |
## Logging
| Parameter | Type | Description |
| :-------------------------------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------- |
| <span id="log_level">`LOG_LEVEL`</span> | `string` | Controls what log levels are output. Choose from `panic`, `fatal`, `error`, `warn`, `info`, or `debug`. Defaults to `info`. |
| <span id="log_file">`LOG_FILE`</span> | `string` | If you wish logs to be written to a file, set `log_file` to a valid file path. |
## Opentracing
Currently Datadog is the only tracer supported.
| Parameter | Type | Description |
| :-------------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="tracing_enabled">`TRACING_ENABLED`</span> | `bool` | Whether tracing is enabled or not. Defaults to `false`. |
| <span id="tracing_host">`TRACING_HOST`</span> | `string` | The tracing destination. (e.g. `GOTRUE_TRACING_HOST=127.0.0.1`) |
| <span id="tracing_port">`TRACING_PORT`</span> | `int` | The port for the tracing host. |
| <span id="tracing_tags">`TRACING_TAGS`</span> | `string` | A comma separated list of key:value pairs. These key value pairs will be added as tags to all opentracing spans. (e.g. `GOTRUE_TRACING_TAGS="tag1:value1,tag2:value2"`) |
| <span id="service_name">`SERVICE_NAME`</span> | `string` | The name to use for the service. |
## Webhooks
| Parameter | Type | Description |
| :---------------------------------------------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <span id="webhook_url">`WEBHOOK_URL`</span> | `string` | URL of the webhook receiver endpoint. This will be called when events like `validate`, `signup` or `login` occur. |
| <span id="webhook_secret">`WEBHOOK_SECRET`</span> | `string` | Shared secret to authorize webhook requests. This secret signs the [JSON Web Signature](https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41) of the request. You _should_ use this to verify the integrity of the request. Otherwise others can feed your webhook receiver with fake data. |
| <span id="webhook_retries">`WEBHOOK_RETRIES`</span> | `number` | How often GoTrue should try a failed hook. |
| <span id="webhook_timeout_sec">`WEBHOOK_TIMEOUT_SEC`</span> | `number` | Time between retries (in seconds). |
| <span id="webhook_events">`WEBHOOK_EVENTS`</span> | `list` | Which events should trigger a webhook. You can provide a comma separated list. For example to listen to all events, provide the values `validate,signup,login`. |
@@ -1,264 +0,0 @@
---
id: config
slug: /config
title: Configuration
toc_max_heading_level: 3
---
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
A sample `.env` file is located in the [storage repository](https://github.com/supabase/storage-api/blob/master/.env.sample).
Use this file to configure your environment variables for your Storage server.
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## General {#general}
### `ANON_KEY` {#ANON_KEY}
A long-lived JWT with anonymous Postgres privileges.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `SERVICE_KEY` {#SERVICE_KEY}
A long-lived JWT with Postgres privileges to bypass Row Level Security.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `TENANT_ID` {#TENANT_ID}
The ID of a Storage tenant.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `REGION` {#REGION}
Region of your S3 bucket.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `GLOBAL_S3_BUCKET` {#GLOBAL_S3_BUCKET}
Name of your S3 bucket.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `POSTGREST_URL` {#POSTGREST_URL}
The URL of your PostgREST server.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `PGRST_JWT_SECRET` {#PGRST_JWT_SECRET}
A JWT Secret for the PostgREST database.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `DATABASE_URL` {#DATABASE_URL}
The URL of your Postgres database.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `PGOPTIONS` {#PGOPTIONS}
Additional configuration parameters for Postgres startup.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `FILE_SIZE_LIMIT` {#FILE_SIZE_LIMIT}
The maximum file size allowed.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `STORAGE_BACKEND` {#STORAGE_BACKEND}
The storage provider.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `FILE_STORAGE_BACKEND_PATH` {#FILE_STORAGE_BACKEND_PATH}
The location storage when the "STORAGE_BACKEND" is set to "file".
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY -->
## Multi-tenant {#multitenant}
### `IS_MULTITENANT` {#IS_MULTITENANT}
Operate across multiple tenants.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `MULTITENANT_DATABASE_URL` {#MULTITENANT_DATABASE_URL}
The URL of the multitenant Postgres database.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `X_FORWARDED_HOST_REGEXP` {#X_FORWARDED_HOST_REGEXP}
TBD.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `POSTGREST_URL_SUFFIX` {#POSTGREST_URL_SUFFIX}
The suffix for the PostgREST instance.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `ADMIN_API_KEYS` {#ADMIN_API_KEYS}
Secure API key for administrative endpoints.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
### `ENCRYPTION_KEY` {#ENCRYPTION_KEY}
An key for encryting/decrypting secrets.
<ul>
<li>Required: <code>true</code></li>
<li>Default: <code>None</code></li>
</ul>
<br />
File diff suppressed because it is too large. Load diff
@@ -1,29 +0,0 @@
---
id: auth-onauthstatechange
title: 'auth.onAuthStateChange()'
slug: /auth-onauthstatechange
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Receive a notification every time an auth event happens.
```dart
final subscription = supabase.auth.onAuthStateChange((event, session) {
print(session?.user?.id);
// handle auth state change
});
```
## Examples
### Listen to auth changes
```dart
final subscription = supabase.auth.onAuthStateChange((event, session) {
print(session?.user?.id);
// handle auth state change
});
```
@@ -1,23 +0,0 @@
---
id: auth-session
title: 'auth.session()'
slug: /auth-session
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Returns the session data, if there is an active session.
```dart
final Session? session = supabase.auth.currentSession;
```
## Examples
### Get the session data
```dart
final Session? session = supabase.auth.currentSession;
```
@@ -1,54 +0,0 @@
---
id: auth-signin
title: 'auth.signIn()'
slug: /auth-signin
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Log in an existing user, or login via a third-party provider.
```dart
final GotrueSessionResponse res = await supabase.auth.signIn(email: 'example@email.com', password: 'example-password');
final User? user = res.user;
```
## Notes
- A user can sign up via email, phone number.
- If you provide `email` without a `password`, the user will be sent a magic link.
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
- Similarly, if you provide `phone` without a `password`, the user will be sent a one time password.
- If you are looking to sign users in with OAuth in Flutter apps, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
## Examples
### Sign in with email.
```dart
final GotrueSessionResponse res = await supabase.auth.signIn(email: 'example@email.com', password: 'example-password');
final User? user = res.user;
```
### Sign in with magic link.
If email is provided, but no password is provided, the user will be sent a "magic link" to their email address, which they can click to open your application with a valid session. By default, a given user can only request a Magic Link once every 60 seconds.
```dart
final GotrueSessionResponse res = await supabase.auth.signIn(email: 'example@email.com');
```
### Get OAuth sign in URL.
Passing provider parameter to `signIn()` will return a URL to sign your user in via OAuth.
If you are looking to sign in a user via OAuth on Flutter app, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
```dart
final GotrueSessionResponse res = await supabase.auth.signIn(provider: Provider.github);
final User? user = res.user;
```
@@ -1,55 +0,0 @@
---
id: auth-signinwithprovider
title: 'auth.signInWithProvider()'
slug: /auth-signinwithprovider
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Signs the user in using third party OAuth providers.
```dart
await supabase.auth.signInWithProvider(Provider.github);
```
## Notes
- `auth.signInWithProvider()` is only available on `supabase_flutter`
- It will open the browser to the relevant login page.
## Examples
### Sign in with provider.
```dart
await supabase.auth.signInWithProvider(Provider.github);
```
### With `redirectTo`
Specify the redirect link to bring back the user via deeplink.
Note that `redirectTo` should be null for Flutter Web.
```dart
await supabase.auth.signInWithProvider(Provider.github,
options: const AuthOptions(
redirectTo:
kIsWeb ? null : 'io.supabase.flutter://reset-callback/'));
```
### With scopes
If you need additional data from an OAuth provider, you can include a space-separated list of scopes in your request to get back an OAuth provider token.
You may also need to specify the scopes in the provider's OAuth app settings, depending on the provider.
```dart
await supabase.auth.signInWithProvider(Provider.github,
options: const AuthOptions(scopes: 'repo gist notifications'));
...
// after user comes back from signin flow
final Session? session = supabase.auth.currentSession;
final String? oAuthToken = session?.providerToken;
```
@@ -1,23 +0,0 @@
---
id: auth-signout
title: 'auth.signOut()'
slug: /auth-signout
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Signs out the current user, if there is a logged in user.
```dart
await supabase.auth.signOut();
```
## Examples
### Sign out
```dart
await supabase.auth.signOut();
```
@@ -1,38 +0,0 @@
---
id: auth-signup
title: 'auth.signUp()'
slug: /auth-signup
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Creates a new user.
```dart
final GotrueSessionResponse res = await supabase.auth.signUp('example@email.com', 'example-password');
final User? user = res.user;
```
## Notes
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
- If "Email Confirmations" is turned on, a user is returned but session will be null
- If "Email Confirmations" is turned off, both a `user` and a `session` will be returned
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
## Examples
### Sign up.
```dart
final GotrueSessionResponse res = await supabase.auth.signUp('example@email.com', 'example-password');
final User? user = res.user;
```
### Sign up with third-party providers.
If you are using Flutter, you can sign up with OAuth providers using the [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider) method available on `supabase_flutter`.
@@ -1,28 +0,0 @@
---
id: auth-update
title: 'auth.update()'
slug: /auth-update
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Updates user data, if there is a logged in user.
```dart
final GotrueUserResponse res = await supabase.auth.update(UserAttributes(data: {'hello': 'world'}));
```
## Notes
It's generally better to store user data in a table inside your public schema (i.e. `public.users`).
Use the `update()` method if you have data which rarely changes or is specific only to the logged in user.
## Examples
### Update a user's metadata.
```dart
final GotrueUserResponse res = await supabase.auth.update(UserAttributes(data: {'hello': 'world'}));
```
@@ -1,23 +0,0 @@
---
id: auth-user
title: 'auth.user()'
slug: /auth-user
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Returns the user data, if there is a logged in user.
```dart
final User? user = supabase.auth.currentUser;
```
## Examples
### Get the logged in user
```dart
final User? user = supabase.auth.currentUser;
```
@@ -1,54 +0,0 @@
---
id: containedby
title: '.containedBy()'
slug: /containedby
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, main_exports')
.containedBy('main_exports', ['cars', 'food', 'machine']);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, main_exports')
.containedBy('main_exports', ['cars', 'food', 'machine']);
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.containedBy('main_exports', ['orks', 'surveillance', 'evil']);
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.containedBy('main_exports', ['cars', 'food', 'machine']);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.containedBy('main_exports', ['cars', 'food', 'machine']);
```
@@ -1,54 +0,0 @@
---
id: contains
title: '.contains()'
slug: /contains
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, main_exports')
.contains('main_exports', ['oil']);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, main_exports')
.contains('main_exports', ['oil']);
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.contains('main_exports', ['oil']);
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.contains('main_exports', ['oil']);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.contains('main_exports', ['oil']);
```
@@ -1,33 +0,0 @@
---
id: delete
title: 'Delete data: delete()'
slug: /delete
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs a DELETE on the table.
```dart
final data = await supabase
.from('cities')
.delete()
.match({ 'id': 666 });
```
## Notes
- `delete()` should always be combined with [Filters](/docs/reference/dart/using-filters) to target the item(s) you wish to delete.
## Examples
### Delete records
```dart
final data = await supabase
.from('cities')
.delete()
.match({ 'id': 666 });
```
@@ -1,56 +0,0 @@
---
id: eq
title: '.eq()'
slug: /eq
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` exactly matches the specified `value`.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'The shire');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'The shire');
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.eq('name', 'San Francisco');
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.eq('name', 'Mordor');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.eq('name', 'San Francisco');
```
@@ -1,75 +0,0 @@
---
id: filter
title: '.filter()'
slug: /filter
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose `column` satisfies the filter.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.filter('name', 'in', '("Paris","Tokyo")');
```
## Notes
- `.filter()` expects you to use the raw [PostgREST syntax](https://postgrest.org/en/stable/api.html#horizontal-filtering-rows) for the filter names and values, so it should only be used as an escape hatch in case other filters don't work.
```dart
.filter('arraycol','cs','{"a","b"}') // Use Postgres array {} and 'cs' for contains.
.filter('rangecol','cs','(1,2]') // Use Postgres range syntax for range column.
.filter('id','in','(6,7)') // Use Postgres list () and 'in' for in_ filter.
.filter('id','cs','{${mylist.join(',')}}') // You can insert a Dart array list.
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.filter('name', 'in', '("Paris","Tokyo")');
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.filter('name', 'in', '("Paris","Tokyo")');
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.filter('name', 'in', '("Paris","Tokyo")');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.filter('name', 'in', '("Paris","Tokyo")')
```
### Filter embedded resources
```dart
final data = await supabase
.from('cities')
.select('name, countries ( name )')
.filter('countries.name', 'in', '("France","Japan")');
```
@@ -1,23 +0,0 @@
---
id: getchannels
title: 'getChannels()'
slug: /getchannels
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Returns all Realtime channels.
```dart
final channels = supabase.getChannels();
```
## Examples
### Get all channels
```dart
final channels = supabase.getChannels();
```
@@ -1,56 +0,0 @@
---
id: gt
title: '.gt()'
slug: /gt
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is greater than the specified `value`.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.gt('country_id', 250);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.gt('country_id', 250);
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.gt('country_id', 250);
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.gt('country_id', 250);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.gt('country_id', 250);
```
@@ -1,56 +0,0 @@
---
id: gte
title: '.gte()'
slug: /gte
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is greater than or equal to the specified `value`.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.gte('country_id', 250);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.gte('country_id', 250);
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.gte('country_id', 250);
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.gte('country_id', 250);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.gte('country_id', 250);
```
@@ -1,56 +0,0 @@
---
id: ilike
title: '.ilike()'
slug: /ilike
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value in the stated `column` matches the supplied `pattern` (case insensitive).
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.ilike('name', '%la%');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.ilike('name', '%la%');
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.ilike('name', '%la%');
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.ilike('name', '%la%');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.ilike('name', '%la%');
```
@@ -1,58 +0,0 @@
---
id: in_
title: '.in_()'
slug: /in_
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is found on the specified `values`.
`is_` and `in_` filter methods are suffixed with `_` to avoid collisions with reserved keywords.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.in_('name', ['Rio de Janeiro', 'San Francisco']);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.in_('name', ['Rio de Janeiro', 'San Francisco']);
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.in_('name', ['Rio de Janeiro', 'San Francisco']);
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.in_('name', ['Rio de Janeiro', 'San Francisco']);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.in_('name', ['Rio de Janeiro', 'San Francisco']);
```
@@ -1,11 +0,0 @@
---
id: index
title: 'Getting started'
slug: getting-started
custom_edit_url: ../../spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Supabase Dart.
@@ -1,48 +0,0 @@
---
id: insert
title: 'Create data: insert()'
slug: /insert
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs an INSERT into the table.
```dart
final data = await supabase
.from('cities')
.insert([
{'name': 'The Shire', 'country_id': 554}
]);
```
## Notes
- By default, every time you run `insert()`, the client library will make a `select` to return the full record.
This is convenient, but it can also cause problems if your Policies are not configured to allow the `select` operation.
If you are using Row Level Security and you are encountering problems, try setting the `returning` param to `minimal`.
## Examples
### Create a record
```dart
final data = await supabase
.from('cities')
.insert([
{'name': 'The Shire', 'country_id': 554}
]);
```
### Bulk create
```dart
final data = await supabase
.from('cities')
.insert([
{'name': 'The Shire', 'country_id': 554},
{'name': 'Rohan', 'country_id': 555},
]);
```
@@ -1,57 +0,0 @@
---
id: invoke
title: 'invoke()'
slug: /invoke
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Invokes a Supabase Function. See the [guide](/docs/guides/functions) for details on writing Functions.
```dart
final res = await supabase.functions.invoke('hello', body: {'foo': 'baa'});
final data = res.data;
```
## Notes
- Requires an Authorization header.
- Invoke params generally match the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) spec.
## Examples
### Basic invocation.
```dart
final res = await supabase.functions.invoke('hello', body: {'foo': 'baa'});
final data = res.data;
```
### Specifying response type.
By default, `invoke()` will parse the response as JSON. You can parse the response in the following formats: `json`, `blob`, `text`, and `arrayBuffer`.
```dart
final res = await supabase.functions.invoke(
'hello',
body: {'foo': 'baa'},
responseType: ResponseType.text,
);
final data = res.data;
```
### Parsing custom headers.
Any `headers` will be passed through to the function. A common pattern is to pass a logged-in user's JWT token as an Authorization header.
```dart
final res = await supabase.functions.invoke(
'hello',
body: {'foo': 'baa'},
headers: {
'Authorization': 'Bearer ${supabase.auth.currentSession?.accessToken}'
},
);
```
@@ -1,58 +0,0 @@
---
id: is_
title: '.is_()'
slug: /is_
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
A check for exact equality (null, true, false), finds all rows whose value on the stated `column` exactly match the specified `value`.
`is_` and `in_` filter methods are suffixed with `_` to avoid collisions with reserved keywords.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.is_('name', null);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.is_('name', null);
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.is_('name', null);
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.is_('name', null);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.is_('name', null);
```
@@ -1,102 +0,0 @@
---
id: like
title: '.like()'
slug: /like
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value in the stated `column` matches the supplied `pattern` (case sensitive).
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.like('name', '%la%');
```
## Parameters
<ul className="method-list-group">
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
column
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>object</code>
</span>
</h4>
<div class="method-list-item-description">
The column to filter on.
</div>
</li>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
pattern
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>string</code>
</span>
</h4>
<div class="method-list-item-description">
The pattern to filter with.
</div>
</li>
</ul>
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.like('name', '%la%');
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.like('name', '%la%');
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.like('name', '%la%');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.like('name', '%la%');
```
@@ -1,39 +0,0 @@
---
id: limit
title: 'limit()'
slug: /limit
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Limits the result with the specified count.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.limit(1);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.limit(1);
```
### With embedded resources
```dart
final data = await supabase
.from('countries')
.select('name, cities(name)')
.eq('name', 'United States')
.limit(1, foreignTable: 'cities' );
```
@@ -1,56 +0,0 @@
---
id: lt
title: '.lt()'
slug: /lt
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is less than the specified `value`.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.lt('country_id', 250);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.lt('country_id', 250);
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.lt('country_id', 250);
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.lt('country_id', 250);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.lt('country_id', 250);
```
@@ -1,102 +0,0 @@
---
id: lte
title: '.lte()'
slug: /lte
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is less than or equal to the specified `value`.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.lte('country_id', 250);
```
## Parameters
<ul className="method-list-group">
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
column
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>object</code>
</span>
</h4>
<div class="method-list-item-description">
The column to filter on.
</div>
</li>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
value
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>object</code>
</span>
</h4>
<div class="method-list-item-description">
The value to filter with.
</div>
</li>
</ul>
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.lte('country_id', 250);
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.lte('country_id', 250);
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.lte('country_id', 250);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.lte('country_id', 250);
```
@@ -1,56 +0,0 @@
---
id: match
title: '.match()'
slug: /match
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose columns match the specified `query` object.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.match({'name': 'Beijing', 'country_id': 156});
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.match({'name': 'Beijing', 'country_id': 156});
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.match({'name': 'Beijing', 'country_id': 156});
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.match({'name': 'Beijing', 'country_id': 156});
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.match({'name': 'Beijing', 'country_id': 156});
```
@@ -1,56 +0,0 @@
---
id: neq
title: '.neq()'
slug: /neq
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` doesn't match the specified `value`.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.neq('name', 'The shire');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.neq('name', 'The shire');
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.neq('name', 'San Francisco');
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.neq('name', 'Mordor');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities')
.neq('name', 'Lagos');
```
@@ -1,68 +0,0 @@
---
id: not
title: '.not()'
slug: /not
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows which doesn't satisfy the filter.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.not('name', 'eq', 'Paris');
```
## Notes
- `.not()` expects you to use the raw [PostgREST syntax](https://postgrest.org/en/stable/api.html#horizontal-filtering-rows) for the filter names and values.
```dart
.not('name','eq','Paris')
.not('arraycol','cs','{"a","b"}') // Use Postgres array {} for array column and 'cs' for contains.
.not('rangecol','cs','(1,2]') // Use Postgres range syntax for range column.
.not('id','in','(6,7)') // Use Postgres list () and 'in' for in_ filter.
.not('id','in','(${mylist.join(',')})') // You can insert a Dart list array.
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.not('name', 'eq', 'Paris');
```
### With `update()`
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.not('name', 'eq', 'Paris');
```
### With `delete()`
```dart
final data = await supabase
.from('cities')
.delete()
.not('name', 'eq', 'Paris');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_cities)
.not('name', 'eq', 'Paris');
```
@@ -1,48 +0,0 @@
---
id: or
title: '.or()'
slug: /or
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows satisfying at least one of the filters.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.or('id.eq.20,id.eq.30');
```
## Notes
- `.or()` expects you to use the raw [PostgREST syntax](https://postgrest.org/en/stable/api.html#horizontal-filtering-rows) for the filter names and values.
```dart
.or('id.in.(6,7),arraycol.cs.{"a","b"}') // Use Postgres list () and 'in' for in_ filter. Array {} and 'cs' for contains.
.or('id.in.(${mylist.join(',')}),arraycol.cs.{${mylistArray.join(',')}}') // You can insert a Dart list for list or array column.
.or('id.in.(${mylist.join(',')}),rangecol.cs.(${mylistRange.join(',')}]') // You can insert a Dart list for list or range column.
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.or('id.eq.20,id.eq.30');
```
### Use `or` with `and`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.or('id.gt.20,and(name.eq.New Zealand,name.eq.France)');
```
@@ -1,39 +0,0 @@
---
id: order
title: 'order()'
slug: /order
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Orders the result with the specified column.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.order('id', ascending: false );
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.order('id', ascending: false );
```
### With embedded resources
```dart
final data = await supabase
.from('countries')
.select('name, cities(name)')
.eq('name', 'United States')
.order('name', foreignTable: 'cities');
```
@@ -1,54 +0,0 @@
---
id: overlaps
title: '.overlaps()'
slug: /overlaps
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, main_exports')
.overlaps('main_exports', ['computers', 'minerals']);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, main_exports')
.overlaps('main_exports', ['computers', 'minerals']);
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.overlaps('main_exports', ['computers', 'minerals']);
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.overlaps('main_exports', ['computers', 'minerals']);
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.overlaps('main_exports', ['computers', 'minerals']);
```
@@ -1,29 +0,0 @@
---
id: range
title: 'range()'
slug: /range
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Limits the result to rows within the specified range, inclusive.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.range(0,3);
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.range(0,3);
```
@@ -1,54 +0,0 @@
---
id: rangeadjacent
title: '.rangeAdjacent()'
slug: /rangeadjacent
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeAdjacent('population_range_millions', '[70, 185]');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeAdjacent('population_range_millions', '[70, 185]');
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeAdjacent('population_range_millions', '[70, 185]');
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.rangeAdjacent('population_range_millions', '[70, 185]');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.rangeAdjacent('population_range_millions', '[70, 185]');
```
@@ -1,54 +0,0 @@
---
id: rangegt
title: '.rangeGt()'
slug: /rangegt
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGt('population_range_millions', '[150, 250]');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGt('population_range_millions', '[150, 250]');
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeGt('population_range_millions', '[150, 250]');
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.rangeGt('population_range_millions', '[150, 250]');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.rangeGt('population_range_millions', '[150, 250]');
```
@@ -1,54 +0,0 @@
---
id: rangegte
title: '.rangeGte()'
slug: /rangegte
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGte('population_range_millions', '[150, 250]');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGte('population_range_millions', '[150, 250]');
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeGte('population_range_millions', '[150, 250]');
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.rangeGte('population_range_millions', '[150, 250]');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.rangeGte('population_range_millions', '[150, 250]');
```
@@ -1,54 +0,0 @@
---
id: rangelt
title: '.rangeLt()'
slug: /rangelt
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLt('population_range_millions', '[150, 250]');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLt('population_range_millions', '[150, 250]');
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeLt('population_range_millions', '[150, 250]');
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.rangeLt('population_range_millions', '[150, 250]');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.rangeLt('population_range_millions', '[150, 250]');
```
@@ -1,54 +0,0 @@
---
id: rangelte
title: '.rangeLte()'
slug: /rangelte
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLte('population_range_millions', '[150, 250]');
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLte('population_range_millions', '[150, 250]');
```
### With `update()`
```dart
final data = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeLte('population_range_millions', '[150, 250]');
```
### With `delete()`
```dart
final data = await supabase
.from('countries')
.delete()
.rangeLte('population_range_millions', '[150, 250]');
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final data = await supabase
.rpc('echo_all_countries')
.rangeLte('population_range_millions', [150, 250]);
```
@@ -1,27 +0,0 @@
---
id: removeallchannels
title: 'removeAllChannels()'
slug: /removeallchannels
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Unsubscribes and removes all Realtime channels from Realtime client.
```dart
final statuses = await supabase.removeAllChannels();
```
## Notes
- Removing channels is a great way to maintain the performance of your project's Realtime service as well as your database if you're listening to Postgres changes. Supabase will automatically handle cleanup 30 seconds after a client is disconnected, but unused channels may cause degradation as more clients are simultaneously subscribed.
## Examples
### Remove all channels
```dart
final statuses = await supabase.removeAllChannels();
```
@@ -1,27 +0,0 @@
---
id: removechannel
title: 'removeChannel()'
slug: /removechannel
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Unsubscribes and removes Realtime channel from Realtime client.
```dart
final status = await supabase.removeChannel(channel);
```
## Notes
- Removing a channel is a great way to maintain the performance of your project's Realtime service as well as your database if you're listening to Postgres changes. Supabase will automatically handle cleanup 30 seconds after a client is disconnected, but unused channels may cause degradation as more clients are simultaneously subscribed.
## Examples
### Remove a channel
```dart
final status = await supabase.removeChannel(channel);
```
@@ -1,55 +0,0 @@
---
id: reset-password-email
title: 'Reset Password (Email)'
slug: /reset-password-email
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Sends a reset request to an email address.
```dart
final res = await supabase.auth.api.resetPasswordForEmail('user@example.com');
```
## Notes
Sends a reset request to an email address.
When the user clicks the reset link in the email they will be forwarded to:
`<SITE_URL>#access_token=x&refresh_token=y&expires_in=z&token_type=bearer&type=recovery`
Your app must detect `type=recovery` in the fragment and display a password reset form to the user.
You should then use the access_token in the url and new password to update the user as follows:
```dart
final res = await supabase.auth.api.updateUser(
accessToken,
UserAttributes(password: 'NEW_PASSWORD'),
);
```
## Examples
### Reset password
```dart
final res = await supabase.auth.api.resetPasswordForEmail('user@example.com');
```
### Reset password for Flutter
You can pass `redirectTo` to open the app via deeplink when user opens the password reset email.
```dart
final res = await supabase.auth.api.resetPasswordForEmail(
'user@example.com',
options: AuthOptions(redirectTo: kIsWeb
? null
: 'io.supabase.flutter://reset-callback/'),
);
```
@@ -1,48 +0,0 @@
---
id: rpc
title: 'Stored Procedures: rpc()'
slug: /rpc
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
You can call stored procedures as a "Remote Procedure Call".
That's a fancy way of saying that you can put some logic into your database then call it from anywhere.
It's especially useful when the logic rarely changes - like password resets and updates.
```dart
final data = await supabase
.rpc('hello_world');
```
## Examples
### Call a stored procedure
This is an example invoking a stored procedure.
```dart
final data = await supabase
.rpc('hello_world');
```
### With Parameters
```dart
final data = await supabase
.rpc('echo_city', params: { 'name': 'The Shire' });
```
### With count option
You can specify a count option to get the row count along with your data.
Allowed values for count option are `exact`, `planned` and `estimated`.
```dart
final data = await supabase
.rpc('hello_world')
.execute(count: CountOption.exact);
```
@@ -1,133 +0,0 @@
---
id: select
title: 'Fetch data: select()'
slug: /select
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs vertical filtering with SELECT.
```dart
final data = await supabase
.from('cities')
.select();
```
## Notes
- By default, Supabase projects will return a maximum of 1,000 rows. This setting can be changed in Project API Settings. It's recommended that you keep it low to limit the payload size of accidental or malicious requests. You can use `range()` queries to paginate through your data.
- `select()` can be combined with [Modifiers](/docs/reference/dart/using-modifiers)
- `select()` can be combined with [Filters](/docs/reference/dart/using-filters)
- If using the Supabase hosted platform `apikey` is technically a reserved keyword, since the API gateway will pluck it out for authentication. [It should be avoided as a column name](https://github.com/supabase/supabase/issues/5465).
## Examples
### Getting your data
```dart
final data = await supabase
.from('cities')
.select();
```
### Selecting specific columns
You can select specific fields from your tables.
```dart
final data = await supabase
.from('cities')
.select('name');
```
### Query foreign tables
If your database has relationships, you can query related tables too.
```dart
final data = await supabase
.from('countries')
.select('''
name,
cities (
name
)
''');
```
### Query the same foreign table multiple times
Sometimes you will need to query the same foreign table twice.
In this case, you can use the name of the joined column to identify
which join you intend to use. For convenience, you can also give an
alias for each column. For example, if we had a shop of products,
and we wanted to get the supplier and the purchaser at the same time
(both in the users) table:
```dart
final data = await supabase
.from('products')
.select('''
id,
supplier:supplier_id ( name ),
purchaser:purchaser_id ( name )
''');
```
### Filtering with inner joins
If you want to filter a table based on a child table's values you can use the `!inner()` function. For example, if you wanted
to select all rows in a `message` table which belong to a user with the `username` "Jane":
```dart
final data = await supabase
.from('messages')
.select('*, users!inner(*)')
.eq('users.username', 'Jane');
```
### Querying with count option
You can get the number of rows by using the count option.
Allowed values for count option are [exact](https://postgrest.org/en/stable/api.html#exact-count), [planned](https://postgrest.org/en/stable/api.html#planned-count) and [estimated](https://postgrest.org/en/stable/api.html#estimated-count).
```dart
final data = await supabase
.from('cities')
.select('name')
.execute(count: CountOption.exact);
final count = res.count;
```
### Querying JSON data
If you have data inside of a JSONB column, you can apply select
and query filters to the data values. Postgres offers a
[number of operators](https://www.postgresql.org/docs/current/functions-json.html)
for querying JSON data. Also see
[PostgREST docs](http://postgrest.org/en/v7.0.0/api.html#json-columns) for more details.
```dart
final data = await supabase
.from('users')
.select('''
id, name,
address->street
''')
.eq('address->postcode', 90210);
```
### Return data as CSV
By default the data is returned in JSON format, however you can also request for it to be returned as Comma Separated Values.
```dart
final data = await supabase
.from('users')
.select()
.csv();
```
@@ -1,29 +0,0 @@
---
id: single
title: 'single()'
slug: /single
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieves only one row from the result. Result must be one row (e.g. using limit), otherwise this will result in an error.
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.single();
```
## Examples
### With `select()`
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.single();
```
@@ -1,33 +0,0 @@
---
id: storage-createbucket
title: 'createBucket()'
slug: /storage-createbucket
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Creates a new Storage bucket
```dart
final String bucketId = await supabase
.storage
.createBucket('avatars');
```
## Notes
- Policy permissions required:
- `buckets` permissions: `insert`
- `objects` permissions: none
## Examples
### Create bucket
```dart
final String bucketId = await supabase
.storage
.createBucket('avatars');
```
@@ -1,33 +0,0 @@
---
id: storage-deletebucket
title: 'deleteBucket()'
slug: /storage-deletebucket
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Deletes an existing bucket. A bucket can't be deleted with existing objects inside it. You must first `empty()` the bucket.
```dart
final String result = await supabase
.storage
.deleteBucket('avatars');
```
## Notes
- Policy permissions required:
- `buckets` permissions: `select` and `delete`
- `objects` permissions: none
## Examples
### Delete bucket
```dart
final String result = await supabase
.storage
.deleteBucket('avatars');
```
@@ -1,33 +0,0 @@
---
id: storage-emptybucket
title: 'emptyBucket()'
slug: /storage-emptybucket
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Removes all objects inside a single bucket.
```dart
final String result = await supabase
.storage
.emptyBucket('avatars');
```
## Notes
- Policy permissions required:
- `buckets` permissions: `select`
- `objects` permissions: `select` and `delete`
## Examples
### Empty bucket
```dart
final String result = await supabase
.storage
.emptyBucket('avatars');
```
@@ -1,35 +0,0 @@
---
id: storage-from-createsignedurl
title: 'from.createSignedUrl()'
slug: /storage-from-createsignedurl
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Create signed url to download file without requiring permissions. This URL can be valid for a set number of seconds.
```dart
final String signedUrl = await supabase
.storage
.from('avatars')
.createSignedUrl('avatar1.png', 60);
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `select`
## Examples
### Create Signed URL
```dart
final String signedUrl = await supabase
.storage
.from('avatars')
.createSignedUrl('avatar1.png', 60);
```
@@ -1,35 +0,0 @@
---
id: storage-from-download
title: 'from.download()'
slug: /storage-from-download
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Downloads a file.
```dart
final Uint8List file = await supabase
.storage
.from('avatars')
.download('avatar1.png');
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `select`
## Examples
### Download file
```dart
final Uint8List file = await supabase
.storage
.from('avatars')
.download('avatar1.png');
```
@@ -1,36 +0,0 @@
---
id: storage-from-getpublicurl
title: 'from.getPublicUrl()'
slug: /storage-from-getpublicurl
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieve URLs for assets in public buckets
```dart
final String publicUrl = supabase
.storage
.from('public-bucket')
.getPublicUrl('avatar1.png');
```
## Notes
- The bucket needs to be set to public, either via [updateBucket()](/docs/reference/javascript/storage-updatebucket) or by going to Storage on [app.supabase.com](https://app.supabase.com), clicking the overflow menu on a bucket and choosing "Make public"
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: none
## Examples
### Returns the URL for an asset in a public bucket
```dart
final String publicUrl = supabase
.storage
.from('public-bucket')
.getPublicUrl('avatar1.png');
```
@@ -1,35 +0,0 @@
---
id: storage-from-list
title: 'from.list()'
slug: /storage-from-list
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Lists all the files within a bucket.
```dart
final List<FileObject> objects = await supabase
.storage
.from('avatars')
.list();
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `select`
## Examples
### List files in a bucket
```dart
final List<FileObject> objects = await supabase
.storage
.from('avatars')
.list();
```
@@ -1,35 +0,0 @@
---
id: storage-from-move
title: 'from.move()'
slug: /storage-from-move
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Moves an existing file, optionally renaming it at the same time.
```dart
final String result = await supabase
.storage
.from('avatars')
.move('public/avatar1.png', 'private/avatar2.png');
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `update` and `select`
## Examples
### Move file
```dart
final String result = await supabase
.storage
.from('avatars')
.move('public/avatar1.png', 'private/avatar2.png');
```
@@ -1,35 +0,0 @@
---
id: storage-from-remove
title: 'from.remove()'
slug: /storage-from-remove
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Deletes files within the same bucket
```dart
final List<FileObject> objects = await supabase
.storage
.from('avatars')
.remove(['avatar1.png']);
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `delete` and `select`
## Examples
### Delete file
```dart
final List<FileObject> objects = await supabase
.storage
.from('avatars')
.remove(['avatar1.png']);
```
@@ -1,40 +0,0 @@
---
id: storage-from-update
title: 'from.update()'
slug: /storage-from-update
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Replaces an existing file at the specified path with a new one.
```dart
final avatarFile = File('path/to/local/file');
final String path = await supabase.storage.from('avatars').update(
'public/avatar1.png',
avatarFile,
fileOptions: const FileOptions(cacheControl: '3600', upsert: false),
);
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `update` and `select`
## Examples
### Update file
```dart
final avatarFile = File('path/to/local/file');
final String path = await supabase.storage.from('avatars').update(
'public/avatar1.png',
avatarFile,
fileOptions: const FileOptions(cacheControl: '3600', upsert: false),
);
```
@@ -1,168 +0,0 @@
---
id: storage-from-upload
title: 'from.upload()'
slug: /storage-from-upload
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Uploads a file to an existing bucket.
```dart
final avatarFile = File('path/to/file');
final String path = await supabase.storage.from('avatars').upload(
'public/avatar1.png',
avatarFile,
fileOptions: const FileOptions(cacheControl: '3600', upsert: false),
);
```
## Parameters
<ul className="method-list-group">
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
path
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>string</code>
</span>
</h4>
<div class="method-list-item-description">
The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.
</div>
</li>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
fileBody
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>File</code>
</span>
</h4>
<div class="method-list-item-description">
The body of the file to be stored in the bucket.
</div>
</li>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
fileOptions
</span>
<span className="method-list-item-label-badge false">
optional
</span>
<span className="method-list-item-validation">
<code>FileOptions</code>
</span>
</h4>
<div class="method-list-item-description">
<ul className="method-list-group">
<h5 class="method-list-title method-list-title-isChild expanded">Properties</h5>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
cacheControl
</span>
<span className="method-list-item-label-badge false">
optional
</span>
<span className="method-list-item-validation">
<code>string</code>
</span>
</h4>
<div class="method-list-item-description">
The Cache-Control: max-age=[seconds] seconds value.
</div>
</li>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
contentType
</span>
<span className="method-list-item-label-badge false">
optional
</span>
<span className="method-list-item-validation">
<code>string</code>
</span>
</h4>
<div class="method-list-item-description">
The Content-Type header value. By default, the SDK reads the content type and sets the header.
</div>
</li>
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
upsert
</span>
<span className="method-list-item-label-badge false">
optional
</span>
<span className="method-list-item-validation">
<code>boolean</code>
</span>
</h4>
<div class="method-list-item-description">
Whether to perform an upsert.
</div>
</li>
</ul>
</div>
</li>
</ul>
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `insert`
## Examples
### Upload file
```dart
final avatarFile = File('path/to/file');
final String path = await supabase.storage.from('avatars').upload(
'public/avatar1.png',
avatarFile,
fileOptions: const FileOptions(cacheControl: '3600', upsert: false),
);
```
@@ -1,59 +0,0 @@
---
id: storage-getbucket
title: 'getBucket()'
slug: /storage-getbucket
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieves the details of an existing Storage bucket.
```dart
final Bucket bucket = await supabase
.storage
.getBucket('avatars');
```
## Parameters
<ul className="method-list-group">
<li className="method-list-item">
<h4 className="method-list-item-label">
<span className="method-list-item-label-name">
id
</span>
<span className="method-list-item-label-badge required">
required
</span>
<span className="method-list-item-validation">
<code>string</code>
</span>
</h4>
<div class="method-list-item-description">
The unique identifier of the bucket you would like to retrieve.
</div>
</li>
</ul>
## Notes
- Policy permissions required:
- `buckets` permissions: `select`
- `objects` permissions: none
## Examples
### Get bucket
```dart
final Bucket bucket = await supabase
.storage
.getBucket('avatars');
```
@@ -1,33 +0,0 @@
---
id: storage-listbuckets
title: 'listBuckets()'
slug: /storage-listbuckets
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieves the details of all Storage buckets within an existing product.
```dart
final List<Bucket> buckets = await supabase
.storage
.listBuckets();
```
## Notes
- Policy permissions required:
- `buckets` permissions: `select`
- `objects` permissions: none
## Examples
### List buckets
```dart
final List<Bucket> buckets = await supabase
.storage
.listBuckets();
```
@@ -1,33 +0,0 @@
---
id: storage-updatebucket
title: 'updateBucket()'
slug: /storage-updatebucket
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Updates a new Storage bucket
```dart
final res = await supabase
.storage
.updateBucket('avatars', const BucketOptions(public: false));
```
## Notes
- Policy permissions required:
- `buckets` permissions: `update`
- `objects` permissions: none
## Examples
### Update bucket
```dart
final res = await supabase
.storage
.updateBucket('avatars', const BucketOptions(public: false));
```
@@ -1,106 +0,0 @@
---
id: stream
title: 'stream()'
slug: /stream
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Notifies of data at the queried table.
```dart
supabase.from('countries')
.stream(['id'])
.listen((List<Map<String, dynamic>> data) {
// Do something awesome with the data
});
```
## Notes
- `stream()` will emit the initial data as well as any further change on the database as `Stream` of `List<Map<String, dynamic>>` by combining Postgrest and Realtime.
- Takes a list of primary key columns as its argument.
## Examples
### Listening to a specific table
```dart
supabase.from('countries')
.stream(['id'])
.listen((List<Map<String, dynamic>> data) {
// Do something awesome with the data
});
```
### Listening to a specific rows within a table
You can add up to one `eq` filter to your `stream()` query.
```dart
supabase.from('countries')
.stream(['id'])
.eq('id', '120')
.listen((List<Map<String, dynamic>> data) {
// Do something awesome with the data
});
```
### With `order()`
Allows you to order the queried data by the value of the specified column.
```dart
supabase.from('countries')
.stream(['id'])
.order('name', ascending: true)
.listen((List<Map<String, dynamic>> data) {
// Do something awesome with the data
});
```
### With `limit()`
Allows you to limit the number of rows returned.
```dart
supabase.from('countries')
.stream(['id'])
.order('name', ascending: true)
.limit(10)
.listen((List<Map<String, dynamic>> data) {
// Do something awesome with the data
});
```
### Using `stream()` with `StreamBuilder`
When using `stream()` with a `StreamBuilder` within your Flutter application, make sure to store your stream in a variable to prevent refetching upon rebuilding.
```dart
final supabase = Supabase.instance.client;
class MyWidget extends StatefulWidget {
const MyWidget({Key? key}) : super(key: key);
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
// Persist the stream in a local variable to prevent refetching upon rebuilds
final _stream = supabase.from('countries').stream(['id']);
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _stream,
builder: (context, snapshot) {
// Return your widget with the data from the snapshot
},
);
}
}
```
@@ -1,120 +0,0 @@
---
id: subscribe
title: 'on().subscribe()'
slug: /subscribe
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Subscribe to realtime changes in your database.
```dart
supabase.channel('*').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: '*', schema: '*'), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
## Notes
- Realtime is disabled by default for new Projects for better database performance and security. You can turn it on by managing replication.
Row level security is not applied to delete statements.
- If you want to receive the "previous" data for updates and deletes, you will need to set REPLICA IDENTITY to FULL, like this: ALTER TABLE your_table REPLICA IDENTITY FULL;
- When a delete occurs, the contents of old_record will be broadcast to all subscribers to that table so ensure that each table's replica identity only contains information that is safe to expose publicly.
- The channel name must exactly match the schema/table/filter you want to listen to separated by colons. See below examples for additional context.
## Examples
### Listen to all database changes
```dart
supabase.channel('*').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: '*', schema: '*'), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
### Listening to a specific table
```dart
supabase.channel('public:countries').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: '*', schema: 'public', table: 'countries'), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
### Listening to inserts
```dart
supabase.channel('public:countries').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: 'INSERT', schema: 'public', table: 'countries'), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
### Listening to updates
By default, Supabase will send only the updated record. If you want to receive the previous values as well you can
enable full replication for the table you are listening too:
```sql
alter table "your_table" replica identity full;
```
```dart
supabase.channel('public:countries').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: 'UPDATE', schema: 'public', table: 'countries'), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
### Listening to deletes
By default, Supabase does not send deleted records. If you want to receive the deleted record you can
enable full replication for the table you are listening too:
```sql
alter table "your_table" replica identity full;
```
```dart
supabase.channel('public:countries').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: 'DELETE', schema: 'public', table: 'countries'), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
### Listening to multiple events
You can chain listeners if you want to listen to multiple events for each table.
```dart
supabase.channel('public:countries').on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: 'INSERT', schema: 'public', table: 'countries'),
(payload, [ref]) {
print('Change received: ${payload.toString()}');
}).on(RealtimeListenTypes.postgresChanges,
ChannelFilter(event: 'DELETE', schema: 'public', table: 'countries'),
(payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
### Listening to row level changes
You can listen to individual rows using the format `{table}:{col}=eq.{val}` - where `{col}` is the column name, and `{val}` is the value which you want to match.
```dart
supabase.channel('public:countries:id=eq.200').on(
RealtimeListenTypes.postgresChanges,
ChannelFilter(
event: 'UPDATE',
schema: 'public',
table: 'countries',
filter: 'id=eq.200',
), (payload, [ref]) {
print('Change received: ${payload.toString()}');
}).subscribe();
```
@@ -1,73 +0,0 @@
---
id: textsearch
title: '.textSearch()'
slug: /textsearch
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose tsvector value on the stated `column` matches to_tsquery(query).
## Examples
### Text search
```dart
final data = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat' & 'cat'",
config: 'english'
);
```
### Basic normalization
Uses PostgreSQL's `plainto_tsquery` function.
```dart
final data = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat' & 'cat'",
type: TextSearchType.plain,
config: 'english'
);
```
### Full normalization
Uses PostgreSQL's `phraseto_tsquery` function.
```dart
final data = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat' & 'cat'",
type: TextSearchType.phrase,
config: 'english'
);
```
### Full normalization
Uses PostgreSQL's `websearch_to_tsquery` function.
This function will never raise syntax errors, which makes it possible to use raw user-supplied input for search, and can be used
with advanced operators.
- `unquoted text`: text not inside quote marks will be converted to terms separated by & operators, as if processed by plainto_tsquery.
- `"quoted text"`: text inside quote marks will be converted to terms separated by <-> operators, as if processed by phraseto_tsquery.
- `OR`: the word “or” will be converted to the | operator.
- `-`: a dash will be converted to the ! operator.
```dart
final data = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat or cat'",
type: TextSearchType.websearch,
config: 'english'
);
```
@@ -1,52 +0,0 @@
---
id: update
title: 'Modify data: update()'
slug: /update
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs an UPDATE on the table.
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Middle Earth' })
.match({ 'name': 'Auckland' });
```
## Notes
- `update()` should always be combined with [Filters](/docs/reference/dart/using-filters) to target the item(s) you wish to update.
## Examples
### Updating your data
```dart
final data = await supabase
.from('cities')
.update({ 'name': 'Middle Earth' })
.match({ 'name': 'Auckland' });
```
### Updating JSON data
Postgres offers a
[number of operators](https://www.postgresql.org/docs/current/functions-json.html)
for working with JSON data. Right now it is only possible to update an entire JSON document,
but we are [working on ideas](https://github.com/PostgREST/postgrest/issues/465) for updating individual keys.
```dart
final data = await supabase
.from('users')
.update({
'address': {
'street': 'Melrose Place',
'postcode': 90210
}
})
.eq('address->postcode', 90210);
```
@@ -1,59 +0,0 @@
---
id: upsert
title: 'Upsert data: upsert()'
slug: /upsert
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs an UPSERT into the table.
```dart
final data = await supabase
.from('messages')
.upsert({ 'id': 3, 'message': 'foo', 'username': 'supabot' });
```
## Notes
- Primary keys should be included in the data payload in order for an update to work correctly.
- Primary keys must be natural, not surrogate. There are however, [workarounds](https://github.com/PostgREST/postgrest/issues/1118) for surrogate primary keys.
## Examples
### Upsert your data
```dart
final data = await supabase
.from('messages')
.upsert({ 'id': 3, 'message': 'foo', 'username': 'supabot' });
```
### Upserting into tables with constraints
Running the following will cause supabase to upsert data into the `users` table.
If the username 'supabot' already exists, the `onConflict` argument tells supabase to overwrite that row
based on the column passed into `onConflict`.
```dart
final data = await supabase
.from('users')
.upsert({ 'username': 'supabot' }, { 'onConflict': 'username' });
```
### Return the exact number of rows
Allowed values for count option are `exact`, `planned` and `estimated`.
```dart
final data = await supabase
.from('users')
.upsert({
'id': 3,
'message': 'foo',
'username': 'supabot'
})
.execute(count: CountOption.exact);
```
@@ -1,41 +0,0 @@
---
id: using-filters
title: 'Using Filters'
slug: /using-filters
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Filters can be used on `select()`, `update()`, and `delete()` queries.
If a Stored Procedure returns a table response, you can also apply filters.
### Applying Filters
You must apply your filters to the end of your query. For example:
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'The Shire') // Correct;
final data = await supabase
.from('cities')
.eq('name', 'The Shire') // Incorrect
.select('name, country_id');
```
### Chaining
Filters can be chained together to produce advanced queries. For example:
```dart
final data = await supabase
.from('cities')
.select('name, country_id')
.gte('population', 1000)
.lt('population', 10000);
```
@@ -1,13 +0,0 @@
---
id: using-modifiers
title: 'Using Modifiers'
slug: /using-modifiers
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Modifiers can be used on `select()` queries.
If a Stored Procedure returns a table response, you can also apply modifiers to the `rpc()` function.
@@ -1,8 +1,7 @@
---
id: initializing
title: 'Initializing'
slug: /initializing
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
slug: initializing
---
import Tabs from '@theme/Tabs'
+1 -2
View File
@@ -1,8 +1,7 @@
---
id: installing
title: 'Installing'
slug: /installing
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
slug: installing
---
import Tabs from '@theme/Tabs'
@@ -1,29 +0,0 @@
---
id: auth-onauthstatechange
title: 'auth.onAuthStateChange()'
slug: /auth-onauthstatechange
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Receive a notification every time an auth event happens.
```dart
final subscription = supabase.auth.onAuthStateChange((event, session) {
print(session?.user?.id);
// handle auth state change
});
```
## Examples
### Listen to auth changes
```dart
final subscription = supabase.auth.onAuthStateChange((event, session) {
print(session?.user?.id);
// handle auth state change
});
```
@@ -1,23 +0,0 @@
---
id: auth-session
title: 'auth.session()'
slug: /auth-session
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Returns the session data, if there is an active session.
```dart
final session = supabase.auth.session();
```
## Examples
### Get the session data
```dart
final session = supabase.auth.session();
```
@@ -1,59 +0,0 @@
---
id: auth-signin
title: 'auth.signIn()'
slug: /auth-signin
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Log in an existing user, or login via a third-party provider.
```dart
final res = await supabase.auth.signIn(email: 'example@email.com', password: 'example-password');
final user = res.data?.user;
final error = res.error;
```
## Notes
- A user can sign up via email, phone number.
- If you provide `email` without a `password`, the user will be sent a magic link.
- The magic link's destination URL is determined by the SITE_URL config variable. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
- Similarly, if you provide `phone` without a `password`, the user will be sent a one time password.
- If you are looking to sign users in with OAuth in Flutter apps, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
## Examples
### Sign in with email.
```dart
final res = await supabase.auth.signIn(email: 'example@email.com', password: 'example-password');
final user = res.data?.user;
final error = res.error;
```
### Sign in with magic link.
If email is provided, but no password is provided, the user will be sent a "magic link" to their email address, which they can click to open your application with a valid session. By default, a given user can only request a Magic Link once every 60 seconds.
```dart
final res = await supabase.auth.signIn(email: 'example@email.com');
final error = res.error;
```
### Get OAuth sign in URL.
Passing provider parameter to `signIn()` will return a URL to sign your user in via OAuth.
If you are looking to sign in a user via OAuth on Flutter app, go to [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider).
```dart
final res = await supabase.auth.signIn(provider: Provider.github);
final url = res.data?.url;
final error = res.error;
```
@@ -1,63 +0,0 @@
---
id: auth-signinwithprovider
title: 'auth.signInWithProvider()'
slug: /auth-signinwithprovider
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Signs the user in using third party OAuth providers.
```dart
final res = await supabase.auth.signInWithProvider(Provider.github);
final error = res.error;
```
## Notes
- `auth.signInWithProvider()` is only available on `supabase_flutter`
- It will open the browser to the relevant login page.
## Examples
### Sign in with provider.
```dart
final res = await supabase.auth.signInWithProvider(Provider.github);
final error = res.error;
```
### With `redirectTo`
Specify the redirect link to bring back the user via deeplink.
Note that `redirectTo` should be null for Flutter Web.
```dart
final res = await supabase.auth.signInWithProvider(
Provider.github,
options: AuthOptions(
redirectTo: kIsWeb
? null
: 'io.supabase.flutter://reset-callback/'),
);
final error = res.error;
```
### With scopes
If you need additional data from an OAuth provider, you can include a space-separated list of scopes in your request to get back an OAuth provider token.
You may also need to specify the scopes in the provider's OAuth app settings, depending on the provider.
```dart
const { user, session, error } = await supabase.auth.signIn({
provider: 'github'
}, {
scopes: 'repo gist notifications'
})
const oAuthToken = session.provider_token // use to access provider API
```
@@ -1,27 +0,0 @@
---
id: auth-signout
title: 'auth.signOut()'
slug: /auth-signout
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Signs out the current user, if there is a logged in user.
```dart
final res = await supabase.auth.signOut();
final error = res.error;
```
## Examples
### Sign out
```dart
final res = await supabase.auth.signOut();
final error = res.error;
```
@@ -1,40 +0,0 @@
---
id: auth-signup
title: 'auth.signUp()'
slug: /auth-signup
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Creates a new user.
```dart
final res = await supabase.auth.signUp('example@email.com', 'example-password');
final user = res.data?.user;
final error = res.error;
```
## Notes
- By default, the user will need to verify their email address before logging in. If you would like to change this, you can disable "Email Confirmations" by going to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
- If "Email Confirmations" is turned on, a user is returned but session will be null
- If "Email Confirmations" is turned off, both a `user` and a `session` will be returned
- When the user confirms their email address, they will be redirected to localhost:3000 by default. To change this, you can go to Authentication -> Settings on [app.supabase.com](https://app.supabase.com)
## Examples
### Sign up.
```dart
final res = await supabase.auth.signUp('example@email.com', 'example-password');
final user = res.data?.user;
final error = res.error;
```
### Sign up with third-party providers.
If you are using Flutter, you can sign up with OAuth providers using the [`signInWithProvider()`](/docs/reference/dart/auth-signinwithprovider) method available on `supabase_flutter`.
@@ -1,36 +0,0 @@
---
id: auth-update
title: 'auth.update()'
slug: /auth-update
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Updates user data, if there is a logged in user.
```dart
final res = await supabase.auth.update(
UserAttributes(data: {'hello': 'world'})
);
final error = res.error;
```
## Notes
It's generally better to store user data in a table inside your public schema (i.e. `public.users`).
Use the `update()` method if you have data which rarely changes or is specific only to the logged in user.
## Examples
### Update a user's metadata.
```dart
final res = await supabase.auth.update(
UserAttributes(data: {'hello': 'world'})
);
final error = res.error;
```
@@ -1,23 +0,0 @@
---
id: auth-user
title: 'auth.user()'
slug: /auth-user
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Returns the user data, if there is a logged in user.
```dart
final user = supabase.auth.user();
```
## Examples
### Get the logged in user
```dart
final user = supabase.auth.user();
```
@@ -1,59 +0,0 @@
---
id: containedby
title: '.containedBy()'
slug: /containedby
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, main_exports')
.containedBy('main_exports', ['cars', 'food', 'machine'])
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, main_exports')
.containedBy('main_exports', ['cars', 'food', 'machine'])
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.containedBy('main_exports', ['orks', 'surveillance', 'evil'])
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.containedBy('main_exports', ['cars', 'food', 'machine'])
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.containedBy('main_exports', ['cars', 'food', 'machine'])
.execute();
```
@@ -1,59 +0,0 @@
---
id: contains
title: '.contains()'
slug: /contains
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, main_exports')
.contains('main_exports', ['oil'])
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, main_exports')
.contains('main_exports', ['oil'])
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.contains('main_exports', ['oil'])
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.contains('main_exports', ['oil'])
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.contains('main_exports', ['oil'])
.execute();
```
@@ -1,35 +0,0 @@
---
id: delete
title: 'Delete data: delete()'
slug: /delete
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs a DELETE on the table.
```dart
final res = await supabase
.from('cities')
.delete()
.match({ 'id': 666 })
.execute();
```
## Notes
- `delete()` should always be combined with [Filters](/docs/reference/dart/using-filters) to target the item(s) you wish to delete.
## Examples
### Delete records
```dart
final res = await supabase
.from('cities')
.delete()
.match({ 'id': 666 })
.execute();
```
@@ -1,61 +0,0 @@
---
id: eq
title: '.eq()'
slug: /eq
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` exactly matches the specified `value`.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'The shire')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'The shire')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.eq('name', 'San Francisco')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.eq('name', 'Mordor')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.eq('name', 'San Francisco')
.execute();
```
@@ -1,80 +0,0 @@
---
id: filter
title: '.filter()'
slug: /filter
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose `column` satisfies the filter.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.filter('name', 'in', '("Paris","Tokyo")')
.execute();
```
## Notes
- `.filter()` expects you to use the raw [PostgREST syntax](https://postgrest.org/en/stable/api.html#horizontal-filtering-rows) for the filter names and values, so it should only be used as an escape hatch in case other filters don't work.
```dart
.filter('arraycol','cs','{"a","b"}') // Use Postgres array {} and 'cs' for contains.
.filter('rangecol','cs','(1,2]') // Use Postgres range syntax for range column.
.filter('id','in','(6,7)') // Use Postgres list () and 'in' for in_ filter.
.filter('id','cs','{${mylist.join(',')}}') // You can insert a Dart array list.
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.filter('name', 'in', '("Paris","Tokyo")')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.filter('name', 'in', '("Paris","Tokyo")')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.filter('name', 'in', '("Paris","Tokyo")')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.filter('name', 'in', '("Paris","Tokyo")')
```
### Filter embedded resources
```dart
final res = await supabase
.from('cities')
.select('name, countries ( name )')
.filter('countries.name', 'in', '("France","Japan")')
.execute();
```
@@ -1,23 +0,0 @@
---
id: getsubscriptions
title: 'getSubscriptions()'
slug: /getsubscriptions
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Returns an array of all your subscriptions.
```dart
final subscriptions = supabase.getSubscriptions();
```
## Examples
### Get all subscriptions
```dart
final subscriptions = supabase.getSubscriptions();
```
@@ -1,61 +0,0 @@
---
id: gt
title: '.gt()'
slug: /gt
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is greater than the specified `value`.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.gt('country_id', 250)
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.gt('country_id', 250)
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.gt('country_id', 250)
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.gt('country_id', 250)
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.gt('country_id', 250)
.execute();
```
@@ -1,61 +0,0 @@
---
id: gte
title: '.gte()'
slug: /gte
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is greater than or equal to the specified `value`.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.gte('country_id', 250)
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.gte('country_id', 250)
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.gte('country_id', 250)
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.gte('country_id', 250)
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.gte('country_id', 250)
.execute();
```
@@ -1,61 +0,0 @@
---
id: ilike
title: '.ilike()'
slug: /ilike
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value in the stated `column` matches the supplied `pattern` (case insensitive).
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.ilike('name', '%la%')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.ilike('name', '%la%')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.ilike('name', '%la%')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.ilike('name', '%la%')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.ilike('name', '%la%')
.execute();
```
@@ -1,63 +0,0 @@
---
id: in_
title: '.in_()'
slug: /in_
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose value on the stated `column` is found on the specified `values`.
`is_` and `in_` filter methods are suffixed with `_` to avoid collisions with reserved keywords.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.in_('name', ['Rio de Janeiro', 'San Francisco'])
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.in_('name', ['Rio de Janeiro', 'San Francisco'])
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.in_('name', ['Rio de Janeiro', 'San Francisco'])
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.in_('name', ['Rio de Janeiro', 'San Francisco'])
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.in_('name', ['Rio de Janeiro', 'San Francisco'])
.execute();
```
@@ -1,11 +0,0 @@
---
id: index
title: 'Getting started'
slug: getting-started
custom_edit_url: ../../spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Supabase Dart.
@@ -1,37 +0,0 @@
---
id: initializing
title: 'Initializing'
slug: /initializing
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
## Dart
You can initialize a new Supabase client using the `SupabaseClient()` method.
The Supabase client is your entrypoint to the rest of the Supabase functionality
and is the easiest way to interact with everything we offer within the Supabase ecosystem.
## Flutter
For `supabase_flutter`, you will be using the static `initialize()` method on `Supabase` class.
## Examples
### Dart SupabaseClient()
```dart
final supabase = SupabaseClient('https://xyzcompany.supabase.co', 'public-anon-key');
```
### Flutter initialize()
```dart title="main.dart"
Future<void> main() async {
await Supabase.initialize(url: 'https://xyzcompany.supabase.co', anonKey: 'public-anon-key');
runApp(MyApp());
}
```
@@ -1,48 +0,0 @@
---
id: insert
title: 'Create data: insert()'
slug: /insert
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs an INSERT into the table.
```dart
final res = await supabase
.from('cities')
.insert([
{'name': 'The Shire', 'country_id': 554}
]).execute();
```
## Notes
- By default, every time you run `insert()`, the client library will make a `select` to return the full record.
This is convenient, but it can also cause problems if your Policies are not configured to allow the `select` operation.
If you are using Row Level Security and you are encountering problems, try setting the `returning` param to `minimal`.
## Examples
### Create a record
```dart
final res = await supabase
.from('cities')
.insert([
{'name': 'The Shire', 'country_id': 554}
]).execute();
```
### Bulk create
```dart
final res = await supabase
.from('cities')
.insert([
{'name': 'The Shire', 'country_id': 554},
{'name': 'Rohan', 'country_id': 555},
]).execute();
```
@@ -1,32 +0,0 @@
---
id: installing
title: 'Installing'
slug: /installing
custom_edit_url: https://github.com/supabase/supabase/edit/master/spec/supabase_dart_v1_legacy.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
## Dart
Dart libraries are built and supported by the community.
```bash
dart pub add supabase
```
Find the source code on [GitHub](https://github.com/supabase/supabase-dart).
## Flutter
For Flutter project, you can use [supabase_flutter](https://github.com/supabase/supabase-flutter).
```bash
flutter pub add supabase_flutter
```
`supabase_flutter` plugin uses `supabase` plugin internally, and it adds some Flutter specific functionality such as handling deeplinks coming back from magic link verifications.
If you are creating a Flutter application, we recommend using `supabase_flutter` instead of `supabase`.
For the most part `supabase_flutter` shares the same API as `supabase` with few exceptions such as initialization or OAuth sign in.
Loaded 100 of 561 files, more files were not shown because too many files have changed in this diff. Show more