Pull master and resolve conflicts

This commit is contained in:
Joshen Lim committed 2022-10-14 15:14:17 +08:00
commit d1061ba196
2852 files changed
+374550 -495369

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
@@ -1,2 +1,4 @@
/studio/ @supabase/frontend
/apps/www/ @supabase/frontend
/apps/reference/ @supabase/docs
/spec/ @supabase/docs
+3 -9
View File
@@ -4,12 +4,10 @@
name: Docs Compilation Check
on:
push:
branches: [master]
pull_request:
branches: [master]
paths:
- 'web/**'
- 'apps/reference/**'
jobs:
build:
@@ -37,12 +35,8 @@ jobs:
- name: Install Deps
run: npm ci
working-directory: ./web
- name: Pull Specs
run: make
working-directory: ./web/spec
working-directory: ./apps/reference
- name: Build
run: npm run build
working-directory: ./web
working-directory: ./apps/reference
+17 -17
View File
@@ -1,15 +1,9 @@
# This is a basic workflow to help you get started with Actions
name: Tests
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches: [master]
pull_request:
branches: [master]
# Allows you to run this workflow manually from the Actions tab
schedule:
- cron: '0 4/6 * * *'
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
@@ -41,17 +35,23 @@ jobs:
- name: Install dependencies
run: npm ci
- name: Run infrastructure
run: |
cp ../docker/.env.example ../docker/.env
npm run docker:up
- uses: supabase/setup-cli@v1
- run: supabase start
- name: Run Test
run: npm run test
continue-on-error: true
run: npm run test:local
env:
SUPABASE_DB_PORT: 54322
SUPABASE_DB_PASS: postgres
SUPABASE_DB_HOST: localhost
SUPABASE_GOTRUE: http://localhost:54321
SUPABASE_URL: http://localhost:54321
SUPABASE_KEY_ANON: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24ifQ.625_WdcF3KHqz5amU0x2X5WWHP-OEs_4qj0ssLNHzTs
SUPABASE_KEY_ADMIN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSJ9.vI9obAHOGyVVKa3pD--kJlyxp-Z2zV9UUMAhKpNLAcU
- name: Stop infrastructure
run: npm run docker:down
if: always()
run: supabase stop
- name: Get Allure history
uses: actions/checkout@v2
@@ -73,7 +73,7 @@ jobs:
keep_reports: 50
- name: Deploy report to Github Pages
if: ${{ !github.event.pull_request.head.repo.fork }}
if: always()
uses: peaceiris/actions-gh-pages@v2
env:
EXTERNAL_REPOSITORY: supabase/test-reports
@@ -82,7 +82,7 @@ jobs:
PUBLISH_DIR: allure-history
- name: Post the link to the report
if: ${{ !github.event.pull_request.head.repo.fork }}
if: always()
uses: Sibz/github-status-action@v1
with:
authToken: ${{ secrets.GITHUB_TOKEN }}
-35
View File
@@ -1,35 +0,0 @@
name: Publish to Docker Hub
on:
push:
branches:
- studio
paths:
- 'studio/**'
workflow_dispatch:
jobs:
publish:
name: Publish to Docker Hub
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: docker/setup-qemu-action@v1
with:
platforms: amd64,arm64
- uses: docker/setup-buildx-action@v1
- uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: docker/build-push-action@v2
with:
context: studio
platforms: linux/amd64,linux/arm64
push: true
tags: supabase/studio:latest
target: production
+57
View File
@@ -0,0 +1,57 @@
name: Publish to Image Registry
on:
push:
tags:
- '*'
workflow_dispatch:
inputs:
version:
description: 'Image tag'
required: true
type: string
jobs:
publish:
runs-on: ubuntu-latest
steps:
- id: meta
uses: docker/metadata-action@v4
with:
images: |
supabase/studio
public.ecr.aws/t3w2s2c9/studio
flavor: |
latest=false
tags: |
type=ref,event=tag
type=raw,value=${{ inputs.version }},enable=${{ github.event_name != 'push' }}
- uses: docker/setup-qemu-action@v2
with:
platforms: amd64,arm64
- uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to ECR
uses: docker/login-action@v2
with:
registry: public.ecr.aws
username: ${{ secrets.PROD_ACCESS_KEY_ID }}
password: ${{ secrets.PROD_SECRET_ACCESS_KEY }}
- uses: docker/build-push-action@v3
with:
push: true
context: '{{defaultContext}}:studio'
target: production
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
strategy:
matrix:
node-version: [14.x]
node-version: [16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
+17 -16
View File
@@ -5,31 +5,32 @@ name: Studio Unit Tests
on:
push:
branches: [ master ]
branches: [master]
paths:
- 'studio/**'
pull_request:
branches: [ master ]
branches: [master]
paths:
- 'studio/**'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
node-version: [16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install deps
run: npm i
working-directory: ./studio
- name: Run tests
run: npm test
working-directory: ./studio
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install deps
run: npm ci
working-directory: ./
- name: Run tests
run: npm run test:studio
working-directory: ./
Executable
+1
View File
@@ -0,0 +1 @@
cookie
+70 -74
View File
@@ -1,64 +1,60 @@
# Developing Supabase
- [Development Setup](#development-setup)
- [Installing Dependencies](#installing-dependencies)
- [Forking Supabase on GitHub](#forking-supabase-on-github)
- [Building Supabase](#building-supabase)
- [Choosing Directory](#choosing-directory)
- [Start a Development Server](#start-a-development-server)
- [Supabase Website Development Server](#supabase-website-development-server)
- [Supabase Docs Development Server](#supabase-docs-development-server)
- [Supabase Studio Development Server](#supabase-studio-development-server)
1. [Development setup](#development-setup)
- [Install dependencies](#install-dependencies)
- [Fork the repository](#fork-the-repository)
1. [Build Supabase](#build-supabase)
- [Choose a directory](#choose-a-directory)
1. [Start a development server](#start-a-development-server)
- [Supabase Website](#supabase-website)
- [Supabase Docs](#supabase-docs)
- [Supabase Studio](#supabase-studio)
1. [Create a pull request](#create-a-pull-request)
- [Common tasks](#common-tasks)
- [Add a redirect](#add-a-redirect)
- [Monorepo](#monorepo)
- [Getting started](#getting-started)
- [Shared components](#shared-components)
- [Installing packages](#installing-packages)
- [Development](#development)
- [Common Tasks](#common-tasks)
- [Adding Redirects](#adding-redirects)
- [Finally](#finally)
- [Community Channels](#community-channels)
- [Community channels](#community-channels)
## Development Setup
## Development setup
First off, thanks for your interest in Supabase and for wanting to contribute! before you begin, read the
Thanks for your interest in Supabase and for wanting to contribute! Before you begin, read the
[code of conduct](https://github.com/supabase/.github/blob/main/CODE_OF_CONDUCT.md) and check out the
[existing issues](https://github.com/supabase/supabase/issues).
This document describes how to set up your development environment to build and test Supabase.
### Installing Dependencies
### Install dependencies
Before you can build Supabase, you must install and configure the following dependencies on your
machine:
You need to install and configure the following dependencies on your machine to build Supabase:
- [Git](http://git-scm.com/)
- [Node.js v16.x (LTS)](http://nodejs.org)
- [npm](https://www.npmjs.com/) version 7+ or [Yarn](https://yarnpkg.com/)
- [npm](https://www.npmjs.com/) version 7+.
### Fork the repository
### Forking Supabase on GitHub
To contribute code to Supabase, you must fork the [Supabase Repository](https://github.com/supabase/supabase).
To contribute code to Supabase, you must fork the [Supabase Repository](https://github.com/supabase/supabase). After you fork the repository, you may now begin editing the source code.
## Build Supabase
## Building Supabase
To build Supabase, you clone the source code repository:
2. Clone your GitHub forked repository:
1. Clone your GitHub forked repository:
```sh
git clone https://github.com/<github_username>/supabase.git
```
3. Go to the Supabase directory:
1. Go to the Supabase directory:
```sh
cd supabase
```
### Choosing Directory
### Choose a directory
Before you start a development server, you must choose if you want to work on the [Supabase Website](https://supabase.com), [Supabase Docs](https://supabase.com/docs), or [Supabase Studio](https://app.supabase.com).
Choose if you want to work on the [Supabase Website](https://supabase.com), [Supabase Docs](https://supabase.com/docs), or [Supabase Studio](https://app.supabase.com).
1. Go to the [Supabase Website](https://supabase.com) directory
@@ -69,7 +65,7 @@ Before you start a development server, you must choose if you want to work on th
Go to the [Supabase Docs](https://supabase.com/docs) directory
```sh
cd web
cd apps/reference
```
Go to the [Supabase Studio](https://app.supabase.com) directory
@@ -78,7 +74,7 @@ Before you start a development server, you must choose if you want to work on th
cd studio
```
2. Install npm dependencies:
1. Install npm/yarn dependencies:
npm
@@ -92,19 +88,19 @@ Before you start a development server, you must choose if you want to work on th
yarn install
```
## Start a Development Server
## Start a development server
To debug code, and to see changes in real time, it is often useful to have a local HTTP server. Click one of the three links below to choose which development server you want to start.
To debug code and to see your changes in real time, it is often useful to have a local HTTP server. Click one of the three links below to choose which development server you want to start.
- [Supabase Website](#Supabase-Website-Development-Server)
- [Supabase Docs](#Supabase-Docs-Development-Server)
- [Supabase Studio](#Supabase-Studio-Development-Server)
- [Supabase Website](#supabase-website)
- [Supabase Docs](#supabase-docs)
- [Supabase Studio](#supabase-studio)
### Supabase Website Development Server
### Supabase Website
The website is moving to a new monorepo setup. See the [Monorepo](#monorepo) section below.
### Supabase Docs Development Server
### Supabase Docs
1. Build development server
@@ -120,7 +116,7 @@ The website is moving to a new monorepo setup. See the [Monorepo](#monorepo) sec
yarn build
```
2. Start development server
1. Start development server
npm
@@ -134,13 +130,9 @@ The website is moving to a new monorepo setup. See the [Monorepo](#monorepo) sec
yarn start
```
3. To access the local server, enter the following URL into your web browser:
1. Access the local server in your web browser at http://localhost:3010/docs.
```sh
http://localhost:3005/docs
```
### Supabase Studio Development Server
### Supabase Studio
1. Start development server
@@ -156,13 +148,22 @@ The website is moving to a new monorepo setup. See the [Monorepo](#monorepo) sec
yarn dev
```
2. To access the local server, enter the following URL into your web browser:
1. Access the local server in your web browser at http://localhost:8082/.
See the [Supabase Studio readme](./studio/README.md) for more information.
```sh
http://localhost:8082/
```
## Create a pull request
For more information on Supabase Studio, see the [Supabase Studio readme](./studio/README.md).
After making your changes, open a pull request (PR). Once you submit your pull request, others from the Supabase team/community will review it with you.
Did you have an issue, like a merge conflict, or don't know how to open a pull request? Check out [GitHub's pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests) tutorial on how to resolve merge conflicts and other issues. Once your PR has been merged, you will be proudly listed as a contributor in the [contributor chart](https://github.com/supabase/supabase/graphs/contributors).
---
## Common tasks
### Add a redirect
Create a new entry in the [`next.config.js`](https://github.com/supabase/supabase/blob/master/apps/www/next.config.js) file in our main site.
## Monorepo
@@ -179,16 +180,12 @@ npm run dev # start all the applications
Then edit and visit any of the following sites:
- `/apps/www`: http://localhost:3000
- The main website.
- `/apps/reference`: http://localhost:3010
- Reference Documentation.
- `/apps/temp-docs`: http://localhost:3001
- We are migrating the docs to a Next.js application.
- `/apps/temp-community-forum`: http://localhost:3002
- pulls all our github discussions into a nextjs site. Temporary/POC
- `/apps/temp-community-tutorials`: http://localhost:3003
- pulls all our DEV articles (which community members can write) into a nextjs site. Temporary/POC
Site | Directory | Description | Local development server
---- | --------- | ----------- | ------------------------
[supabase.com](https://supabase.com) | `/apps/www` | The main website | http://localhost:3000
[supabase.com/docs](https://supabase.com/docs) | `apps/reference` | Guides and Reference documentaion | http://localhost:3010/docs
[POC] Community forum | `/apps/temp-community-forum` | GitHub Discussions in a Next.js site | http://localhost:3002
[POC] DEV articles site | `/apps/temp-community-tutorials` | A Next.js site for our DEV articles (which community members can write) | http://localhost:3003
### Shared components
@@ -198,6 +195,15 @@ The monorepo has a set of shared components under `/packages`:
- `/packages/config`: All shared config
- `/packages/spec`: Generates documentation using spec files.
- `/packages/tsconfig`: Shared Typescript settings
- `/packages/ui`: Shared UI components (formerly @supabase/ui)
To use these 'packages', or any of their components from a Next.JS app, you must use `next-transpile-modules` in the `next.config.js` file. This looks like:
```tsx
// next.config.js
const withTM = require('next-transpile-modules')(['ui', 'common'])
module.exports = withTM({})
```
### Installing packages
@@ -216,18 +222,8 @@ You do not need to install `devDependencies` in each workspace. These can all be
`npm run dev`
## Common Tasks
---
### Adding Redirects
## Community channels
To add a redirect, simple create a new entry in the [`next.config.js`](https://github.com/supabase/supabase/blob/master/apps/www/next.config.js) file in our main site.
## Finally
After making your changes to the file(s) you'd like to update, it's time to open a pull request. Once you submit your pull request, others from the Supabase team/community will review it with you.
Did you have an issue, like a merge conflict, or don't know how to open a pull request? Check out [GitHub's pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests) tutorial on how to resolve merge conflicts and other issues. Once your PR has been merged, you will be proudly listed as a contributor in the [contributor chart](https://github.com/supabase/supabase/graphs/contributors)
## Community Channels
Stuck somewhere? Have any questions? please join the [Discord Community Server](https://discord.supabase.com/) or the [Github Discussions](https://github.com/supabase/supabase/discussions). We are here to help!
Stuck somewhere? Have any questions? Join the [Discord Community Server](https://discord.supabase.com/) or the [Github Discussions](https://github.com/supabase/supabase/discussions). We are here to help!
+20 -6
View File
@@ -45,7 +45,7 @@ To see how to Contribute, visit [Getting Started](./DEVELOPERS.md)
We are currently in Public Beta. Watch "releases" of this repo to get notified of major updates.
<kbd><img src="https://gitcdn.link/repo/supabase/supabase/master/web/static/watch-repo.gif" alt="Watch this repo"/></kbd>
<kbd><img src="https://raw.githubusercontent.com/supabase/supabase/d5f7f413ab356dc1a92075cb3cee4e40a957d5b1/web/static/watch-repo.gif" alt="Watch this repo"/></kbd>
---
@@ -58,7 +58,7 @@ Supabase is a combination of open source tools. We’re building the features of
Supabase is a [hosted platform](https://app.supabase.com). You can sign up and start using Supabase without installing anything.
You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and [develop locally](https://supabase.com/docs/guides/local-development).
![Architecture](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png)
![Architecture](https://user-images.githubusercontent.com/70828596/187547862-ffa9d058-0c3a-4851-a3e7-92ccfca4b596.png)
- [PostgreSQL](https://www.postgresql.org/) is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance.
- [Realtime](https://github.com/supabase/realtime) is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Realtime polls Postgres' built-in replication functionality for database changes, converts changes to JSON, then broadcasts the JSON over websockets to authorized clients.
@@ -76,7 +76,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<tr>
<th>Language</th>
<th>Client</th>
<th colspan="4">Feature-Clients (bundled in Supabase client)</th>
<th colspan="5">Feature-Clients (bundled in Supabase client)</th>
</tr>
<tr>
<th></th>
@@ -85,6 +85,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<th><a href="https://github.com/supabase/gotrue" target="_blank" rel="noopener noreferrer">GoTrue</a></th>
<th><a href="https://github.com/supabase/realtime" target="_blank" rel="noopener noreferrer">Realtime</a></th>
<th><a href="https://github.com/supabase/storage-api" target="_blank" rel="noopener noreferrer">Storage</a></th>
<th>Functions</th>
</tr>
<!-- TEMPLATE FOR NEW ROW -->
<!-- START ROW
@@ -97,7 +98,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/storage-lang" target="_blank" rel="noopener noreferrer">storage-lang</a></td>
</tr>
END ROW -->
<th colspan="6">⚡️ Official ⚡️</th>
<th colspan="7">⚡️ Official ⚡️</th>
<tr>
<td>JavaScript (TypeScript)</td>
<td><a href="https://github.com/supabase/supabase-js" target="_blank" rel="noopener noreferrer">supabase-js</a></td>
@@ -105,8 +106,9 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase/gotrue-js" target="_blank" rel="noopener noreferrer">gotrue-js</a></td>
<td><a href="https://github.com/supabase/realtime-js" target="_blank" rel="noopener noreferrer">realtime-js</a></td>
<td><a href="https://github.com/supabase/storage-js" target="_blank" rel="noopener noreferrer">storage-js</a></td>
<td><a href="https://github.com/supabase/functions-js" target="_blank" rel="noopener noreferrer">functions-js</a></td>
</tr>
<th colspan="6">💚 Community 💚</th>
<th colspan="7">💚 Community 💚</th>
<tr>
<td>C#</td>
<td><a href="https://github.com/supabase-community/supabase-csharp" target="_blank" rel="noopener noreferrer">supabase-csharp</a></td>
@@ -114,6 +116,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/gotrue-csharp" target="_blank" rel="noopener noreferrer">gotrue-csharp</a></td>
<td><a href="https://github.com/supabase-community/realtime-csharp" target="_blank" rel="noopener noreferrer">realtime-csharp</a></td>
<td><a href="https://github.com/supabase-community/storage-csharp" target="_blank" rel="noopener noreferrer">storage-csharp</a></td>
<td><a href="https://github.com/supabase-community/functions-csharp" target="_blank" rel="noopener noreferrer">functions-csharp</a></td>
</tr>
<tr>
<td>Dart (Flutter)</td>
@@ -122,6 +125,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase/gotrue-dart" target="_blank" rel="noopener noreferrer">gotrue-dart</a></td>
<td><a href="https://github.com/supabase/realtime-dart" target="_blank" rel="noopener noreferrer">realtime-dart</a></td>
<td><a href="https://github.com/supabase/storage-dart" target="_blank" rel="noopener noreferrer">storage-dart</a></td>
<td><a href="https://github.com/supabase-community/functions-dart" target="_blank" rel="noopener noreferrer">functions-dart</a></td>
</tr>
<tr>
<td>Go</td>
@@ -129,6 +133,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/postgrest-go" target="_blank" rel="noopener noreferrer">postgrest-go</a></td>
<td>-</td>
<td>-</td>
<td><a href="https://github.com/supabase-community/storage-go" target="_blank" rel="noopener noreferrer">storage-go</a></td>
<td>-</td>
</tr>
<tr>
@@ -138,6 +143,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/gotrue-java" target="_blank" rel="noopener noreferrer">gotrue-java</a></td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Kotlin</td>
@@ -146,6 +152,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/gotrue-kt" target="_blank" rel="noopener noreferrer">gotrue-kt</a></td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Python</td>
@@ -153,7 +160,8 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/postgrest-py" target="_blank" rel="noopener noreferrer">postgrest-py</a></td>
<td><a href="https://github.com/supabase-community/gotrue-py" target="_blank" rel="noopener noreferrer">gotrue-py</a></td>
<td><a href="https://github.com/supabase-community/realtime-py" target="_blank" rel="noopener noreferrer">realtime-py</a></td>
<td>-</td>
<td><a href="https://github.com/supabase-community/storage-py" target="_blank" rel="noopener noreferrer">storage-py</a></td>
<td><a href="https://github.com/supabase-community/functions-py" target="_blank" rel="noopener noreferrer">functions-py</a></td>
</tr>
<tr>
<td>Ruby</td>
@@ -162,6 +170,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Rust</td>
@@ -170,6 +179,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td>Swift</td>
@@ -178,6 +188,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
<td><a href="https://github.com/supabase-community/gotrue-swift" target="_blank" rel="noopener noreferrer">gotrue-swift</a></td>
<td><a href="https://github.com/supabase-community/realtime-swift" target="_blank" rel="noopener noreferrer">realtime-swift</a></td>
<td><a href="https://github.com/supabase-community/storage-swift" target="_blank" rel="noopener noreferrer">storage-swift</a></td>
<td>-</td>
</tr>
</table>
@@ -189,10 +200,12 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
- [Arabic | العربية](/i18n/README.ar.md)
- [Albanian / Shqip](/i18n/README.sq.md)
- [Bangla / বাংলা](/i18n/README.bn.md)
- [Bulgarian / Български](/i18n/README.bg.md)
- [Catalan / Català](/i18n/README.ca.md)
- [Danish / Dansk](/i18n/README.da.md)
- [Dutch / Nederlands](/i18n/README.nl.md)
- [English](https://github.com/supabase/supabase)
- [Finnish / Suomalainen](/i18n/README.fi.md)
- [French / Français](/i18n/README.fr.md)
- [German / Deutsch](/i18n/README.de.md)
- [Greek / Ελληνικά](/i18n/README.gr.md)
@@ -212,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 -1
View File
@@ -1 +1 @@
web/static/.well-known/security.txt
apps/reference/static/.well-known/security.txt
+1 -1
View File
@@ -1,3 +1,3 @@
Supabase is an open source Firebase alternative. We're backed by Y Combinator, Mozilla, Coatue, and a bunch of [amazing developers](https://supabase.com/blog/2021/03/25/angels-of-supabase).
Supabase is an open source Firebase alternative. We're backed by Y Combinator, Mozilla, Coatue, and a bunch of [amazing developers](https://supabase.com/blog/angels-of-supabase).
Supabase is a platform which makes it incredibly easy to build _and_ scale your projects.
+1 -1
View File
@@ -46,7 +46,7 @@ Help us maintain the community guidelines in our GitHub and Community-led commun
- Access to a Supabase Discord channel providing direct communication with the team, Discord badges, and elevated privileges.
- Special AMA sessions with members of the Supabase team.
- Monthly DevRel committee call with industry-leading Developer Advocates (many of whom are [angel investors](https://supabase.com/blog/2021/03/25/angels-of-supabase)), where you can learn from the best.
- Monthly DevRel committee call with industry-leading Developer Advocates (many of whom are [angel investors](https://supabase.com/blog/angels-of-supabase)), where you can learn from the best.
- We'll help you build your audience by promoting content via the Supabase social channels.
- Early access to new features (and the opportunity to provide feedback to the team!).
- Free credits that you can use for Squad efforts.
+6 -6
View File
@@ -1,5 +1,5 @@
/*
Font import
/*
Font import
*/
@import url('https://rsms.me/inter/inter.css');
@@ -30,7 +30,7 @@
:root[data-theme='dark'] {
/* See theme-specific "--custom" vars below */
/*
/*
Customization here for both Light and Dark themes
*/
--custom-font-base: 'Inter', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen',
@@ -71,7 +71,7 @@
--custom-shadow-tl: 0 12px 28px 0 rgba(0, 0, 0, 0.2), 0 2px 4px 0 rgba(0, 0, 0, 0.1);
--custom-shadow-xl: 0 30px 60px 0 rgba(0, 0, 0, 0.1);
/*
/*
Infirma overrides with customization
*/
/* Colors */
@@ -542,8 +542,8 @@ a.card:hover {
line-height: calc(var(--ifm-spacing-vertical) * 1);
}
/*
Link chevrons
/*
Link chevrons
*/
.menu .menu__link.menu__link--sublist::after {
background-image: url('data:image/svg+xml;utf8,<svg alt="Arrow" xmlns="http://www.w3.org/2000/svg" viewBox="-6 -6 38 38"><path fill="inherit" d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"></path></svg>');
+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
File diff suppressed because it is too large. Load diff
-17
View File
@@ -1,17 +0,0 @@
---
slug: /
sidebar_label: Auth Helpers
---
# Auth Helpers
A collection of framework specific Auth utilities for working with Supabase.
## Status
The Auth Helpers are in `beta`. They are usable in their current state, but it's likely that there will be breaking changes.
## Additional Links
- [Source code](https://github.com/supabase/auth-helpers)
- [Known bugs and issues](https://github.com/supabase/auth-helpers/issues)
-315
View File
@@ -1,315 +0,0 @@
---
id: next-js
slug: next-js
sidebar_label: With Next.js
---
# Supabase Auth with Next.js
This submodule provides convenience helpers for implementing user authentication in Next.js applications.
## Installation
Using [npm](https://npmjs.org):
```sh
npm install @supabase/auth-helpers-nextjs
# Main components and hooks for React based frameworks (optional)
npm install @supabase/auth-helpers-react
```
Using [yarn](https://yarnpkg.com/):
```sh
yarn add @supabase/auth-helpers-nextjs
# Main components and hooks for React based frameworks (optional)
yarn add @supabase/auth-helpers-react
```
This library supports the following tooling versions:
- Node.js: `^10.13.0 || >=12.0.0`
- Next.js: `>=10`
## Getting Started
### Configuration
Set up the fillowing env vars. For local development you can set them in a `.env.local` file. See an example [here](../../examples/nextjs/.env.local.example)).
```bash
# Find these in your Supabase project settings > API
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
```
### Basic Setup
- Create an `auth` directory under the `/pages/api/` directory.
- Create a `[...supabase].js` file under the newly created `auth` directory.
The path to your dynamic API route file would be `/pages/api/auth/[...supabase].js`. Populate that file as follows:
```js
import { handleAuth } from '@supabase/auth-helpers-nextjs'
export default handleAuth({ logout: { returnTo: '/' } })
```
Executing `handleAuth()` creates the following route handlers under the hood that perform different parts of the authentication flow:
- `/api/auth/callback`: The `UserProvider` forwards the session details here every time `onAuthStateChange` fires on the client side. This is needed to set up the cookies for your application so that SSR works seamlessly.
- `/api/auth/user`: You can fetch user profile information in JSON format.
- `/api/auth/logout`: Your Next.js application logs out the user. You can optionally pass a `returnTo` parameter to return to a custom relative URL after logout, eg `/api/auth/logout?returnTo=/login`. This will overwrite the logout `returnTo` option specified `handleAuth()`
Wrap your `pages/_app.js` component with the `UserProvider` component:
```jsx
// pages/_app.js
import React from 'react'
import { UserProvider } from '@supabase/auth-helpers-react'
import { supabaseClient } from '@supabase/auth-helpers-nextjs'
export default function App({ Component, pageProps }) {
return (
<UserProvider supabaseClient={supabaseClient}>
<Component {...pageProps} />
</UserProvider>
)
}
```
You can now determine if a user is authenticated by checking that the `user` object returned by the `useUser()` hook is defined.
## Client-side data fetching with RLS
For [row level security](https://supabase.com/docs/learn/auth-deep-dive/auth-row-level-security) to work properly when fetching data client-side, you need to make sure to import the `{ supabaseClient }` from `# @supabase/auth-helpers-nextjs` and only run your query once the user is defined client-side in the `useUser()` hook:
```js
import { Auth } from '@supabase/ui'
import { useUser } from '@supabase/auth-helpers-react'
import { supabaseClient } from '@supabase/auth-helpers-nextjs'
import { useEffect, useState } from 'react'
const LoginPage = () => {
const { user, error } = useUser()
const [data, setData] = useState()
useEffect(() => {
async function loadData() {
const { data } = await supabaseClient.from('test').select('*')
setData(data)
}
// Only run query once user is logged in.
if (user) loadData()
}, [user])
if (!user)
return (
<>
{error && <p>{error.message}</p>}
<Auth
supabaseClient={supabaseClient}
providers={['google', 'github']}
socialLayout="horizontal"
socialButtonSize="xlarge"
/>
</>
)
return (
<>
<button onClick={() => supabaseClient.auth.signOut()}>Sign out</button>
<p>user:</p>
<pre>{JSON.stringify(user, null, 2)}</pre>
<p>client-side data fetching with RLS</p>
<pre>{JSON.stringify(data, null, 2)}</pre>
</>
)
}
export default LoginPage
```
### Server-side rendering (SSR) - withPageAuth
If you wrap your `getServerSideProps` with `withPageAuth` your props object will be augmented with the user object.
```js
// pages/profile.js
import { withPageAuth } from '@supabase/auth-helpers-nextjs'
export default function Profile({ user }) {
return <div>Hello {user.name}</div>
}
export const getServerSideProps = withPageAuth({ redirectTo: '/login' })
```
If there is no authenticated user, they will be redirect to your home page, unless you specify the `redirectTo` option.
You can pass in your own `getServerSideProps` method, the props returned from this will be merged with the
user props. You can also access the user session data by calling `getUser` inside of this method, eg:
```js
// pages/protected-page.js
import { withPageAuth, getUser } from '@supabase/auth-helpers-nextjs'
export default function ProtectedPage({ user, customProp }) {
return <div>Protected content</div>
}
export const getServerSideProps = withPageAuth({
redirectTo: '/foo',
async getServerSideProps(ctx) {
// Access the user object
const { user, accessToken } = await getUser(ctx)
return { props: { email: user?.email } }
},
})
```
### Server-side data fetching with RLS
For [row level security](https://supabase.com/docs/learn/auth-deep-dive/auth-row-level-security) to work in a server environment, you need to inject the request context into the supabase client:
```js
import {
User,
withPageAuth,
supabaseServerClient,
} from '@supabase/auth-helpers-nextjs'
export default function ProtectedPage({
user,
data,
}: {
user: User,
data: any,
}) {
return (
<>
<div>Protected content for {user.email}</div>
<pre>{JSON.stringify(data, null, 2)}</pre>
<pre>{JSON.stringify(user, null, 2)}</pre>
</>
)
}
export const getServerSideProps = withPageAuth({
redirectTo: '/',
async getServerSideProps(ctx) {
// Run queries with RLS on the server
const { data } = await supabaseServerClient(ctx).from('test').select('*')
return { props: { data } }
},
})
```
### Server-side data fetching to OAuth APIs using `provider_token`
When using third-party auth providers, sessions are initiated with an additional `provider_token` field which is persisted as an HTTPOnly cookie upon logging in to enabled usage on the server side. The `provider_token` can be used to make API requests to the OAuth provider's API endpoints on behalf of the logged-in user. In the following example, we fetch the user's full profile from the third-party API during SSR using their id and auth token:
```js
import { User, withPageAuth, getUser } from '@supabase/auth-helpers-nextjs'
interface Profile {
/* ... */
}
export default function ProtectedPage({
user,
data,
}: {
user: User,
profile: Profile,
}) {
return <div>Protected content</div>
}
export const getServerSideProps = withPageAuth({
redirectTo: '/',
async getServerSideProps(ctx) {
// Retrieve provider_token from cookies
const provider_token = ctx.req.cookies['sb-provider-token']
// Get logged in user's third-party id from metadata
const { user } = await getUser(ctx)
const userId = user?.user_metadata.provider_id
const profile: Profile = await (
await fetch(`https://api.example.com/users/${userId}`, {
method: 'GET',
headers: {
Authorization: `Bearer ${provider_token}`,
},
})
).json()
return { props: { profile } }
},
})
```
## Protecting API routes
Wrap an API Route to check that the user has a valid session. If they're not logged in the handler will return a
401 Unauthorized.
```js
// pages/api/protected-route.js
import {
withApiAuth,
supabaseServerClient,
} from '@supabase/auth-helpers-nextjs'
export default withApiAuth(async function ProtectedRoute(req, res) {
// Run queries with RLS on the server
const { data } = await supabaseServerClient({ req, res })
.from('test')
.select('*')
res.json(data)
})
```
If you visit `/api/protected-route` without a valid session cookie, you will get a 401 response.
## Protecting routes with [Nextjs Middleware](https://nextjs.org/docs/middleware)
As an alternative to protecting individual pages using `getServerSideProps` with `withPageAuth`, `withMiddlewareAuth` can be used from inside a `_middleware` file to protect an entire directory. In the following example, all requests to `/protected/*` will check whether a user is signed in, if successful the request will be forwarded to the destination route, otherwise the user will be redirected to `/login` (defaults to: `/`) with a 307 Temporary Redirect response status:
```ts
// pages/protected/_middleware.ts
import { withMiddlewareAuth } from '@supabase/auth-helpers-nextjs/middleware'
export const middleware = withMiddlewareAuth({ redirectTo: '/login' })
```
It is also possible to add finer granularity based on the user logged in. I.e. you can specify a promise to determine if a specific user has permission or not.
```ts
// pages/protected/_middleware.ts
import { withMiddlewareAuth } from '@supabase/auth-helpers-nextjs/dist/middleware'
export const middleware = withMiddlewareAuth({
redirectTo: '/login',
authGuard: {
isPermitted: async (user) => user.email?.endsWith('@example.com') ?? false,
redirectTo: '/insufficient-permissions',
},
})
```
## Migrating from @supabase/supabase-auth-helpers to @supabase/auth-helpers
This is a step by step guide on migrating away from the `@supabase/supabase-auth-helpers` to the newly released `@supabase/auth-helpers`.
1. Install `@supabase/supabase-js`, `@supabase/auth-helpers-nextjs` and `@supabase/auth-helpers-react` libraries from npm.
2. Replace all imports of `@supabase/supabase-auth-helpers/nextjs` in your project with `@supabase/auth-helpers-nextjs`.
3. Replace all imports of `@supabase/supabase-auth-helpers/react` in your project with `@supabase/auth-helpers-react`.
4. Replace all instances of `withAuthRequired` in any of your NextJS pages with `withPageAuth`.
5. Replace all instances of `withAuthRequired` in any of your NextJS API endpoints with `withApiAuth`.
6. Uninstall `@supabase/supabase-auth-helpers`.
-303
View File
@@ -1,303 +0,0 @@
---
id: sveltekit
slug: sveltekit
sidebar_label: With SvelteKit
---
# Supabase Auth with SvelteKit
This submodule provides convenience helpers for implementing user authentication in [SvelteKit](https://kit.svelte.dev/) applications.
## Installation
Using [npm](https://npmjs.org):
```sh
npm install @supabase/auth-helpers-sveltekit
# Main component for Svelte based frameworks (optional but recommended)
npm install @supabase/auth-helpers-svelte
```
Using [yarn](https://yarnpkg.com/):
```sh
yarn add @supabase/auth-helpers-sveltekit
# Main component for Svelte based frameworks (optional but recommended)
yarn add @supabase/auth-helpers-svelte
```
This library supports the following tooling versions:
- Node.js: `^16.15.0`
## Getting Started
### Configuration
Set up the fillowing env vars. For local development you can set them in a `.env` file. See an example [here](../../examples/sveltekit/.env.example).
```bash
# Find these in your Supabase project settings > API
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
```
### SupabaseClient and SupaAuthHelper component setup
We will start off by creating a `db.ts` file inside of our `src/lib` directory. Now lets instantiate our `supabaseClient` by using our `createSupabaseClient` function from the `@supabase/auth-helpers-sveltekit` library.
```ts
// src/lib/db.ts
import { createSupabaseClient } from '@supabase/auth-helpers-sveltekit'
const { supabaseClient } = createSupabaseClient(
import.meta.env.VITE_SUPABASE_URL as string,
import.meta.env.VITE_SUPABASE_ANON_KEY as string
)
export { supabaseClient }
```
Edit your `__layout.svelte` file and add import the `SupaAuthHelper` component, the `supabaseClient` we just instantiated and the `session` store.
```html
// src/routes/__layout.svelte
<script>
import { session } from '$app/stores'
import { supabaseClient } from '$lib/db'
import { SupaAuthHelper } from '@supabase/auth-helpers-svelte'
</script>
<SupaAuthHelper {supabaseClient} {session}>
<slot />
</SupaAuthHelper>
```
### Hooks setup
Our `hooks.ts` file is where the heavy lifting of this library happens, we need to import our function to handle the sign in, signing out and cookie creation phase. we can import all the hooks using `handleAuth` function and destructure its returned data.
```ts
// src/hooks.ts
import { handleAuth } from '@supabase/auth-helpers-sveltekit'
import type { GetSession, Handle } from '@sveltejs/kit'
import { sequence } from '@sveltejs/kit/hooks'
export const handle: Handle = sequence(...handleAuth())
export const getSession: GetSession = async (event) => {
const { user, accessToken, error } = event.locals
return {
user,
accessToken,
error,
}
}
```
These will create the handlers under the hood that perform different parts of the authentication flow:
- `/api/auth/callback`: The `UserHelper` forwards the session details here every time `onAuthStateChange` fires on the client side. This is needed to set up the cookies for your application so that SSR works seamlessly.
- `/api/auth/user`: You can fetch user profile information in JSON format.
- `/api/auth/logout`: You can logout the user.
### Typings
In order to get the most out of TypeScript and its intellisense, you should import our types into the `app.d.ts` type definition file that comes with your SvelteKit project.
```ts
// src/app.d.ts
/// <reference types="@sveltejs/kit" />
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
declare namespace App {
interface UserSession {
user: import('@supabase/supabase-js').User
accessToken?: string
}
interface Locals extends UserSession {
error: import('@supabase/supabase-js').ApiError
}
interface Session extends UserSession {} // interface Platform {} // interface Stuff {}
}
```
### Signing out
This library has provided a dedicated endpoint for you to use to sign a user out. This endpoint will sign the user out of the Gotrue server, clear the cookies that were set when the user logged in and redirect the user to a configurable path.
The logout handler endpoint is `/api/auth/logout`, this will take a `GET` request which means it can be used as the href for a normal `a` tag in your html.
```html
<a href="/api/auth/logout">Sign out</a>
```
### Logout handler configuration
In your `src/hooks.ts` file the logout handler is already setup and you can configure the redirect path from here.
> By default the redirect path after logging out will be `/`.
```ts
export const handle = sequence(
...handleAuth({
logout: { returnTo: '/auth/signin' },
})
)
```
### Basic Setup
You can now determine if a user is authenticated on the client-side by checking that the `user` object returned by the `$session` store is defined.
```html
// example
<script>
import { session } from '$app/stores'
</script>
{#if !$session.user}
<h1>I am not logged in</h1>
{:else}
<h1>Welcome {$session.user.email}</h1>
<p>I am logged in!</p>
{/if}
```
## Client-side data fetching with RLS
For [row level security](https://supabase.com/docs/learn/auth-deep-dive/auth-row-level-security) to work properly when fetching data client-side, you need to make sure to import the `{ supabaseClient }` from `@supabase/auth-helpers-sveltekit` and only run your query once the user is defined client-side in the `$session`:
```html
<script>
import Auth from 'supabase-ui-svelte';
import { error, isLoading } from '@supabase/auth-helpers-svelte';
import { supabaseClient } from '$lib/db';
import { session } from '$app/stores';
let loadedData = [];
async function loadData() {
const { data } = await supabaseClient.from('test').select('*').single();
loadedData = data
}
$: {
if ($session.user && $session.user.id) {
loadData();
}
}
</script>
{#if !$session.user}
{#if $error}
<p>{$error.message}</p>
{/if}
<h1>{$isLoading ? `Loading...` : `Loaded!`}</h1>
<Auth
supabaseClient={supabaseClient}
providers={['google', 'github']}
/>
{:else}
<a href=="/api/auth/logout">Sign out</a>
<p>user:</p>
<pre>{JSON.stringify($session.user, null, 2)}</pre>
<p>client-side data fetching with RLS</p>
<pre>{JSON.stringify(loadedData, null, 2)}</pre>
{/if}
```
### Server-side data fetching with RLS
For [row level security](https://supabase.com/docs/learn/auth-deep-dive/auth-row-level-security) to work in a server environment, you need to inject the request context into the supabase client:
```html
<!-- src/routes/profile.svelte -->
<script>
export let user
export let data
</script>
<div>Protected content for {user.email}</div>
<pre>{JSON.stringify(data, null, 2)}</pre>
<pre>{JSON.stringify(user, null, 2)}</pre>
```
```ts
// src/routes/profile.ts
import {
supabaseServerClient,
withApiAuth,
} from '@supabase/auth-helpers-sveltekit'
import type { RequestHandler } from './__types/profile'
interface TestTable {
id: string
created_at: string
}
interface GetOutput {
user: User
data: TestTable[]
}
export const GET: RequestHandler<GetOutput> = async ({ locals }) =>
withApiAuth(
{
redirectTo: '/',
user: locals.user,
},
async () => {
const { data } = await supabaseServerClient(session.accessToken)
.from<TestTable>('test')
.select('*')
return {
body: {
user: locals.user,
data,
},
}
}
)
```
## Protecting API routes
Wrap an API Route to check that the user has a valid session. If they're not logged in the handler will return a
303 and redirect header.
```ts
// src/routes/api/protected-route.ts
import {
supabaseServerClient,
withApiAuth,
} from '@supabase/auth-helpers-sveltekit'
import type { RequestHandler } from './__types/protected-route'
interface TestTable {
id: string
created_at: string
}
interface GetOutput {
data: TestTable[]
}
export const GET: RequestHandler<GetOutput> = async ({ locals, request }) =>
withApiAuth({ user: locals.user }, async () => {
// Run queries with RLS on the server
const { data } = await supabaseServerClient(request)
.from('test')
.select('*')
return {
status: 200,
body: { data },
}
})
```
If you visit `/api/protected-route` without a valid session cookie, you will get a 303 response.
-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
@@ -1,70 +0,0 @@
---
id: installing-and-updating
---
# Installing and Updating
## macOS
### Installing
Available via [Homebrew](https://brew.sh). To install:
```sh
brew install supabase/tap/supabase
```
### Upgrading
To upgrade:
```sh
brew upgrade supabase
```
## Windows
### Installing
Available via [Scoop](https://scoop.sh). To install:
```powershell
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
scoop install supabase
```
### Upgrading
To upgrade:
```powershell
scoop update supabase
```
## Linux
### Homebrew
Available via [Homebrew](https://brew.sh) and Linux packages.
To install:
```sh
brew install supabase/tap/supabase
```
To upgrade:
```sh
brew upgrade supabase
```
### Linux packages
Linux packages are provided in [Releases](https://github.com/supabase/cli/releases).
To install, download the `.apk`/`.deb`/`.rpm` file depending on your package manager
and run one of the following:
- `sudo apk add --allow-untrusted <...>.apk`
- `sudo dpkg -i <...>.deb`
- `sudo rpm -i <...>.rpm`
+10 -8
View File
@@ -8,17 +8,19 @@ hide_table_of_contents: true
# Supabase CLI
The Supabase CLI can be found in our [CLI](https://github.com/supabase/cli) repository.
The Supabase CLI provides tools to develop your project locally and deploy to the Supabase Platform.
The CLI is still under development, but it contains all the functionality for working with your Supabase projects and the Supabase Platform.
The CLI is still under heavy development, but it will contain all the functionality for working with Supabase projects and the Supabase platform.
- Running Supabase locally: [`supabase start`](./cli/usage#supabase-start)
- Managing database migrations: [`supabase migration`](./cli/usage#supabase-migration)
- Pushing your local changes to production: [`supabase commit`](./cli/usage#supabase-db-remote-commit)
- Manage your Supabase Projects: [`supabase projects`](./cli/usage#supabase-projects)
- Generating types directly from your database schema: [`supabase gen types`](./cli/usage#supabase-gen)
- Run Supabase locally: [`supabase start`](https://supabase.com/docs/reference/cli/usage#supabase-start)
- Manage database migrations: [`supabase migration`](https://supabase.com/docs/reference/cli/usage#supabase-migration)
- CI/CD for releasing to production: [`supabase db push`](https://supabase.com/docs/reference/cli/usage#supabase-db-push)
- Manage your Supabase projects: [`supabase projects`](https://supabase.com/docs/reference/cli/usage#supabase-projects)
- Generate types directly from your database schema: [`supabase gen types`](https://supabase.com/docs/reference/cli/usage#supabase-gen)
## Additional Links
- [Install the Supabase CLI](/docs/guides/cli)
- [Source code](https://github.com/supabase/cli)
- [Known bugs and issues](https://github.com/supabase/cli/issues)
- [Supabase CLI v1 and Admin API Beta](https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta)
- [The CLI team announcing CLI V1 and Admin API Beta - Video](https://www.youtube.com/watch?v=OpPOaJI_Z28)
+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`. |
+2 -4
View File
@@ -6,11 +6,9 @@ sidebar_label: Auth Server
# Supabase Auth Server
The Supabase Auth Server (GoTrue) is a JWT based API for managing users and issuing JWT tokens.
The Supabase Auth Server (GoTrue) is a JSON Web Token (JWT)-based API for managing users and issuing access tokens.
GoTrue is a small open-source API written in golang, that can act as a self-standing API service for handling user registration and authentication for JAM projects.
It's based on OAuth2 and JWT and will handle user signup, authentication and custom user data.
GoTrue is an open-source API written in Golang, that acts as a self-standing API service for handling user registration and authentication for JAM projects. It's based on OAuth2 and JWT and handles user signup, authentication, and custom user data.
## Client libraries
+18
View File
@@ -0,0 +1,18 @@
---
id: usage
slug: /usage
title: Usage
toc_max_heading_level: 3
---
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
Documentation of the gotrue API.
<!-- AUTOGENERATED: DO NOT EDIT DIRECTLY IF THIS IS VERSION "next" -->
@@ -1,290 +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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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/web/spec/supabase_dart_v1_ref.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,60 +0,0 @@
---
id: invoke
title: 'invoke()'
slug: /invoke
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 supabaseClient.functions.invoke('hello', body: {'foo': 'baa'});
final data = res.data;
final error = res.error;
```
## 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 supabaseClient.functions.invoke('hello', body: {'foo': 'baa'});
final data = res.data;
final error = res.error;
```
### 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 supabaseClient.functions.invoke(
'hello',
body: {'foo': 'baa'},
responseType: ResponseType.text,
);
final data = res.data;
final error = res.error;
```
### 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 supabaseClient.functions.invoke(
'hello',
body: {'foo': 'baa'},
headers: {
'Authorization': 'Bearer ${supabase.auth.session()?.access_token}'
},
);
```
@@ -1,63 +0,0 @@
---
id: is_
title: '.is_()'
slug: /is_
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.is_('name', null)
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.is_('name', null)
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.is_('name', null)
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.is_('name', null)
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.is_('name', null)
.execute();
```
@@ -1,107 +0,0 @@
---
id: like
title: '.like()'
slug: /like
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.like('name', '%la%')
.execute();
```
## 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 res = await supabase
.from('cities')
.select('name, country_id')
.like('name', '%la%')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.like('name', '%la%')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.like('name', '%la%')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.like('name', '%la%')
.execute();
```
@@ -1,42 +0,0 @@
---
id: limit
title: 'limit()'
slug: /limit
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Limits the result with the specified count.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.limit(1)
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.limit(1)
.execute();
```
### With embedded resources
```dart
final res = await supabase
.from('countries')
.select('name, cities(name)')
.eq('name', 'United States')
.limit(1, foreignTable: 'cities' )
.execute();
```
@@ -1,61 +0,0 @@
---
id: lt
title: '.lt()'
slug: /lt
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.lt('country_id', 250)
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.lt('country_id', 250)
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.lt('country_id', 250)
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.lt('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')
.lt('country_id', 250)
.execute();
```
@@ -1,107 +0,0 @@
---
id: lte
title: '.lte()'
slug: /lte
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.lte('country_id', 250)
.execute();
```
## 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 res = await supabase
.from('cities')
.select('name, country_id')
.lte('country_id', 250)
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.lte('country_id', 250)
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.lte('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')
.lte('country_id', 250)
.execute();
```
@@ -1,61 +0,0 @@
---
id: match
title: '.match()'
slug: /match
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows whose columns match the specified `query` object.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.match({'name': 'Beijing', 'country_id': 156})
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.match({'name': 'Beijing', 'country_id': 156})
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.match({'name': 'Beijing', 'country_id': 156})
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.match({'name': 'Beijing', 'country_id': 156})
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.match({'name': 'Beijing', 'country_id': 156})
.execute();
```
@@ -1,61 +0,0 @@
---
id: neq
title: '.neq()'
slug: /neq
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.neq('name', 'The shire')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.neq('name', 'The shire')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.neq('name', 'San Francisco')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.neq('name', 'Mordor')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities')
.neq('name', 'Lagos')
.execute();
```
@@ -1,73 +0,0 @@
---
id: not
title: '.not()'
slug: /not
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows which doesn't satisfy the filter.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.not('name', 'eq', 'Paris')
.execute();
```
## 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 res = await supabase
.from('cities')
.select('name, country_id')
.not('name', 'eq', 'Paris')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Mordor' })
.not('name', 'eq', 'Paris')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('cities')
.delete()
.not('name', 'eq', 'Paris')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_cities)
.not('name', 'eq', 'Paris')
.execute();
```
@@ -1,51 +0,0 @@
---
id: or
title: '.or()'
slug: /or
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Finds all rows satisfying at least one of the filters.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.or('id.eq.20,id.eq.30')
.execute();
```
## 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 res = await supabase
.from('cities')
.select('name, country_id')
.or('id.eq.20,id.eq.30')
.execute();
```
### Use `or` with `and`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.or('id.gt.20,and(name.eq.New Zealand,name.eq.France)')
.execute();
```
@@ -1,42 +0,0 @@
---
id: order
title: 'order()'
slug: /order
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Orders the result with the specified column.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.order('id', ascending: false )
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.order('id', ascending: false )
.execute();
```
### With embedded resources
```dart
final res = await supabase
.from('countries')
.select('name, cities(name)')
.eq('name', 'United States')
.order('name', foreignTable: 'cities')
.execute();
```
@@ -1,59 +0,0 @@
---
id: overlaps
title: '.overlaps()'
slug: /overlaps
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, main_exports')
.overlaps('main_exports', ['computers', 'minerals'])
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, main_exports')
.overlaps('main_exports', ['computers', 'minerals'])
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.overlaps('main_exports', ['computers', 'minerals'])
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.overlaps('main_exports', ['computers', 'minerals'])
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.overlaps('main_exports', ['computers', 'minerals'])
.execute();
```
@@ -1,31 +0,0 @@
---
id: range
title: 'range()'
slug: /range
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Limits the result to rows within the specified range, inclusive.
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.range(0,3)
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.range(0,3)
.execute();
```
@@ -1,59 +0,0 @@
---
id: rangeadjacent
title: '.rangeAdjacent()'
slug: /rangeadjacent
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeAdjacent('population_range_millions', '[70, 185]')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeAdjacent('population_range_millions', '[70, 185]')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeAdjacent('population_range_millions', '[70, 185]')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.rangeAdjacent('population_range_millions', '[70, 185]')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.rangeAdjacent('population_range_millions', '[70, 185]')
.execute();
```
@@ -1,59 +0,0 @@
---
id: rangegt
title: '.rangeGt()'
slug: /rangegt
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGt('population_range_millions', '[150, 250]')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGt('population_range_millions', '[150, 250]')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeGt('population_range_millions', '[150, 250]')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.rangeGt('population_range_millions', '[150, 250]')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.rangeGt('population_range_millions', '[150, 250]')
.execute();
```
@@ -1,59 +0,0 @@
---
id: rangegte
title: '.rangeGte()'
slug: /rangegte
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGte('population_range_millions', '[150, 250]')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeGte('population_range_millions', '[150, 250]')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeGte('population_range_millions', '[150, 250]')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.rangeGte('population_range_millions', '[150, 250]')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.rangeGte('population_range_millions', '[150, 250]')
.execute();
```
@@ -1,59 +0,0 @@
---
id: rangelt
title: '.rangeLt()'
slug: /rangelt
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLt('population_range_millions', '[150, 250]')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLt('population_range_millions', '[150, 250]')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeLt('population_range_millions', '[150, 250]')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.rangeLt('population_range_millions', '[150, 250]')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.rangeLt('population_range_millions', '[150, 250]')
.execute();
```
@@ -1,59 +0,0 @@
---
id: rangelte
title: '.rangeLte()'
slug: /rangelte
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLte('population_range_millions', '[150, 250]')
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('countries')
.select('name, id, population_range_millions')
.rangeLte('population_range_millions', '[150, 250]')
.execute();
```
### With `update()`
```dart
final res = await supabase
.from('countries')
.update({ 'name': 'Mordor' })
.rangeLte('population_range_millions', '[150, 250]')
.execute();
```
### With `delete()`
```dart
final res = await supabase
.from('countries')
.delete()
.rangeLte('population_range_millions', '[150, 250]')
.execute();
```
### With `rpc()`
```dart
// Only valid if the Stored Procedure returns a table type.
final res = await supabase
.rpc('echo_all_countries')
.rangeLte('population_range_millions', [150, 250])
.execute();
```
@@ -1,27 +0,0 @@
---
id: removesubscription
title: 'removeSubscription()'
slug: /removesubscription
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Removes an active subscription and returns the number of open connections.
```dart
supabase.removeSubscription(mySubscription);
```
## Notes
- Removing subscriptions is a great way to maintain the performance of your project's database. Supabase will automatically handle cleanup 30 seconds after a user is disconnected, but unused subscriptions may cause degradation as more users are simultaneously subscribed.
## Examples
### Remove a subscription
```dart
supabase.removeSubscription(mySubscription);
```
@@ -1,61 +0,0 @@
---
id: reset-password-email
title: 'Reset Password (Email)'
slug: /reset-password-email
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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');
final error = res.error;
```
## 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');
final error = res.error;
```
### 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/'),
);
final error = res.error;
```
@@ -1,51 +0,0 @@
---
id: rpc
title: 'Stored Procedures: rpc()'
slug: /rpc
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.rpc('hello_world')
.execute();
```
## Examples
### Call a stored procedure
This is an example invoking a stored procedure.
```dart
final res = await supabase
.rpc('hello_world')
.execute();
```
### With Parameters
```dart
final res = await supabase
.rpc('echo_city', params: { 'name': 'The Shire' })
.execute();
```
### 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 res = await supabase
.rpc('hello_world')
.execute(count: CountOption.exact);
```
@@ -1,147 +0,0 @@
---
id: select
title: 'Fetch data: select()'
slug: /select
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs vertical filtering with SELECT.
```dart
final res = await supabase
.from('cities')
.select()
.execute();
final data = res.data;
final error = res.error;
```
## 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 res = await supabase
.from('cities')
.select()
.execute();
final data = res.data;
final error = res.error;
```
### Selecting specific columns
You can select specific fields from your tables.
```dart
final res = await supabase
.from('cities')
.select('name')
.execute();
```
### Query foreign tables
If your database has relationships, you can query related tables too.
```dart
final res = await supabase
.from('countries')
.select('''
name,
cities (
name
)
''')
.execute();
```
### 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 res = await supabase
.from('products')
.select('''
id,
supplier:supplier_id ( name ),
purchaser:purchaser_id ( name )
''')
.execute();
```
### 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 res = await supabase
.from('messages')
.select('*, users!inner(*)')
.eq('users.username', 'Jane')
.execute();
```
### 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 res = 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 res = await supabase
.from('users')
.select('''
id, name,
address->street
''')
.eq('address->postcode', 90210)
.execute();
```
### 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 res = await supabase
.from('users')
.select()
.csv()
.execute();
```
@@ -1,31 +0,0 @@
---
id: single
title: 'single()'
slug: /single
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.single()
.execute();
```
## Examples
### With `select()`
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.single()
.execute();
```
@@ -1,33 +0,0 @@
---
id: storage-createbucket
title: 'createBucket()'
slug: /storage-createbucket
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Creates a new Storage bucket
```dart
final res = await supabase
.storage
.createBucket('avatars');
```
## Notes
- Policy permissions required:
- `buckets` permissions: `insert`
- `objects` permissions: none
## Examples
### Create bucket
```dart
final res = 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/web/spec/supabase_dart_v1_ref.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 res = await supabase
.storage
.deleteBucket('avatars');
```
## Notes
- Policy permissions required:
- `buckets` permissions: `select` and `delete`
- `objects` permissions: none
## Examples
### Delete bucket
```dart
final res = 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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Removes all objects inside a single bucket.
```dart
final res = await supabase
.storage
.emptyBucket('avatars');
```
## Notes
- Policy permissions required:
- `buckets` permissions: `select`
- `objects` permissions: `select` and `delete`
## Examples
### Empty bucket
```dart
final res = await supabase
.storage
.emptyBucket('avatars');
```
@@ -1,39 +0,0 @@
---
id: storage-from-createsignedurl
title: 'from.createSignedUrl()'
slug: /storage-from-createsignedurl
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.storage
.from('avatars')
.createSignedUrl('avatar1.png', 60);
final signedURL = res.data;
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `select`
## Examples
### Create Signed URL
```dart
final res = await supabase
.storage
.from('avatars')
.createSignedUrl('avatar1.png', 60);
final signedURL = res.data;
```
@@ -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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Downloads a file.
```dart
final res = await supabase
.storage
.from('avatars')
.download('avatar1.png');
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `select`
## Examples
### Download file
```dart
final res = await supabase
.storage
.from('avatars')
.download('avatar1.png');
```
@@ -1,40 +0,0 @@
---
id: storage-from-getpublicurl
title: 'from.getPublicUrl()'
slug: /storage-from-getpublicurl
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieve URLs for assets in public buckets
```dart
final res = supabase
.storage
.from('public-bucket')
.getPublicUrl('avatar1.png');
final publicURL = res.data;
```
## 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 res = supabase
.storage
.from('public-bucket')
.getPublicUrl('avatar1.png');
final publicURL = res.data;
```
@@ -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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Lists all the files within a bucket.
```dart
final res = await supabase
.storage
.from('avatars')
.list();
```
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `select`
## Examples
### List files in a bucket
```dart
final res = 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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Moves an existing file, optionally renaming it at the same time.
```dart
final res = 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 res = 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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Deletes files within the same bucket
```dart
final res = 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 res = await supabase
.storage
.from('avatars')
.remove(['avatar1.png']);
```
@@ -1,43 +0,0 @@
---
id: storage-from-update
title: 'from.update()'
slug: /storage-from-update
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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/file');
final res = await supabase
.storage
.from('avatars')
.update('public/avatar1.png', avatarFile, fileOptions: 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/file');
final res = await supabase
.storage
.from('avatars')
.update('public/avatar1.png', avatarFile, fileOptions: FileOptions(
cacheControl: '3600',
upsert: false
));
```
@@ -1,112 +0,0 @@
---
id: storage-from-upload
title: 'from.upload()'
slug: /storage-from-upload
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.storage
.from('avatars')
.upload('public/avatar1.png', avatarFile, fileOptions: 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>ArrayBuffer</code> | <code>ArrayBufferView</code> | <code>Blob</code> | <code>Buffer</code> | <code>File</code> | <code>FormData</code> | <code>ReadableStream</code> | <code>ReadableStream</code> | <code>URLSearchParams</code> | <code>string</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">
HTTP headers.
`cacheControl`: string, the `Cache-Control: max-age=<seconds>` seconds value.
`contentType`: string, the `Content-Type` header value. Should be specified if using a `fileBody` that is neither `Blob` nor `File` nor `FormData`, otherwise will default to `text/plain;charset=UTF-8`.
`upsert`: boolean, whether to perform an upsert.
</div>
</li>
</ul>
## Notes
- Policy permissions required:
- `buckets` permissions: none
- `objects` permissions: `insert`
## Examples
### Upload file
```dart
final avatarFile = File('path/to/file');
final res = await supabase
.storage
.from('avatars')
.upload('public/avatar1.png', avatarFile, fileOptions: 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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieves the details of an existing Storage bucket.
```dart
final res = 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 res = 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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Retrieves the details of all Storage buckets within an existing product.
```dart
final res = await supabase
.storage
.listBuckets()
```
## Notes
- Policy permissions required:
- `buckets` permissions: `select`
- `objects` permissions: none
## Examples
### List buckets
```dart
final res = 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/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Updates a new Storage bucket
```dart
final res = await supabase
.storage
.updateBucket('avatars', { public: false });
```
## Notes
- Policy permissions required:
- `buckets` permissions: `update`
- `objects` permissions: none
## Examples
### Update bucket
```dart
final res = await supabase
.storage
.updateBucket('avatars', { public: false });
```
@@ -1,67 +0,0 @@
---
id: stream
title: 'stream()'
slug: /stream
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Notifies of data at the queried table.
```dart
supabase
.from('countries')
.stream(['id'])
.execute();
```
## 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'])
.execute();
```
### Listening to a specific rows within a table
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.
This syntax is the as how you can filter data in Realtime
```dart
supabase
.from('countries:id=eq.120')
.stream(['id'])
.execute();
```
### With `order()`
```dart
supabase
.from('countries')
.stream(['id'])
.order('name', ascending: false)
.execute();
```
### With `limit()`
```dart
supabase
.from('countries')
.stream(['id'])
.order('name', ascending: false)
.limit(10)
.execute();
```
@@ -1,119 +0,0 @@
---
id: subscribe
title: 'on().subscribe()'
slug: /subscribe
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Subscribe to realtime changes in your database.
```dart
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.all, (payload) {
// Handle realtime payload
})
.subscribe();
```
## Notes
- Realtime is disabled by default for new Projects for better database performance and security. You can turn it on by [managing replication](/docs/guides/api#managing-realtime).
- 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;`
## Examples
### Listen to all database changes
```dart
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.all, (payload) {
// Handle realtime payload
})
.subscribe();
```
### Listening to a specific table
```dart
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.all, (payload) {
// Handle realtime payload
})
.subscribe();
```
### Listening to inserts
```dart
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.insert, (payload) {
// Handle realtime payload
})
.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
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.update, (payload) {
// Handle realtime payload
})
.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
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.delete, (payload) {
// Handle realtime payload
})
.subscribe();
```
### Listening to multiple events
You can chain listeners if you want to listen to multiple events for each table.
```dart
final mySubscription = supabase
.from('countries')
.on(SupabaseEventTypes.insert, handleInsert)
.on(SupabaseEventTypes.delete, handleDelete)
.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
final mySubscription = supabase
.from('countries:id=eq.200')
.on(SupabaseEventTypes.update, handleRecordUpdated)
.subscribe();
```
@@ -1,77 +0,0 @@
---
id: textsearch
title: '.textSearch()'
slug: /textsearch
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat' & 'cat'",
config: 'english'
)
.execute();
```
### Basic normalization
Uses PostgreSQL's `plainto_tsquery` function.
```dart
final res = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat' & 'cat'",
type: TextSearchType.plain,
config: 'english'
)
.execute();
```
### Full normalization
Uses PostgreSQL's `phraseto_tsquery` function.
```dart
final res = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat' & 'cat'",
type: TextSearchType.phrase,
config: 'english'
)
.execute();
```
### 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 res = await supabase
.from('quotes')
.select('catchphrase')
.textSearch('catchphrase', "'fat or cat'",
type: TextSearchType.websearch,
config: 'english'
)
.execute();
```
@@ -1,55 +0,0 @@
---
id: update
title: 'Modify data: update()'
slug: /update
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs an UPDATE on the table.
```dart
final res = await supabase
.from('cities')
.update({ 'name': 'Middle Earth' })
.match({ 'name': 'Auckland' })
.execute();
```
## 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 res = await supabase
.from('cities')
.update({ 'name': 'Middle Earth' })
.match({ 'name': 'Auckland' })
.execute();
```
### 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 res = await supabase
.from('users')
.update({
'address': {
'street': 'Melrose Place',
'postcode': 90210
}
})
.eq('address->postcode', 90210)
.execute();
```
@@ -1,62 +0,0 @@
---
id: upsert
title: 'Upsert data: upsert()'
slug: /upsert
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
---
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
Performs an UPSERT into the table.
```dart
final res = await supabase
.from('messages')
.upsert({ 'id': 3, 'message': 'foo', 'username': 'supabot' })
.execute();
```
## 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 res = await supabase
.from('messages')
.upsert({ 'id': 3, 'message': 'foo', 'username': 'supabot' })
.execute();
```
### 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 res = await supabase
.from('users')
.upsert({ 'username': 'supabot' }, { 'onConflict': 'username' })
.execute();
```
### Return the exact number of rows
Allowed values for count option are `exact`, `planned` and `estimated`.
```dart
final res = await supabase
.from('users')
.upsert({
'id': 3,
'message': 'foo',
'username': 'supabot'
})
.execute(count: CountOption.exact);
```
@@ -1,44 +0,0 @@
---
id: using-filters
title: 'Using Filters'
slug: /using-filters
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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 res = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'The Shire') // Correct
.execute();
final res = await supabase
.from('cities')
.eq('name', 'The Shire') // Incorrect
.select('name, country_id')
.execute();
```
### Chaining
Filters can be chained together to produce advanced queries. For example:
```dart
final res = await supabase
.from('cities')
.select('name, country_id')
.gte('population', 1000)
.lt('population', 10000)
.execute();
```
@@ -1,13 +0,0 @@
---
id: using-modifiers
title: 'Using Modifiers'
slug: /using-modifiers
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.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.
@@ -0,0 +1,36 @@
---
id: initializing
title: 'Initializing'
slug: initializing
---
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,8 +1,7 @@
---
id: installing
title: 'Installing'
slug: /installing
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase_dart_v1_ref.yml
slug: installing
---
import Tabs from '@theme/Tabs'
+9 -1
View File
@@ -6,6 +6,14 @@ sidebar_label: Supabase Dart Library
# Supabase Dart Library
:::note
You're viewing the Supabase docs for a developer preview version.
Refer to the `v0` docs for the previous release.
:::
This reference documents every object and method available in Supabase's isomorphic Dart library, `supabase-dart`.
You can use the `supabase-dart` library to:
@@ -19,4 +27,4 @@ You can use the `supabase-dart` library to:
## Additional Links
- Source Code: [github.com/supabase/supabase-dart](https://github.com/supabase/supabase-dart)
- [Known bugs and issues](https://github.com/supabase/supabase-dart/issues)
- [Known bugs and issues](https://github.com/supabase/supabase-flutter/issues)
@@ -0,0 +1,22 @@
---
id: intro
slug: /
sidebar_label: Supabase Dart Library
---
# Supabase Dart Library
This reference documents every object and method available in Supabase's isomorphic Dart library, `supabase-dart`.
You can use the `supabase-dart` library to:
- interact with your Postgres database
- listen to database changes
- invoke Deno Edge Functions
- build login and user management functionality
- manage large files
## Additional Links
- Source Code: [github.com/supabase/supabase-dart](https://github.com/supabase/supabase-dart)
- [Known bugs and issues](https://github.com/supabase/supabase-dart/issues)
Loaded 100 of 2852 files, more files were not shown because too many files have changed in this diff. Show more