Merge branch 'master' into chore/change-dashboard-links

This commit is contained in:
Greg Richardson
2023-06-29 13:54:26 -06:00
324 changed files with 7418 additions and 3654 deletions

View File

@@ -12,9 +12,9 @@
- [x] Hosted Postgres Database. [Docs](https://supabase.com/docs/guides/database)
- [x] Authentication and Authorization. [Docs](https://supabase.com/docs/guides/auth)
- [x] Auto-generated APIs.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Realtime subscriptions. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Realtime subscriptions. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Functions.
- [x] Database Functions. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge Functions [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -1,7 +1,7 @@
import Link from 'next/link'
import { Button } from 'ui'
import { primaryLinks, secondaryLinks } from '~/data/footer'
import { LayoutMainContent } from '../../layouts/DefaultLayout'
import { LayoutMainContent } from '~/layouts/DefaultLayout'
const Footer = () => (
<LayoutMainContent className="pt-0">
@@ -75,20 +75,18 @@ const Footer = () => (
</Button>
<Button type="text" asChild>
<a href="https://youtube.com/c/supabase" target="_blank" rel="noreferrer noopener">
<a>
<svg
width="16"
height="17"
viewBox="0 0 16 17"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M15.665 4.35595C15.481 3.66308 14.9388 3.11739 14.2505 2.93221C13.0028 2.5957 7.99964 2.5957 7.99964 2.5957C7.99964 2.5957 2.99655 2.5957 1.74883 2.93221C1.06047 3.11742 0.518326 3.66308 0.334321 4.35595C0 5.61181 0 8.23207 0 8.23207C0 8.23207 0 10.8523 0.334321 12.1082C0.518326 12.8011 1.06047 13.324 1.74883 13.5092C2.99655 13.8457 7.99964 13.8457 7.99964 13.8457C7.99964 13.8457 13.0027 13.8457 14.2505 13.5092C14.9388 13.324 15.481 12.8011 15.665 12.1082C15.9993 10.8523 15.9993 8.23207 15.9993 8.23207C15.9993 8.23207 15.9993 5.61181 15.665 4.35595ZM6.36334 10.6111V5.85307L10.545 8.23212L6.36334 10.6111Z"
fill="var(--colors-scale9)"
/>
</svg>
</a>
<svg
width="16"
height="17"
viewBox="0 0 16 17"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M15.665 4.35595C15.481 3.66308 14.9388 3.11739 14.2505 2.93221C13.0028 2.5957 7.99964 2.5957 7.99964 2.5957C7.99964 2.5957 2.99655 2.5957 1.74883 2.93221C1.06047 3.11742 0.518326 3.66308 0.334321 4.35595C0 5.61181 0 8.23207 0 8.23207C0 8.23207 0 10.8523 0.334321 12.1082C0.518326 12.8011 1.06047 13.324 1.74883 13.5092C2.99655 13.8457 7.99964 13.8457 7.99964 13.8457C7.99964 13.8457 13.0027 13.8457 14.2505 13.5092C14.9388 13.324 15.481 12.8011 15.665 12.1082C15.9993 10.8523 15.9993 8.23207 15.9993 8.23207C15.9993 8.23207 15.9993 5.61181 15.665 4.35595ZM6.36334 10.6111V5.85307L10.545 8.23212L6.36334 10.6111Z"
fill="var(--colors-scale9)"
/>
</svg>
</a>
</Button>
<Button type="text" asChild>

View File

@@ -349,6 +349,11 @@ export const SocialLoginItems = [
icon: '/docs/img/icons/discord-icon',
url: '/guides/auth/social-login/auth-discord',
},
{
name: 'Kakao',
icon: '/docs/img/icons/kakao-icon',
url: '/guides/auth/social-login/auth-kakao',
},
{
name: 'Keycloak',
icon: '/docs/img/icons/keycloak-icon',

View File

@@ -60,6 +60,7 @@ const RefSectionHandler = (props: RefSectionHandlerProps) => {
const pageTitle = getPageTitle()
const section = props.sections.find((section) => section.slug === slug)
const fullTitle = `${pageTitle}${section ? ` - ${section.title}` : ''}`
const path = router.asPath.replace('/crawlers', '')
return (
<>
@@ -72,7 +73,7 @@ const RefSectionHandler = (props: RefSectionHandlerProps) => {
content={`https://supabase.com/docs/img/supabase-og-image.png`}
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="canonical" href={`https://supabase.com${router.basePath}${router.asPath}`} />
<link rel="canonical" href={`https://supabase.com${router.basePath}${path}`} />
</Head>
{props.isOldVersion && <OldVersionAlert sections={props.sections} />}
<RefSubLayout>

View File

@@ -79,6 +79,16 @@ const authProviders = [
selfHosted: true,
authType: 'social',
},
{
name: 'Kakao',
logo: '/docs/img/icons/kakao-icon',
href: '/guides/auth/social-login/auth-kakao',
official: true,
supporter: 'Supabase',
platform: true,
selfHosted: true,
authType: 'social',
},
{
name: 'Keycloak',
logo: '/docs/img/icons/keycloak-icon',

View File

@@ -1,5 +1,5 @@
import '../../../packages/ui/build/css/themes/light.css'
import '../../../packages/ui/build/css/themes/dark.css'
import '../../../packages/ui/build/css/themes/light.css'
import 'config/code-hike.scss'
import '../styles/main.scss?v=1.0.0'
@@ -13,6 +13,7 @@ import { useRouter } from 'next/router'
import { useCallback, useEffect, useState } from 'react'
import { AppPropsWithLayout } from 'types'
import { CommandMenuProvider } from 'ui'
import { TabsProvider } from 'ui/src/components/Tabs'
import Favicons from '~/components/Favicons'
import SiteLayout from '~/layouts/SiteLayout'
import { API_URL, IS_PLATFORM, LOCAL_SUPABASE } from '~/lib/constants'
@@ -150,9 +151,11 @@ function MyApp({ Component, pageProps }: AppPropsWithLayout) {
<AuthContainer>
<ThemeProvider>
<CommandMenuProvider site="docs">
<SiteLayout>
<Component {...pageProps} />
</SiteLayout>
<TabsProvider>
<SiteLayout>
<Component {...pageProps} />
</SiteLayout>
</TabsProvider>
</CommandMenuProvider>
</ThemeProvider>
</AuthContainer>

View File

@@ -12,7 +12,7 @@ Content sources for vectors can be extremely large. As you grow you should run y
## Simple workloads
For small workloads it's typical to store your data in a single database.
For small workloads, it's typical to store your data in a single database.
If you've used [Vecs](/docs/guides/ai/vecs-python-client) to create 3 different collections, you can expose collections to your web or mobile application using [views](/docs/guides/database/tables#views):
@@ -93,9 +93,9 @@ docs.query(
### Accessing external collections using Wrappers
Supabase supports [Foreign Data Wrappers](/blog/postgres-foreign-data-wrappers-rust). Wrappers allow you connect two databases together so that you can query them over the network.
Supabase supports [Foreign Data Wrappers](/blog/postgres-foreign-data-wrappers-rust). Wrappers allow you to connect two databases together so that you can query them over the network.
This involves 2 steps: connecting to your remote database from the primary, and creating a Foreign Table.
This involves 2 steps: connecting to your remote database from the primary and creating a Foreign Table.
#### Connecting your remote database
@@ -140,7 +140,7 @@ const { data, error } = await supabase
### Enterprise architecture
This diagram provides an example architecture, allowing you to access the collections either with our client libraries or using Vecs. You can add as many secondary databases as you need, in this example we show one only:
This diagram provides an example architecture that allows you to access the collections either with our client libraries or using Vecs. You can add as many secondary databases as you need (in this example we only show one):
<div>
<img

View File

@@ -7,7 +7,7 @@ export const meta = {
sidebar_label: 'Managing collections',
}
A collection is an group of vector records managed by the `vecs` Python library. Records can be added to or updated in a collection. Collections can be queried at any time, but should be indexed for scalable query performance.
A collection is a group of vector records managed by the `vecs` Python library. Records can be added to or updated in a collection. Collections can be queried at any time, but should be indexed for scalable query performance.
Supabase provides a [Python client](/docs/guides/ai/vecs-python-client) called `vecs` for managing unstructured vector stores in Postgres. If you come from a data science background, this unstructured data approach will feel familiar. If you are more interested in a structured data approach, see [Vector columns](/docs/guides/ai/vector-columns) or read our guide on [Structured & Unstructured Embeddings](/docs/guides/ai/structured-unstructured-embeddings).
@@ -32,7 +32,7 @@ vx = vecs.create_client(DB_CONNECTION)
### Create collection
You can create a collection to store vectors specifying the collections name and the number of dimensions in the vectors you intend to store.
You can create a collection to store vectors specifying the collection's name and the number of dimensions in the vectors you intend to store.
```python
docs = vx.create_collection(name="docs", dimension=3)
@@ -75,7 +75,7 @@ docs.upsert(
Collections can be queried immediately after being created.
However, for good performance, the collection should be indexed after records have been upserted.
Indexes should be created **after** the collection has been populated with records. Building an index on an empty collection will result in significantly reduced recall. Once the index has been created you can still upsert new documents into the collection but you should rebuild the index if the size of the collection more than doubles.
Indexes should be created **after** the collection has been populated with records. Building an index on an empty collection will significantly reduce recall. Once the index has been created you can still upsert new documents into the collection but you should rebuild the index if the size of the collection more than doubles.
Only one index may exist per-collection. By default, creating an index will replace any existing index.

View File

@@ -91,20 +91,20 @@ const getURL = () => {
let url =
process?.env?.NEXT_PUBLIC_SITE_URL ?? // Set this to your site URL in production env.
process?.env?.NEXT_PUBLIC_VERCEL_URL ?? // Automatically set by Vercel.
'http://localhost:3000/';
'http://localhost:3000/'
// Make sure to include `https://` when not localhost.
url = url.includes('http') ? url : `https://${url}`;
// Make sure to including trailing `/`.
url = url.charAt(url.length - 1) === '/' ? url : `${url}/`;
return url;
};
url = url.includes('http') ? url : `https://${url}`
// Make sure to include a trailing `/`.
url = url.charAt(url.length - 1) === '/' ? url : `${url}/`
return url
}
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'github'
provider: 'github',
options: {
redirectTo: getURL()
}
}
redirectTo: getURL(),
},
})
```
#### Mobile deep linking URIs

View File

@@ -14,16 +14,8 @@ This submodule provides convenience helpers for implementing user authentication
## Install the Next.js helper library
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="npm"
>
<TabPanel id="npm" label="npm">
```sh
npm install @supabase/auth-helpers-nextjs
```sh Terminal
npm install @supabase/auth-helpers-nextjs @supabase/supabase-js
```
This library supports the following tooling versions:
@@ -33,31 +25,10 @@ This library supports the following tooling versions:
Additionally, install the **React Auth Helpers** for components and hooks that can be used across all React-based frameworks.
```sh
```sh Terminal
npm install @supabase/auth-helpers-react
```
</TabPanel>
<TabPanel id="yarn" label="Yarn">
```sh
yarn add @supabase/auth-helpers-nextjs
```
This library supports the following tooling versions:
- Node.js: `^10.13.0 || >=12.0.0`
- Next.js: `>=10`
Additionally, install the **React Auth Helpers** for components and hooks that can be used across all React-based frameworks.
```sh
yarn add @supabase/auth-helpers-react
```
</TabPanel>
</Tabs>
## Set up environment variables
Retrieve your project URL and anon key in your project's [API settings](https://supabase.com/dashboard/project/_/settings/api) in the Dashboard to set up the following environment variables. For local development you can set them in a `.env.local` file. See an [example](https://github.com/supabase/auth-helpers/blob/main/examples/nextjs/.env.local.example).

View File

@@ -29,7 +29,7 @@ If you are using the `pages` directory, check out [Auth Helpers in Next.js Pages
Use the `create-next-app` command and the `with-supabase` template to automate the configuration of cookie-based auth with the Next.js Auth Helpers.
```sh
```sh Terminal
npx create-next-app -e with-supabase
```
@@ -54,7 +54,7 @@ NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
Run the development server and navigate to http://localhost:3000.
```bash
```sh Terminal
npm run dev
```
@@ -62,29 +62,10 @@ npm run dev
### Install Next.js Auth Helpers library
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="npm"
>
<TabPanel id="npm" label="npm">
```sh
npm install @supabase/auth-helpers-nextjs
```sh Terminal
npm install @supabase/auth-helpers-nextjs @supabase/supabase-js
```
</TabPanel>
<TabPanel id="yarn" label="Yarn">
```sh
yarn add @supabase/auth-helpers-nextjs
```
</TabPanel>
</Tabs>
### Declare Environment Variables
Retrieve your project's URL and anon key from your [API settings](https://supabase.com/dashboard/project/_/settings/api), and create a `.env.local` file with the following environment variables:
@@ -645,7 +626,7 @@ const supabase = createClientComponentClient({ isSingleton: false })
<div className="video-container">
<iframe
src="https://www.youtube-nocookie.com/embed/SUS1t6Kq7-8"
src="https://www.youtube-nocookie.com/embed/ywvXGW6P4Gs"
frameBorder="1"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen

View File

@@ -22,36 +22,14 @@ This submodule provides convenience helpers for implementing user authentication
## Install the Remix helper library
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="npm"
>
<TabPanel id="npm" label="npm">
```sh
npm install @supabase/auth-helpers-remix
```sh Terminal
npm install @supabase/auth-helpers-remix @supabase/supabase-js
```
This library supports the following tooling versions:
- Remix: `>=1.7.2`
</TabPanel>
<TabPanel id="yarn" label="Yarn">
```sh
yarn add @supabase/auth-helpers-remix
```
This library supports the following tooling versions:
- Remix: `>=1.7.2`
</TabPanel>
</Tabs>
## Set up environment variables
Retrieve your project URL and anon key in your project's [API settings](https://supabase.com/dashboard/project/_/settings/api) in the Dashboard to set up the following environment variables. For local development you can set them in a `.env` file. See an [example](https://github.com/supabase/auth-helpers/blob/main/examples/remix/.env.example).

View File

@@ -16,7 +16,7 @@ This submodule provides convenience helpers for implementing user authentication
This library supports Node.js `^16.15.0`.
```sh Terminal
npm install @supabase/auth-helpers-sveltekit
npm install @supabase/auth-helpers-sveltekit @supabase/supabase-js
```
### Declare Environment Variables

View File

@@ -7,58 +7,40 @@ export const meta = {
description: 'Render pages with user information on the server.',
}
Single-page apps with server-side rendering (SSR) is a popular way to optimize rendering
performance and leverage advanced caching strategies.
Single-page apps with server-side rendering (SSR) is a popular way to optimize rendering performance and leverage advanced caching strategies.
Supabase Auth supports server-side rendering when you need access to user
information, or your server needs to authorize API requests on behalf of your
user to render content.
Supabase Auth supports server-side rendering when you need access to user information, or your server needs to authorize API requests on behalf of your user to render content.
When a user authenticates with Supabase Auth, two pieces of information are
issued by the server:
When a user authenticates with Supabase Auth, two pieces of information are issued by the server:
1. **Access token** in the form of a JWT.
2. **Refresh token** which is a randomly generated string.
Most Supabase projects have their auth server listening on
`<project-ref>.supabase.co/auth/v1`, thus the access token and refresh token are
set as `sb-access-token` and `sb-refresh-token` cookies on the
`<project-ref>.supabase.co` domain.
Most Supabase projects have their auth server listening on `<project-ref>.supabase.co/auth/v1`, thus the access token and refresh token are set as `sb-access-token` and `sb-refresh-token` cookies on the `<project-ref>.supabase.co` domain.
<Admonition type="note">
These cookie names are for internal Supabase use only and may change without
warning. They are included in this guide for illustration purposes only.
These cookie names are for internal Supabase use only and may change without warning. They are included in this guide for illustration purposes only.
</Admonition>
Web browsers limit access to cookies across domains, consistent with the
[Same-Origin Policy
(SOP)](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).
Web browsers limit access to cookies across domains, consistent with the [Same-Origin Policy (SOP)](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).
Your web application cannot access these cookies,
nor will these cookies be sent to your application's server.
Your web application cannot access these cookies, nor will these cookies be sent to your application's server.
## Understanding the authentication flow
When you call one of the `signIn` methods, the client library running in the
browser sends the request to the Supabase Auth server. The Auth server determines
whether to verify a phone number, email and password combination, a Magic Link,
or use a social login (if you have any setup in your project).
When you call one of the `signIn` methods, the client library running in the browser sends the request to the Supabase Auth server. The Auth server determines whether to verify a phone number, email and password combination, a Magic Link, or use a social login (if you have any setup in your project).
Upon successful verification of the identity of the user, the Supabase Auth
server redirects the user back to your single-page app.
Upon successful verification of the identity of the user, the Supabase Auth server redirects the user back to your single-page app.
<Admonition type="tip">
You can configure [redirects URLs](https://supabase.com/dashboard/project/_/auth/url-configuration) in the Supabase Dashboard. You can use [wildcard match patterns](/docs/guides/auth#redirect-urls-and-wildcards)
like `*` and `**` to allow redirects to different forms of URLs.
You can configure [redirects URLs](https://supabase.com/dashboard/project/_/auth/url-configuration) in the Supabase Dashboard. You can use [wildcard match patterns](/docs/guides/auth#redirect-urls-and-wildcards) like `*` and `**` to allow redirects to different forms of URLs.
</Admonition>
Supabase Auth supports two authentication flows: **Implicit** and **PKCE**. The **PKCE** flow is generally preferred when on the server.
It introduces a few additional steps which guard a against replay and URL capture attacks. Unlike the implicit flow, it also allows users to access the
`access_token` and `refresh_token` on the server.
Supabase Auth supports two authentication flows: **Implicit** and **PKCE**. The **PKCE** flow is generally preferred when on the server. It introduces a few additional steps which guard a against replay and URL capture attacks. Unlike the implicit flow, it also allows users to access the `access_token` and `refresh_token` on the server.
<Accordion
type="default"
@@ -74,30 +56,23 @@ It introduces a few additional steps which guard a against replay and URL captur
id={`ssr-implicit-flow`}
>
When using the implicit flow, a redirect URL will be returned with the following structure:
```
https://yourapp.com/...#access_token=<...>&refresh_token=<...>&...
```
When using the implicit flow, a redirect URL will be returned with the following structure:
```
https://yourapp.com/...#access_token=<...>&refresh_token=<...>&...
```
The first access and refresh tokens after a successful verification are
contained in the URL fragment (anything after the `#` sign) of the redirect
location. This is intentional and not configurable.
The first access and refresh tokens after a successful verification are contained in the URL fragment (anything after the `#` sign) of the redirect location. This is intentional and not configurable.
The client libraries are designed to listen for this type of URL, extract
the access token, refresh token and some extra information from it, and finally
persist it in local storage for further use by the library and your app.
The client libraries are designed to listen for this type of URL, extract the access token, refresh token and some extra information from it, and finally persist it in local storage for further use by the library and your app.
<Admonition type="info">
<Admonition type="info">
Web browsers do not send the URL fragment to the server they're making the request to. Since you may not be hosting the single-page app on a server under your direct control (such as on GitHub Pages or other freemium hosting providers), we want to prevent hosting services from getting access to your user's authorization credentials by default.
Even if the server is under your direct control, `GET` requests and their full URLs are often logged. This approach also avoids leaking credentials in request or access logs. If you wish to obtain the `access_token` and `refresh_token` on a server, please consider using the PKCE flow.
</Admonition>
Web browsers do not send the URL fragment to the server they're making the
request to. Since you may not be hosting the single-page app on a server under
your direct control (such as on GitHub Pages or other freemium hosting
providers), we want to prevent hosting services from getting access to your
user's authorization credentials by default. Even if the server is under your
direct control, `GET` requests and their full URLs are often logged. This
approach also avoids leaking credentials in request or access logs. If you wish to obtain the
`access_token` and `refresh_token` on a server, please consider using the PKCE flow.
</Admonition>
</Accordion.Item>
</div>
<div className="border-b pb-3">
@@ -105,18 +80,21 @@ approach also avoids leaking credentials in request or access logs. If you wish
header={<span className="text-scale-1200 font-bold">PKCE</span>}
id={`ssr-pkce-flow`}
>
When using the PKCE flow, a redirect URL will be returned with the following structure:
```
https://yourapp.com/...?code=<...>
```
The `code` parameter is commonly known as the Auth Code and can be exchanged for an access token by calling `exchangeCodeForSession(code)`.
<Admonition type="info">
For security purposes, the code has a validity of 5 minutes and can only be exchanged for an access token once. You
will need to restart the authentication flow from scratch if you wish to obtain a new access token.
For security purposes, the code has a validity of 5 minutes and can only be exchanged for an access token once. You will need to restart the authentication flow from scratch if you wish to obtain a new access token.
</Admonition>
As the flow is run server side, `localStorage` may not be available. You may configure the client library to use a custom storage adapter an alternate backing storage such as cookies
by setting the `storage` option to an object with the following methods:
As the flow is run server side, `localStorage` may not be available. You may configure the client library to use a custom storage adapter an alternate backing storage such as cookies by setting the `storage` option to an object with the following methods:
```js
const customStorageAdapter: SupportedStorage = {
getItem: (key) => {
@@ -161,26 +139,19 @@ approach also avoids leaking credentials in request or access logs. If you wish
}
)
```
You can read more about the PKCE flow [here](https://oauth.net/2/pkce/)
[Learn more](https://oauth.net/2/pkce/) about the PKCE flow.
</Accordion.Item>
</div>
</Accordion>
## Bringing it together
As seen from the authentication flow, the initial request after successful
login made by the browser to your app's server after user login **does not
contain any information about the user**. This is because first the client-side
JavaScript library must run before it makes the access and refresh token
available to your server.
As seen from the authentication flow, the initial request after successful login made by the browser to your app's server after user login **does not contain any information about the user**. This is because first the client-side JavaScript library must run before it makes the access and refresh token available to your server.
It is very important to make sure that the redirect route right after login
works without any server-side rendering. Other routes requiring authorization
do not have the same limitation, provided you send the access and refresh
tokens to your server.
It is very important to make sure that the redirect route right after login works without any server-side rendering. Other routes requiring authorization do not have the same limitation, provided you send the access and refresh tokens to your server.
This is traditionally done by setting cookies. Here's an example you
can add to the root of your application:
This is traditionally done by setting cookies. Here's an example you can add to the root of your application:
```typescript
supabase.auth.onAuthStateChange((event, session) => {
@@ -197,15 +168,9 @@ supabase.auth.onAuthStateChange((event, session) => {
})
```
This uses the standard
[`document.cookie` API](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie)
to set cookies on all paths of your app's domain. All subsequent requests
made by the browser to your app's server include the `my-access-token` and
`my-refresh-token` cookies (the names of the cookies and additional
parameters can be changed).
This uses the standard [`document.cookie` API](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie) to set cookies on all paths of your app's domain. All subsequent requests made by the browser to your app's server include the `my-access-token` and `my-refresh-token` cookies (the names of the cookies and additional parameters can be changed).
In your server-side rendering code you can now access user and session
information:
In your server-side rendering code you can now access user and session information:
```typescript
const refreshToken = req.cookies['my-refresh-token']
@@ -228,23 +193,13 @@ if (refreshToken && accessToken) {
await supabase.auth.getUser()
```
Use `setSession({ access_token, refresh_token })` instead of
`setSession(refreshToken)` or `getUser(accessToken)` as refresh tokens or access tokens alone do not properly identify a user session.
Use `setSession({ access_token, refresh_token })` instead of `setSession(refreshToken)` or `getUser(accessToken)` as refresh tokens or access tokens alone do not properly identify a user session.
Access tokens are valid only for a short amount of time.
Even though refresh tokens are long-lived, there is no guarantee that a user
has an active session. They may have logged out and your application failed to
remove the `my-refresh-token` cookie, or some other failure occurred that left
a stale refresh token in the browser. Furthermore, a refresh token can only be
used a few seconds after it was first used. Only use a refresh token if the
access token is about to expire, which will avoid the introduction of difficult
to diagnose logout bugs in your app.
Even though refresh tokens are long-lived, there is no guarantee that a user has an active session. They may have logged out and your application failed to remove the `my-refresh-token` cookie, or some other failure occurred that left a stale refresh token in the browser. Furthermore, a refresh token can only be used a few seconds after it was first used. Only use a refresh token if the access token is about to expire, which will avoid the introduction of difficult to diagnose logout bugs in your app.
A good practice is to handle unauthorized errors by deferring rendering the
page in the browser instead of in the server. Some user information is
contained in the access token though, so in certain cases, you may be able to
use this potentially stale information to render a page.
A good practice is to handle unauthorized errors by deferring rendering the page in the browser instead of in the server. Some user information is contained in the access token though, so in certain cases, you may be able to use this potentially stale information to render a page.
## Frequently Asked Questions
@@ -256,57 +211,36 @@ To improve experience for your users, we recommend redirecting users to one spec
### How do I make the cookies `HttpOnly`?
This is not necessary. Both the access token and refresh token are designed to
be passed around to different components in your application. The browser-based
side of your application needs access to the refresh token to properly maintain
a browser session anyway.
This is not necessary. Both the access token and refresh token are designed to be passed around to different components in your application. The browser-based side of your application needs access to the refresh token to properly maintain a browser session anyway.
### My server is getting invalid refresh token errors. What's going on?
It is likely that the refresh token sent from the browser to your server is
stale. Make sure the `onAuthStateChange` listener callback is free of bugs and
is registered relatively early in your application's lifetime.
It is likely that the refresh token sent from the browser to your server is stale. Make sure the `onAuthStateChange` listener callback is free of bugs and is registered relatively early in your application's lifetime
When you receive this error on the server-side, try to defer
rendering to the browser where the client library can access an up-to-date
refresh token and present the user with a better experience.
When you receive this error on the server-side, try to defer rendering to the browser where the client library can access an up-to-date refresh token and present the user with a better experience.
### Should I set a shorter `Max-Age` parameter on the cookies?
The `Max-Age` or `Expires` cookie parameters only control whether the browser
sends the value to the server. Since a refresh token represents the
long-lived authentication session of the user on that browser, setting a short
`Max-Age` or `Expires` parameter on the cookies only results in a degraded
user experience.
The `Max-Age` or `Expires` cookie parameters only control whether the browser sends the value to the server. Since a refresh token represents the long-lived authentication session of the user on that browser, setting a short `Max-Age` or `Expires` parameter on the cookies only results in a degraded user experience.
The only way to ensure that a user has logged out or their session has ended
is to get the user's details with `getUser()`.
The only way to ensure that a user has logged out or their session has ended is to get the user's details with `getUser()`.
### What should I use for the `SameSite` property?
Make sure you [understand the behavior of the property in different
situations](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite)
as some properties can degrade the user experience.
Make sure you [understand the behavior of the property in different situations](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) as some properties can degrade the user experience.
A good default is to use `Lax` which sends cookies when users are
navigating to your site. Cookies typically require the `Secure` attribute,
which only sends them over HTTPS. However, this can be a problem when
developing on `localhost`.
A good default is to use `Lax` which sends cookies when users are navigating to your site. Cookies typically require the `Secure` attribute, which only sends them over HTTPS. However, this can be a problem when developing on `localhost`.
### Can I use server-side rendering with a CDN or cache?
Yes, but you need to be careful to include at least the refresh token cookie
value in the cache key. Otherwise you may be accidentally serving pages with
data belonging to different users!
Yes, but you need to be careful to include at least the refresh token cookie value in the cache key. Otherwise you may be accidentally serving pages with data belonging to different users!
Also be sure you set proper cache control headers. We recommend invalidating
cache keys every hour or less.
export const Page = ({ children }) => <Layout meta={meta} children={children} />
export default Page
Also be sure you set proper cache control headers. We recommend invalidating cache keys every hour or less.
### Which authentication flows have PKCE support?
At present, PKCE is supported on the Magic Link, OAuth, Sign Up, and Password Recovery routes. These correspond to the `signInWithOtp`, `signInWithOAuth`, `signUp`, and `resetPasswordForEmail` methods on the Supabase client library. When using PKCE with Phone and Email OTPs, there is no behavior change with respect to the implicit flow - an access token will be returned in the body when a request is successful.
export const Page = ({ children }) => <Layout meta={meta} children={children} />
export default Page

View File

@@ -4,95 +4,53 @@ import AppleSecretGenerator from '~/components/AppleSecretGenerator'
export const meta = {
id: 'auth-apple',
title: 'Login with Apple',
description: 'Add Apple OAuth to your Supabase project',
description: 'Use Sign in with Apple with Supabase',
}
To enable Apple Auth for your project, you need to set up an Apple OAuth application and add the application credentials to your Supabase Dashboard.
Supabase Auth supports using [Sign in with Apple](https://developer.apple.com/sign-in-with-apple/) on the web and in native apps for iOS, macOS, watchOS or tvOS.
## Overview
Apple OAuth consists of six broad steps:
To support Sign in with Apple, you need to configure the [Apple provider in the Supabase dashboard](https://supabase.com/dashboard/project/_/auth/providers) for your project.
- Obtaining an `App Id` with “Sign In with Apple” capabilities.
- Obtaining a `Services Id` - this will serve as the `client_id`.
- Obtaining a `secret key` that will be used to get our `client_secret`.
- Generating the `client_secret` using the `secret key`.
- Add your `client id` and `client secret` keys to your [Supabase Project](https://supabase.com/dashboard).
- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js).
There are three general ways to use Sign in with Apple, depending on the application you're trying to build:
## Access your Apple Developer account
- Sign in on the web or in web-based apps
- Using an OAuth flow initiated by Supabase Auth using the [Sign in with Apple REST API](https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_rest_api).
- Using [Sign in with Apple JS](https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js) directly in the browser, usually suitable for websites.
- Sign in natively inside iOS, macOS, watchOS or tvOS apps using [Apple's Authentication Services](https://developer.apple.com/documentation/authenticationservices)
- Go to [developer.apple.com](https://developer.apple.com).
- Click on `Account` at the top right to log in.
In some cases you're able to use the OAuth flow within web-based native apps such as with [React Native](https://reactnative.dev), [Expo](https://expo.dev) or other similar frameworks. It is best practice to use native Sign in with Apple capabilities on those platforms instead.
![Apple Developer Portal.](/docs/img/guides/auth-apple/apple-developer-portal.png)
Before you can use Sign in with Apple, you need to obtain an [Apple Developer](https://developer.apple.com) account.
## Obtain an App ID
## Using the OAuth flow for web
- Go to `Certificates, Identifiers & Profiles`.
- Click on `Identifiers` at the left.
- Click on the `+` sign in the upper left next to `Identifiers`.
- Select `App IDs` and click `Continue`.
- Select type `App` and click `Continue`.
- Fill out your app information:
- App description.
- Bundle ID (Apple recommends reverse-domain name style, so if your domain is acme.com and your app is called roadrunner, use: "com.acme.roadrunner").
- Scroll down and check `Sign In With Apple`.
- Click `Continue` at the top right.
- Click `Register` at the top right.
Sign in with Apple's OAuth flow is designed for web or browser based sign in methods. It can be used on web-based apps as well as websites, though some users can benefit by using Sign in with Apple JS directly.
## Obtain a Services ID
Behind the scenes, Supabase Auth uses the [REST APIs](https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_rest_api) provided by Apple.
This will serve as the `client_id` when you make API calls to authenticate the user.
To initiate sign in, you can use the `signInWithOAuth()` method from the Supabase JavaScript library:
- Go to `Certificates, Identifiers & Profiles`.
- Click on `Identifiers` at the left.
- Click on the `+` sign in the upper left next to `Identifiers`.
- Select `Services IDs` and click `Continue`.
- Fill out your information:
- App description.
- Bundle ID (you can't use the same Bundle ID from the previous step, but you can just add something to the beginning, such as "app." to make it app.com.acme.roadrunner").
- SAVE THIS ID -- this ID will become your `client_id` later.
- Click `Continue` at the top right.
- Click `Register` at the top right.
```ts
supabase.auth.signInWithOAuth({
provider: 'apple',
})
```
## Find your callback URL
This call takes the user to Apple's consent screen. Once the flow ends, the user's profile information is exchanged and validated with Supabase Auth before it redirects back to your web application with an access and refresh token representing the user's session.
<SocialProviderSetup provider="Apple" />
### Configuration
## Configure your Services ID
You will require the following information:
- Under `Identifiers`, click on your newly-created Services ID.
- Check the box next to `Sign In With Apple` to enable it.
- Click `Configure` to the right.
- Make sure your newly created Bundle ID is selected under `Primary App ID`
- Add your domain to the `Domains and Subdomains` box (do not add `https://`, just add the domain).
- In the `Return URLs` box, type the callback URL of your app which you found in the previous step and click `Next` at the bottom right.
- Click `Done` at the bottom.
- Click `Continue` at the top right.
- Click `Save` at the top right.
## Download your secret key
Now you'll need to download a `secret key` file from Apple that will be used to generate your `client_secret`.
- Go to `Certificates, Identifiers & Profiles`.
- Click on `Keys` at the left.
- Click on the `+` sign in the upper left next to `Keys`.
- Enter a `Key Name`.
- Check `Sign In with Apple`.
- Click `Configure` to the right.
- Select your newly-created Services ID from the dropdown selector.
- Click `Save` at the top right.
- Click `Continue` at the top right.
- Click `Register` at the top right.
- Click `Download` at the top right.
- Save the downloaded file -- this contains your "secret key" that will be used to generate your `client_secret`.
- Click `Done` at the top right.
## Generate a client secret
You need to configure a client secret when using Sign in with Apple for Web. This is a specially crafted [JWT signed with a secret key downloaded from Apple's Developer Center](https://developer.apple.com/documentation/signinwithapplerestapi/generate_and_validate_tokens).
1. Your Apple Developer account's **Team ID**, which is an alphanumeric string of 10 characters that uniquely identifies the developer of the app. It's often easily accessible in the upper right-side menu on the Apple Developer Console.
2. Register email sources for _Sign in with Apple for Email Communication_ which can be found in the [Services](https://developer.apple.com/account/resources/services/list) section of the Apple Developer Console.
3. An **App ID** which uniquely identifies the app you are building. You can create a new App ID from the [Identifiers](https://developer.apple.com/account/resources/identifiers/list/bundleId) section in the Apple Developer Console (use the filter menu in the upper right side to see all App IDs). These usually are a reverse domain name string, for example `com.example.app`. Make sure you configure Sign in with Apple once you create an App ID in the Capabilities list. At this time Supabase Auth does not support Server-to-Server notification endpoints, so you should leave that setting blank. (In the past App IDs were referred to as _bundle IDs._)
4. A **Services ID** which uniquely identifies the web services provided by the app you registered in the previous step. You can create a new Services ID from the [Identifiers](https://developer.apple.com/account/resources/identifiers/list/serviceId) section in the Apple Developer Console (use the filter menu in the upper right side to see all Services IDs). These usually are a reverse domain name string, for example `com.example.app.web`.
5. Configure Website URLs for the newly created **Services ID**. The web domain you should use is the domain your Supabase project is hosted on. This is usually `<project-id>.supabase.co` while the redirect URL is `https://<project-id>.supabase.co/auth/v1/callback`.
6. Create a signing **Key** in the [Keys](https://developer.apple.com/account/resources/authkeys/list) section of the Apple Developer Console. You can use this key to generate a secret key using the tool below, which is added to your Supabase project's Auth configuration. Make sure you safely store the `AuthKey_XXXXXXXXXX.p8` file. If you ever loose access to it, or make it public accidentally please revoke it from the Apple Developer Console and create a new one immediately. You will have to generate a new secret key using this file every 6 months, so make sure you schedule a recurring meeting in your calendar!
7. Finally, add the information you configured above to the [Apple provider configuration in the Supabase dashboard](https://supabase.com/dashboard/project/_/auth/providers).
<Admonition>
Use this tool to generate a new Apple client secret. No keys leave your browser!
@@ -100,34 +58,113 @@ You need to configure a client secret when using Sign in with Apple for Web. Thi
<AppleSecretGenerator />
## Add your OAuth credentials to Supabase
## Using native sign in
<SocialProviderSettingsSupabase provider="Apple" />
Unlike the OAuth flow which requires the use of a web browser, the native Sign in with Apple flow on iOS, macOS, watchOS or tvOS uses the [operating system's built-in functionalities](https://developer.apple.com/documentation/authenticationservices) to prompt the user for consent.
## Add login code to your client app
When the user provides consent, Apple issues an identity token (commonly abbreviated as ID token) that is then sent to your project's Supabase Auth server. When valid, a new user session is started by issuing an access and refresh token from Supabase Auth.
When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `apple` as the `provider`:
If you are building an iOS or macOS app using Flutter, you can use [apple_sign_in](https://pub.dev/packages/sign_in_with_apple) package to quickly get the user's consent and sign them in to your Supabase project:
```js
async function signInWithApple() {
const { data, error } = await supabase.auth.signInWithOAuth({
```dart
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
import 'package:crypto/crypto.dart';
Future<AuthResponse> signInWithApple() {
// Generate a random string
final rawNonce = _generateRandomString();
final hashedNonce = sha256.convert(utf8.encode(rawNonce)).toString();
final credential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
nonce: hashedNonce,
);
final idToken = credential.identityToken;
if (idToken == null) {
throw 'Could not find ID Token from generated credential.';
}
return signInWithIdToken(
provider: Provider.apple,
idToken: idToken,
nonce: rawNonce,
);
}
```
In the Supabase JavaScript library, which you can use with web-based native frameworks like React Native or Expo, you can invoke this functionality like so:
```ts
await supabase.auth.signInWithIdToken({
provider: 'apple',
token: '<identity token received from the OS>',
})
```
Please take a look at these open-source projects which may help you obtain an ID token directly from the OS:
- [invertase/react-native-apple-authentication](https://github.com/invertase/react-native-apple-authentication)
- [Expo AppleAuthentication](https://docs.expo.dev/versions/latest/sdk/apple-authentication/)
For apps written in Swift, please consult the [community maintained library](/docs/reference/swift/introduction).
### Configuration
Native sign in requires less configuration steps than OAuth flow. You will need to perform these steps:
1. Have an **App ID** which uniquely identifies the app you are building. You can create a new App ID from the [Identifiers](https://developer.apple.com/account/resources/identifiers/list/bundleId) section in the Apple Developer Console (use the filter menu in the upper right side to see all App IDs). These usually are a reverse domain name string, for example `com.example.app`. Make sure you configure Sign in with Apple for the App ID you created or already have, in the Capabilities list. At this time Supabase Auth does not support Server-to-Server notification endpoints, so you should leave that setting blank. (In the past App IDs were referred to as _bundle IDs._)
2. Register all of the App IDs that will be using your Supabase project in the [Apple provider configuration in the Supabase dashboard](https://supabase.com/dashboard/project/_/auth/providers) under _Authorized Client IDs_.
Note that if you're building a native app only, you do not need to setup the OAuth flow.
## Using Sign in with Apple JS
[Sign in with Apple JS](https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js) is an official Apple framework for authenticating Apple users on websites. Although it can be used in web-based apps, those use cases will benefit more with the OAuth flow described above. We recommend using this method on classic websites only.
You can use the `signInWithIdToken()` method from the Supabase JavaScript library on the website to obtain an access and refresh token once the user has given consent using Sign in with Apple JS:
```ts
function signIn() {
const data = await AppleID.auth.signIn()
await supabase.auth.signInWithIdToken({
provider: 'apple',
token: data.id_token,
nonce: '<nonce used in AppleID.auth.init>',
})
}
```
When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage:
Alternatively, you can use the `AppleIDSignInOnSuccess` event with the `usePopup` option:
```js
async function signout() {
const { error } = await supabase.auth.signOut()
}
```ts
// Listen for authorization success.
document.addEventListener('AppleIDSignInOnSuccess', async (event) => {
await supabase.auth.signInWithIdToken({
provider: 'apple',
token: event.data.id_token,
nonce: '<value used in appleid-signin-nonce meta tag>',
})
})
```
## Resources
Please make sure you request for the scope `name email` when initializing the library.
- [Apple Developer Account](https://developer.apple.com).
- Thanks to [Janak Amarasena](https://medium.com/@janakda) who did all the heavy lifting in [How to configure Sign In with Apple](https://medium.com/identity-beyond-borders/how-to-configure-sign-in-with-apple-77c61e336003).
### Configuration
To use Sign in with Apple JS you need to configure these options:
1. Have an **App ID** which uniquely identifies the app you are building. You can create a new App ID from the [Identifiers](https://developer.apple.com/account/resources/identifiers/list/bundleId) section in the Apple Developer Console (use the filter menu in the upper right side to see all App IDs). These usually are a reverse domain name string, for example `com.example.app`. Make sure you configure Sign in with Apple for the App ID you created or already have, in the Capabilities list. At this time Supabase Auth does not support Server-to-Server notification endpoints, so you should leave that setting blank. (In the past App IDs were referred to as _bundle IDs._)
2. Obtain a **Services ID** attached to the App ID that uniquely identifies the website. Use this value as the client ID when initializing Sign in with Apple JS. You can create a new Services ID from the [Identifiers](https://developer.apple.com/account/resources/identifiers/list/serviceId) section in the Apple Developer Console (use the filter menu in the upper right side to see all Services IDs). These usually are a reverse domain name string, for example `com.example.app.website`.
3. Configure Website URLs for the newly created **Services ID**. The web domain you should use is the domain your website is hosted on. The redirect URL must also point to a page on your website that will receive the callback from Apple.
4. Register the Services ID you created to your project's [Apple provider configuration in the Supabase dashboard](https://supabase.com/dashboard/project/_/auth/providers) under _Authorized Client IDs_.
Note that if you're using Sign in with Apple JS you do not need to configure the OAuth settings.
export const Page = ({ children }) => <Layout meta={meta} children={children} />

View File

@@ -3,120 +3,288 @@ import Layout from '~/layouts/DefaultGuideLayout'
export const meta = {
id: 'auth-google',
title: 'Login with Google',
description: 'Add Google OAuth to your Supabase project',
description: 'Use Sign in with Google on the web, in native apps or with Chrome extensions',
}
To enable Google Auth for your project, you need to set up a Google OAuth application and add the application credentials to your Supabase Dashboard.
Supabase Auth supports Sign in with Google on the web, native Android applications and Chrome extensions.
## Overview
Setting up Google logins for your application consists of 3 parts:
To support Sign in with Google you need to configure the [Google provider in the Supabase dashboard](https://supabase.com/dashboard/project/_/auth/providers) for your project.
- Create and configure a Google Project on the [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard)
- Add your Google OAuth keys to your [Supabase Project](https://supabase.com/dashboard)
- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js)
There are three general ways to use Sign in with Google, depending on the application you're building:
## Access your Google Cloud Platform account
- Sign in on the web or in web-based apps
- Using an OAuth flow initiated by Supabase Auth using [Google Identity Authorization with OAuth 2.0 for Web Server Applications](https://developers.google.com/identity/protocols/oauth2/web-server).
- Using a [personalized sign-in button](https://developers.google.com/identity/gsi/web/guides/personalized-button) or [One Tap](https://developers.google.com/identity/gsi/web/guides/display-google-one-tap) and [automatic sign-in](https://developers.google.com/identity/gsi/web/guides/automatic-sign-in-sign-out) for users already logged in to their Google account.
- Sign in in native Android apps and Chrome extensions
- Go to [cloud.google.com](https://cloud.google.com).
- Click on `Sign in` at the top right to log in.
In some cases you're able to use the OAuth flow within web-based native apps such as with React Native, Expo or other similar frameworks. It is best practice to use native Sign in with Google capabilities whenever possible.
![Google Developer Portal.](/docs/img/guides/auth-google/google-portal.png)
Before you can use Sign in with Google, you need to obtain a [Google Cloud Platform](https://console.cloud.google.com/home/dashboard) account and have a project ready or create a new one.
## Create a Google Cloud Platform Project
## Using the OAuth flow for the web
- Click on `Select a Project` at the top left.
- (Or, if a project is currently selected, click on the current project name at the top left.)
- Click `New Project` at the top right.
- Fill in your app information, then click `Create`.
- (This can take a few minutes.)
- This should bring you to the dashboard for your new project.
Sign in with Google's OAuth flow is designed for web or browser based sign in methods. It can be used in web-based apps as well as in websites, though sometimes it is worthwhile considering using One Tap login directly.
## Create the OAuth Keys for your project
Behind the scenes, Supabase Auth uses the [Google OAuth 2.0 APIs](https://developers.google.com/identity/openid-connect/openid-connect), which are OpenID Connect certified, to perform the authentication.
From your project's dashboard screen:
To initiate sign in, you can use the `signInWithOAuth()` method from the Supabase JavaScript library:
- In the search bar at the top labeled `Search products and resources` type `OAuth`.
- Click on `OAuth consent screen` from the list of results.
- On the `OAuth consent screen` page select `External`.
- Click `Create`.
## Edit your app information
- On the `Edit app registration` page fill out your app information.
- Click `Save and continue` at the bottom.
## Find your callback URL
<SocialProviderSetup provider="Google" />
## Create your Google credentials
- Click `Credentials` at the left to go to the `Credentials` page on the Google Cloud Platform console.
- Click `Create Credentials` near the top then select `OAuth client ID`
- On the `Create OAuth client ID` page, select your application type. If you're not sure, choose `Web application`.
- Fill in your app name.
- At the bottom, under `Authorized redirect URIs` click `Add URI`.
- Enter your callback URI under `Authorized redirect URIs` at the bottom.
- Enter your callback URI in the `Valid OAuth Redirect URIs` box.
- Click `Save Changes` at the bottom right.
- Click `Create`.
Copy your new OAuth credentials
- A box will appear called `OAuth client created`.
- Copy and save the values under `Your Client ID` and `Your Client Secret`.
## Enter your Google credentials into your Supabase Project
<SocialProviderSettingsSupabase provider="Google" />
## Add login code to your client app
When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `google` as the `provider`:
```js
async function signInWithGoogle() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
})
}
```ts
supabase.auth.signInWithOAuth({
provider: 'google',
})
```
You can view the full list of query parameters and their descriptions [here](https://developers.google.com/identity/protocols/oauth2/web-server#creatingclient).
This call takes the user to Google's consent screen. When the flow ends, the user's profile information is exchanegd and validated with Supabase Auth before it redirects back to your web application with an access and refresh token representing the user's session.
When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage:
You can additionally extract the `provider_token` from the session (on initial login only) which is the OAuth 2.0 access token issued by Google that grants your application access to the Google services for the authenticated users. Please store this token in local storage, cookies or in your database or server.
```js
async function signout() {
const { error } = await supabase.auth.signOut()
}
```
Google does not send out a refresh token by default, so you will need to pass parameters like these to `signInWithOAuth()` in order to extract the `provider_refresh_token`:
## Obtain the provider refresh token
Google OAuth2.0 doesn't return the `provider_refresh_token` by default. If you need the `provider_refresh_token` returned, you will need to add additional query parameters:
```js
async function signInWithGoogle() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
queryParams: {
access_type: 'offline',
prompt: 'consent',
hd: 'domain.com', // google will also allow OAuth logins to be restricted to a specified domain using the 'hd' parameter
},
```ts
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'google',
options: {
queryParams: {
access_type: 'offline',
prompt: 'consent',
},
},
})
```
### Configuration
To use the OAuth 2.0 flow, you will require the following information:
1. Obtain OAuth credentials for your Google Cloud project in the [Credentials](https://console.developers.google.com/apis/credentials) page of the console. When creating a new credential, choose _Web application_. In _Authorized redirect URIs_ enter `https://<project-id>.supabase.co/auth/v1/callback`. This URL will be seen by your users, and you can customize it by configuring [custom domains](/docs/guides/platform/custom-domains).
2. Configure the [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent). This information is shown to the user when giving consent to your app. Within _Authorized domains_ make sure you add your Supabase project's domain `<project-id>.supabase.co`. Configure the non-sensitive scopes by making sure the following ones are selected: `.../auth/userinfo.email`, `.../auth/userinfo.profile`, `openid`. If you're selecting other sensitive scopes, your app may require additional verification. In those cases, it's best to use [custom domains](/docs/guides/platform/custom-domains).
3. Finally, add the client ID and secret from step 1 in the [Google provider on the Supabase Dashboard](https://supabase.com/dashboard/project/_/auth/providers).
## Using native sign in
Unlike the OAuth flow which requires the use of a web browser, the native Sign in with Google flow on Android uses the [operating system's built-in functionalities](https://developers.google.com/android/reference/com/google/android/gms/auth/api/identity/package-summary) to prompt the user for consent. Note that native sign-in has been rebranded as _One Tap sign-in on Android_ by Google, which you should not confuse with _One Tap sign in for web_, as mentioned below.
When the user provides consent, Google issues an identity token (commonly abbreviated as ID token) that is then sent to your project's Supabase Auth server. When valid, a new user session is started by issuing an access and refresh token from Supabase Auth.
If you are building a Flutter app, you can use [flutter_appauth](https://pub.dev/packages/flutter_appauth) package to sign a user into your Supabase project:
````dart
import 'package:crypto/crypto.dart';
import 'package:flutter_appauth/flutter_appauth.dart';
// Generate a random string
final rawNonce = generateRandomString();
final hashedNonce = sha256.convert(utf8.encode(rawNonce)).toString();
// Your registered Google client ID here.
// This will be different for iOS and Android
const clientId = 'YOUR_GOODLE_CLIENT_ID';
// bundle ID for iOS, package name for Android here
final packageName = 'io.supabase.example';
/// fixed for google login
final redirectUrl = '$packageName:/google_auth';
/// fixed for google login
const discoveryUrl =
'https://accounts.google.com/.well-known/openid-configuration';
final appAuth = FlutterAppAuth();
// authorize the user by opening the concent page
final result = await appAuth.authorize(
AuthorizationRequest(
clientId,
redirectUrl,
discoveryUrl: discoveryUrl,
nonce: hashedNonce,
scopes: [
'openid',
'email',
],
),
);
if (result == null) {
throw AuthException(
'Could not find AuthorizationResponse after authorizing');
}
// Request the access and id token to google
final tokenResponse = await appAuth.token(
TokenRequest(
clientId,
redirectUrl,
authorizationCode: result.authorizationCode,
discoveryUrl: discoveryUrl,
codeVerifier: result.codeVerifier,
nonce: result.nonce,
scopes: [
'openid',
'email',
],
),
);
final idToken = tokenResponse?.idToken;
if (idToken == null) {
throw AuthException('Could not find idToken from the token response');
}
await signInWithIdToken(
provider: Provider.google,
idToken: idToken,
accessToken: tokenResponse?.accessToken,
nonce: rawNonce,
);```
In the Supabase JavaScript library, which you can use with web-based native frameworks like React Native or Expo, you can invoke this functionality like so:
```ts
await supabase.auth.signInWithIdToken({
provider: 'google',
token: '<identity token received from the OS>',
access_token: '<access token received from the OS>'
})
````
Please take a look at these open-source projects which may help you obtain an ID token directly from the OS:
- [react-native-google-signin/google-signin](https://github.com/react-native-google-signin/google-signin).
For apps written in Kotlin, please consult the [community maintained library](/docs/reference/kotlin/introduction).
### Configuration
1. Configure OAuth credentials for your Google Cloud project in the [Credentials](https://console.cloud.google.com/apis/credentials) page of the console. When creating a new OAuth client ID, choose _Android_ or _iOS_ depending on the mobile operating system your app is built for.
- For Android, use the instructions on screen to provide the SHA-1 certificate fingerprint used to sign your Android app.
- For iOS, use the instructions on screen to provide the app Bundle ID, and App Store ID and Team ID if the app is already published on the Apple AppStore.
2. Configure the [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent). This information is shown to the user when giving consent to your app. In particular, make sure you have set up links to your app's privacy policy and terms of service.
3. Finally, add the client ID from step 1 in the [Google provider on the Supabase Dashboard](https://supabase.com/dashboard/project/_/auth/providers), under _Authorized Client IDs_.
Note that you do not have to configure the OAuth flow in the Supabase Dashboard in order to use native sign in.
## Using native sign in for Chrome extensions
Similar to the native sign in for Android, you can use the Chrome browser's [identity APIs](https://developer.chrome.com/docs/extensions/reference/identity/) to launch an authentication flow.
First, you need to configure your `manifest.json` file like so:
```json
{
"permissions": ["identity"],
"oauth2": {
"client_id": "<client ID>",
"scopes": ["openid", "email", "profile"]
}
}
```
Then you should call the [`chrome.identity.launchWebAuthFlow()`](https://developer.chrome.com/docs/extensions/reference/identity/#method-launchWebAuthFlow) function to trigger the sign in flow. On success, call the `supabase.auth.signInWithIdToken()` function to complete sign in with your Supabase project.
```ts
const manifest = chrome.runtime.getManifest()
const url = new URL('https://accounts.google.com/o/oauth2/auth')
url.searchParams.set('client_id', manifest.oauth2.client_id)
url.searchParams.set('response_type', 'id_token')
url.searchParams.set('access_type', 'offline')
url.searchParams.set('redirect_uri', `https://${chrome.runtime.id}.chromiumapp.org`)
url.searchParams.set('scope', manifest.oauth2.scopes.join(' '))
chrome.identity.launchWebAuthFlow(
{
url: url.href,
interactive: true,
},
async (redirectedTo) => {
if (chrome.runtime.lastError) {
// auth was not successful
} else {
// auth was successful, extract the ID token from the redirectedTo URL
const url = new URL(redirectedTo)
const params = new URLSearchParams(url.hash)
const { data, error } = await supabase.auth.signInWithIdToken({
provider: 'google',
token: params.get('id_token'),
})
}
}
)
```
### Configuration
You will need to configure a client ID for your Chrome extension:
1. Configure OAuth credentials for your Google Cloud project in the [Credentials](https://console.cloud.google.com/apis/credentials) page of the console. When creating a new OAuth client ID, choose _Chrome extension_ for the application type. For _Item ID_ provide the unique ID of your Chrome extension. You can get this by calling `chrome.runtime.id` within the extension, or from the Web Store URL of the extension. For example, the [Google Translate extension](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb) has the Web Store URL `https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb` and the last part `aapbdbdomjkkjkaonfhkkikfgjllcleb` is its unique ID.
2. Configure the [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent). This information is shown to the user when giving consent to your app.
3. Finally, add the client ID from step 1 in the [Google provider on the Supabase Dashboard](https://supabase.com/dashboard/project/_/auth/providers), under _Authorized Client IDs_.
Note that you do not have to configure the OAuth flow in the Supabase Dashboard to sign in with Google inside Chrome extensions.
## Using personalized sign-in buttons, One Tap or automatic sign-in
Most web apps and websites can utilize Google's [personalized sign-in buttons](https://developers.google.com/identity/gsi/web/guides/personalized-button), [One Tap](https://developers.google.com/identity/gsi/web/guides/features) or [automatic sign-in](https://developers.google.com/identity/gsi/web/guides/automatic-sign-in-sign-out) for the best user experience.
Under the hood, these sign in methods end with an identity token being issued by [Sign in with Google for Web](https://developers.google.com/identity/gsi/web/guides/overview). You can then use the `supabase.auth.signInWithIdToken()` method to immediately issue an access and refresh tokens for the user, without needing to build any additional UIs or flows.
To get started, you can use the [HTML Code Generator](https://developers.google.com/identity/gsi/web/tools/configurator) to customize the look, feel, features and behavior of the Sign in with Google button. Make sure you pick the _Swap to JavaScript callback_ option and name the function that will receive a [`CredentialResponse`](https://developers.google.com/identity/gsi/web/reference/js-reference#CredentialResponse) when sign in completes.
For example, this HTML code shows a typical Sign in with Google button:
```html
<div
id="g_id_onload"
data-client_id="<client ID>"
data-context="signin"
data-ux_mode="popup"
data-callback="handleSignInWithGoogle"
data-nonce=""
data-auto_select="true"
data-itp_support="true"
></div>
<div
class="g_id_signin"
data-type="standard"
data-shape="pill"
data-theme="outline"
data-text="signin_with"
data-size="large"
data-logo_alignment="left"
></div>
```
When the user signs in, the `handleSignInWithGoogle` function will be called:
```ts
async function handleSignInWithGoogle(response) {
const { data, error } = await supabase.auth.signInWithIdToken({
token: response.credential,
nonce: 'NONCE', // must be the same one as provided in data-nonce (if any)
})
}
```
## Resources
Use of nonce is recommended, though optional. Make sure each nonce is generated randomly and available both in the `data-nonce` attribute as well as in the `handleSignInWithGoogle` callback function; otherwise the ID token will not be accepted.
- [Supabase Account - Free Plan OK](https://supabase.com)
- [Supabase JS Client](https://github.com/supabase/supabase-js)
- [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard)
### Configuration
1. Obtain OAuth credentials for your Google Cloud project in the [Credentials](https://console.developers.google.com/apis/credentials) page of the console. When creating a new credential, choose _Web application_. As you're using the Google sign in button, you should configure the _Authorized JavaScript origins_ and _Authorized redirect URIs_ to the website where the buttons appear. You should not use your Supabase project domain name. For this use case, the client secret provided is not needed and can be ignored.
2. Configure the [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent). This information is shown to the user when giving consent to your app. In particular, make sure you have set up links to your app's privacy policy and terms of service.
3. Finally, add the client ID from step 1 in the [Google provider on the Supabase Dashboard](https://supabase.com/dashboard/project/_/auth/providers) under _Authorized Client IDs_.
Note that you do not have to configure the OAuth flow client ID and secret in the Supabae Dashboard when using this approach!
export const Page = ({ children }) => <Layout meta={meta} children={children} />

View File

@@ -0,0 +1,97 @@
import Layout from '~/layouts/DefaultGuideLayout'
export const meta = {
id: 'auth-kakao',
title: 'Login with Kakao',
description: 'Add Kakao OAuth to your Supabase project',
}
To enable Kakao Auth for your project, you need to set up an Kakao OAuth application and add the application credentials to your Supabase Dashboard.
## Overview
Kakao OAuth consists of six broad steps:
- Create and configure your app in the [Kakao Developer Portal](https://developers.kakao.com).
- Obtaining a `REST API key` - this will serve as the `client_id`.
- Generating the `Client secret code` - this will serve as the `client_secret`.
- Additional configurations on Kakao Developers Portal.
- Add your `client id` and `client secret` keys to your [Supabase Project](https://supabase.com/dashboard).
- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js).
## Access your Kakao Developer account
- Go to [Kakao Developers Portal](https://developers.kakao.com).
- Click on `Login` at the top right to log in.
![Kakao Developers Portal.](/docs/img/guides/auth-kakao/kakao-developers-page.png)
## Create and configure your app
- Go to `My Application`.
- Click on `Add an application` at the top.
- Fill out your app information:
- App icon.
- App name.
- Company name.
- Click `Save` at the bottom right.
## Obtain a REST API key
This will serve as the `client_id` when you make API calls to authenticate the user.
- Go to `My Application`.
- Click on your app.
- You will be redirected to `Summary` tab of your app.
- In the `App Keys` section you will see `REST API key` -- this ID will become your `client_id` later.
## Find your callback URL
<SocialProviderSetup provider="Kakao" />- To add callback URL on Kakao, go to `Product settings` >
`Kakao Login` > `Redirect URI`.
## Generate and activate a `client_secret`
- Go to `Product settings` > `Kakao Login` > `Security`.
- Click on the `Kakao Login` switch to enable Kakao Login.
- Click on `generate code` at the bottom to generate the `Client secret code` -- this will serve as a `client_secret` for your supabase project.
- Make sure you enabled `Client sercet code` by selecting `enable` from the `Activation state` section.
## Additional configurations on Kakao Developers Portal
- Make sure the Kakao Login is enabled in the `Kakao Login` tab.
- Set following scopes under the "Consent Items": account_email, profile_image, profile_nickname
![Consent items needs to be set.](/docs/img/guides/auth-kakao/kakao-developers-consent-items-set.png)
## Add your OAuth credentials to Supabase
<SocialProviderSettingsSupabase provider="Kakao" />
## Add login code to your client app
When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `kakao` as the `provider`:
```js
async function signInWithKakao() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'kakao',
})
}
```
When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage:
```js
async function signout() {
const { error } = await supabase.auth.signOut()
}
```
## Resources
- [Kakao Developers Portal](https://developers.kakao.com).
export const Page = ({ children }) => <Layout meta={meta} children={children} />
export default Page

View File

@@ -11,15 +11,15 @@ Supabase provides several options for programmatically connecting to your Postgr
1. Direct connections using Postgres' standard connection system
2. Connection pooling using PgBouncer
3. Programmatic access uing the [Serverless APIs](/docs/guides/api)
3. Programmatic access using the [Serverless APIs](/docs/guides/api)
## Serverless APIs
Supabase provides auto-updating [APIs](/docs/guides/database/api). This is the easiest way to get started if you are managing data (fetching, inserting, updating). We provides several types of API to suit your preferences:
- [REST](/docs/guides/database/api#rest-api): interact with your database through a REST interface.
- [GraphQL](/docs/guides/database/api#graphql-api): interact with your database through a GraphQL interface.
- [Realtime](/docs/guides/database/api#realtime-api): listen to database changes over websockets.
- [REST](/docs/guides/api#rest-api-overview): interact with your database through a REST interface.
- [GraphQL](/docs/guides/api#graphql-api-overview): interact with your database through a GraphQL interface.
- [Realtime](/docs/guides/api#realtime-api-overview): listen to database changes over websockets.
## Direct connections

View File

@@ -244,7 +244,7 @@ create table customers (
);
alter table customers
add constriant check_metadata check (
add constraint check_metadata check (
json_matches_schema(
'{
"type": "object",

View File

@@ -12,6 +12,15 @@ It's common that you will need to use sensitive information or environment-speci
Deno.env.get(MY_SECRET_NAME)
```
### Local Development
When developing functions locally, you be able to load environment variables two ways:
1. Through a default `.env` file placed at `supabase/functions/.env`, which will get loaded on `supabase start`
2. Through the `--env-file` option for `supabase functions serve`, for example: `supabase functions serve --env-file ./path/to/.env-file`
To perform a one-time setup of your local development secrets, use the first option to create the `.env` file that will apply to all functions.
### Default secrets
By default, Edge Functions have access to these secrets:

View File

@@ -84,11 +84,11 @@ Build login and registration pages with custom themes. [Docs](/docs/guides/auth/
### Auto-generated REST API
RESTful APIs are autogenerated from your database, without a single line of code. [Docs](/docs/guides/database/api#rest-api-overview).
RESTful APIs are autogenerated from your database, without a single line of code. [Docs](/docs/guides/api#rest-api-overview).
### Auto-generated GraphQL API
Fast GraphQL APIs using our custom Postgres GraphQL extension. [Docs](/docs/guides/database/api#graphql-api-overview).
Fast GraphQL APIs using our custom Postgres GraphQL extension. [Docs](/docs/guides/api#graphql-api-overview).
### Realtime Database changes

View File

@@ -88,6 +88,7 @@ export const meta = {
```vue src/App.vue
<script setup>
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')
const countries = ref([])

View File

@@ -74,7 +74,7 @@ It can be challenging to authenticate your users in all these different environm
Install the auth helpers for Next.js
```bash
npm install @supabase/auth-helpers-nextjs
npm install @supabase/auth-helpers-nextjs @supabase/supabase-js
```
### NextJS Middleware
@@ -241,7 +241,7 @@ export default function AuthForm() {
</TabPanel>
</Tabs>
<Admonition type="note">
If you are using TypeScript for this project, see [generating types](/docs/guides/api/rest/generating-types) to automatically generate types from your database tables.

View File

@@ -55,7 +55,7 @@ It can be challenging to authenticate your users in all these different environm
Install the auth helpers for SvelteKit:
```bash
npm install @supabase/auth-helpers-sveltekit
npm install @supabase/auth-helpers-sveltekit @supabase/supabase-js
```
Add the code below to your `src/hooks.server.ts` to initialize the client on the server:

View File

@@ -16,8 +16,8 @@ The Supabase Marketplace brings together all the tools you need to extend your S
Supabase provides several integration points:
- The [Postgres connection](/docs/guides/database/connecting-to-postgres). Anything that works with Postgres also works with Supabase projects.
- The [Project REST API](/docs/guides/database/api#rest-api) & client libraries.
- The [Project GraphQL API](/docs/guides/database/api#graphql-api).
- The [Project REST API](/docs/guides/api#rest-api-overview) & client libraries.
- The [Project GraphQL API](/docs/guides/api#graphql-api-overview).
- The [Platform API](/docs/reference/api).
## List your integration

View File

@@ -331,34 +331,37 @@ const channel = supabase
## Custom Tokens
You may choose to sign your own tokens to customize claims that can be checked in your RLS policies.
In order for this to work you must pass `apikey` in both Realtime's `headers` and `params` when creating the client.
The `apikey` in `params` must be either the `anon` or `service_role` token that Supabase provides for every project.
You can find these tokens under [Project API keys](https://supabase.com/dashboard/project/_/settings/api) in your project's dashboard.
This will authenticate your request in the API gateway.
Your project JWT secret is found with your [Project API keys](https://supabase.com/dashboard/project/_/settings/api) in your dashboard.
<Admonition type="caution">
Do not expose the `service_role` token on the client because the role is authorized to bypass
row-level security.
</Admonition>
The `apikey` in `headers` can be your custom token signed with the JWT secret of your Supabase project.
This is forwarded to the Realtime server and it will verify your custom token and use its claims to authorize database changes
when RLS is enabled.
To use your own JWT with Realtime make sure to set the token after instantiating the Supabase client and before connecting to a Channel.
```js
const { createClient } = require('@supabase/supabase-js')
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY, {
realtime: {
headers: {
apikey: `Bearer ${your_custom_token}`,
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY, {})
// Set your custom JWT here
supabase.realtime.setAuth('your-custom-jwt')
const channel = supabase
.channel('db-changes')
.on(
'postgres_changes',
{
event: '*',
schema: 'public',
table: 'messages',
filter: 'body=eq.bye',
},
params: {
apikey: process.env.SUPABASE_KEY,
},
},
})
(payload) => console.log(payload)
)
.subscribe()
```
### Refreshed Tokens

View File

@@ -88,7 +88,7 @@ export const meta = {
<TextLink
label="Explore more resources"
url="/docs/guides/resources"
url="/guides/resources"
className="no-underline text-brand-900 text-sm"
/>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2500" height="2500" viewBox="0 0 256 256"><path fill="#FFE812" d="M256 236c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20V20C0 8.954 8.954 0 20 0h216c11.046 0 20 8.954 20 20v216z"/><path d="M128 36C70.562 36 24 72.713 24 118c0 29.279 19.466 54.97 48.748 69.477-1.593 5.494-10.237 35.344-10.581 37.689 0 0-.207 1.762.934 2.434s2.483.15 2.483.15c3.272-.457 37.943-24.811 43.944-29.04 5.995.849 12.168 1.29 18.472 1.29 57.438 0 104-36.712 104-82 0-45.287-46.562-82-104-82z"/><path fill="#FFE812" d="M70.5 146.625c-3.309 0-6-2.57-6-5.73V105.25h-9.362c-3.247 0-5.888-2.636-5.888-5.875s2.642-5.875 5.888-5.875h30.724c3.247 0 5.888 2.636 5.888 5.875s-2.642 5.875-5.888 5.875H76.5v35.645c0 3.16-2.691 5.73-6 5.73zM123.112 146.547c-2.502 0-4.416-1.016-4.993-2.65l-2.971-7.778-18.296-.001-2.973 7.783c-.575 1.631-2.488 2.646-4.99 2.646a9.155 9.155 0 0 1-3.814-.828c-1.654-.763-3.244-2.861-1.422-8.52l14.352-37.776c1.011-2.873 4.082-5.833 7.99-5.922 3.919.088 6.99 3.049 8.003 5.928l14.346 37.759c1.826 5.672.236 7.771-1.418 8.532a9.176 9.176 0 0 1-3.814.827c-.001 0 0 0 0 0zm-11.119-21.056L106 108.466l-5.993 17.025h11.986zM138 145.75c-3.171 0-5.75-2.468-5.75-5.5V99.5c0-3.309 2.748-6 6.125-6s6.125 2.691 6.125 6v35.25h12.75c3.171 0 5.75 2.468 5.75 5.5s-2.579 5.5-5.75 5.5H138zM171.334 146.547c-3.309 0-6-2.691-6-6V99.5c0-3.309 2.691-6 6-6s6 2.691 6 6v12.896l16.74-16.74c.861-.861 2.044-1.335 3.328-1.335 1.498 0 3.002.646 4.129 1.772 1.051 1.05 1.678 2.401 1.764 3.804.087 1.415-.384 2.712-1.324 3.653l-13.673 13.671 14.769 19.566a5.951 5.951 0 0 1 1.152 4.445 5.956 5.956 0 0 1-2.328 3.957 5.94 5.94 0 0 1-3.609 1.211 5.953 5.953 0 0 1-4.793-2.385l-14.071-18.644-2.082 2.082v13.091a6.01 6.01 0 0 1-6.002 6.003z"/></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -28,7 +28,7 @@ Supabase is an open source firebase alternative, but instead of being built arou
At Supabase weve always been huge fans of Firebase - so we started adding a few things on top of PostgreSQL in an attempt to reach feature parity, including:
- Auto-generated API - [query your data straight from the client](https://supabase.com/docs/guides/database/api#rest-api-2).
- Auto-generated API - [query your data straight from the client](https://supabase.com/docs/guides/api#rest-api-overview).
- Realtime - [changes in your data will be streamed directly to your application](https://supabase.com/docs/reference/dart/subscribe).
- Auth - [a simple to integrate auth system and SQL based rules engine](https://supabase.com/auth).
- Functions - [javascript and typescript functions that deploy out globally](https://supabase.com/edge-functions).

View File

@@ -16,7 +16,7 @@ Heroku is a cloud application platform that offers managed PostgreSQL as a servi
Supabase also offers managed Postgres, the main difference is that with each deployment you also get:
- Auto-generated API - [never write an API again](https://supabase.com/docs/guides/database/api#rest-api-2)
- Auto-generated API - [never write an API again](https://supabase.com/docs/guides/api#rest-api-overview)
- Realtime - [subscribe to data changes via websockets](https://supabase.com/docs/reference/dart/subscribe)
- Auth - [users can log in and out of your application](https://supabase.com/auth)
- Functions - [deploy custom logic to the edge](https://supabase.com/edge-functions)
@@ -43,7 +43,7 @@ These are some of the key differences between Heroku Postgres and Supabase in te
- Supabase is more than just the raw database, it also comes with:
- [Connection pooling](https://supabase.com/docs/guides/database/connecting-to-postgres#connection-pool) so that you wont run out of connections in a serverless environment.
- [Auto-generated APIs](https://supabase.com/docs/guides/database/api#rest-api-2) based on your schema, so you can communicate with your database directly from the client.
- [Auto-generated APIs](https://supabase.com/docs/guides/api#rest-api-overview) based on your schema, so you can communicate with your database directly from the client.
- [Realtime API](https://supabase.com/docs/reference/dart/subscribe) is useful for when you want to subscribe to changes to your database over websockets.
- [Auth API](https://supabase.com/auth) can be used to leverage Postgress Row Level Security model, and control access to sensitive data on a per user, or per group level.
- [Functions](https://supabase.com/edge-functions) can be deployed out to the edge directly from the Supabase CLI, which means you can run sensitive business logic or transformations in a serverless fashion.

View File

@@ -8,7 +8,6 @@ author_image_url: https://github.com/roryw10.png
authorURL: https://github.com/roryw10
image: /images/blog/supabase-monitoro.png
tags:
- case-study
- no-code
date: '12-02-2020'
video: https://www.youtube.com/v/8A6_pg41M2s

View File

@@ -8,7 +8,6 @@ author_image_url: https://github.com/roryw10.png
authorURL: https://github.com/roryw10
image: /images/blog/supabase-tayfa.png
tags:
- case-study
- no-code
date: '12-02-2020'
---

View File

@@ -9,7 +9,6 @@ authorURL: https://github.com/roryw10
image: supabase-xendit.png
thumb: supabase-xendit-thumb.jpg
tags:
- case-study
- fintech
date: '12-02-2020'
---

View File

@@ -9,7 +9,6 @@ authorURL: https://github.com/roryw10
image: roboflow-og.png
thumb: roboflow-website.png
tags:
- case-study
- AI
date: '02-09-2021'
---

View File

@@ -10,7 +10,6 @@ image: toadli-og.jpg
thumb: toadli-website.jpg
tags:
- supabase
- case-study
date: '03-08-2021'
---

View File

@@ -8,7 +8,7 @@ authorURL: https://github.com/roryw10
image: epsilon3/og-epsilon3.jpg
thumb: epsilon3/cover-epsilon3.jpg
tags:
- case-study
- supabase
date: '2021-07-26'
toc_depth: 2
---

View File

@@ -8,7 +8,7 @@ authorURL: https://github.com/roryw10
image: spot/og-spot-flutter-supabase.jpg
thumb: spot/cover-spot-flutter-supabase.jpg
tags:
- case-study
- flutter
date: '2021-07-27'
toc_depth: 2
---

View File

@@ -8,7 +8,6 @@ authorURL: https://github.com/roryw10
image: mobbin/og-mobbin-supabase.jpg
thumb: mobbin/cover-mobbin-supabase.jpg
tags:
- case-study
- auth
date: '2021-07-28'
toc_depth: 2

View File

@@ -8,7 +8,6 @@ authorURL: https://github.com/roryw10
image: replenysh/og-replenysh.png
thumb: replenysh/thumb-replenysh.png
tags:
- case-study
- auth
date: '2021-10-19'
toc_depth: 2

View File

@@ -6,7 +6,6 @@ image: all-pull-together/all-pull-together-thumb.png
thumb: all-pull-together/all-pull-together-thumb.png
tags:
- community
- case-study
- q-and-a
date: '2022-05-26'
toc_depth: 3

View File

@@ -86,7 +86,7 @@ Today released pg_graphql 1.0 release and its general availability on our platfo
- Read the [announcement](/blog/pg-graphql-v1)
- Browse the [GitHub repo](https://github.com/supabase/pg_graphql/)
- View the [docs](/docs/guides/database/api#graphql-api)
- View the [docs](/docs/guides/api#graphql-api-overview)
## Postgres Point-in-Time Recovery

View File

@@ -5,7 +5,6 @@ author: rory_wilding
image: 2023-02-16-case-study-happyteams/case-study-happyteams.png
thumb: 2023-02-16-case-study-happyteams/case-study-happyteams.png
tags:
- case-study
date: '2023-02-16'
toc_depth: 3
---

View File

@@ -2,8 +2,8 @@
title: 'Supabase Vecs: a vector client for Postgres'
description: Introducing Supabase Vecs, a PostgreSQL vector client
author: oli_rice
image: 2023-06-01-vecs/og-image.jpg
thumb: 2023-06-01-vecs/og-image.jpg
image: 2023-06-01-vecs/og-image-v2.jpg
thumb: 2023-06-01-vecs/og-image-v2.jpg
tags:
- postgres
- AI

View File

@@ -0,0 +1,133 @@
---
title: Native Mobile Auth Support for Google and Apple Sign in
description: Supabase auth adds full support for native mobile sign in with Apple and Google.
author: stojan,tyler_shukert
image: native-mobile-auth/native-mobile-auth.png
thumb: native-mobile-auth/native-mobile-auth.png
tags:
- auth
date: '2023-06-27'
toc_depth: 3
---
Supabase supports OAuth logins with 17 providers including Apple, Google, Microsoft, GitHub, … But for native mobile apps, this meant that developers had to use a web browser to sign in. Its not an ideal flow for users, who are already used to signing in with the operating systems native dialogs when possible. Today, we are excited to announce full native support for Sign in with Apple and Google on iOS and Android. But this is not all! Supabase Auth now can now be used with one-tap sign in methods like: Sign in with Apple JS, Sign in with Google for Web or even in Chrome extensions.
## Native Sign in with Apple and Google
Developers of native iOS and Android apps (using Flutter or React Native) can now take advantage of OS-provided authentication dialogs for Apple and Google. This is available on iOS, macOS, tvOS and watchOS apps in the Apple ecosystem, and all Android variants in the Google ecosystem.
In full transparency, this was always sort-of possible but there were some edge cases that were not covered well with Supabase Auth. Weve since ironed out the developer experience and made this into a fully supported feature.
Behind the scenes, these native sign in methods use ID tokens. Theyre a formalized version of a JWT that is issued by Apple or Google and contain profile information. Supabase Auth now can properly validate the ID tokens and create new or link to existing user accounts based on email similarity.
### Using Sign in with Google in a Flutter App
To setup Sign in with Google in your Flutter native app, you need to set up your Google Cloud project for each platform:
- For iOS apps: [Get started with Google Sign In for iOS and macOS](https://developers.google.com/identity/sign-in/ios/start-integrating#get_an_oauth_client_id)
- For Android apps: [Get started with One Tap sign-in and sign-up for Android](https://developers.google.com/identity/one-tap/android/get-started)
Weve revamped the Google provider [configuration screen in the Supabase Dashboard](https://supabase.com/dashboard/project/_/auth/providers). Besides the existing OAuth flow, you can now add additional _Authorized Client IDs_ meant for native sign in.
The client ID you obtained from the setup instructions above should be added to _Authorized Client IDs._
![Supabase dashboard Google provider](/images/blog/native-mobile-auth/google-setting.png)
It really is as simple as that.
### Using Sign in with Apple in a Flutter App
We introduced support for native Sign in with Apple in our [previous launch week](https://supabase.com/blog/supabase-auth-sso-pkce#native-apple-login-on-ios#native-apple-login-on-ios), but today we are adding support for multiple apps on a single Supabase project.
All you need to do is to register all of the bundle IDs of your apps in the [Supabase Dashboard](https://supabase.com/dashboard/project/_/auth/providers) under _Authorized Client IDs_ as a comma separated string.
![Supabase dashboard Apple provider](/images/blog/native-mobile-auth/apple-setting.png)
## Using Sign in with Apple and Google in React Native Apps
If you use React Native to build your native apps, you can still benefit. Please check out these resources to see how you can show the native authentication dialog and obtain an ID token from the operating system:
- https://github.com/invertase/react-native-apple-authentication
- [Expo AppleAuthentication](https://docs.expo.dev/versions/latest/sdk/apple-authentication/)
- https://github.com/react-native-google-signin/google-signin
You would still need to configure the _Authorized Client IDs_ as shown in the Flutter examples above.
Finally, once youve received a valid ID token from the operating system you can call `supabase.auth.signInWithIdToken()` to complete the sign in with your Supabase project.
For Sign in with Apple:
```tsx
await supabase.auth.signInWithIdToken({
provider: 'apple',
token: '<id token>',
})
```
For Sign in with Google:
```tsx
await supabase.auth.signInWithIdToken({
provider: 'google',
token: '<id token>',
})
```
We also have some sample implementation for Expo apps in our [create-t3-turbo example](https://github.com/supabase-community/create-t3-turbo/blob/main/apps/expo/src/app/profile.tsx#L47).
## Using Sign in with Apple and Google in Flutter Apps
Once you have configured your Supabase instance, you can utilize third party libraries like **[sign_in_with_apple](https://pub.dev/packages/sign_in_with_apple) or [google_one_tap_sign_in](https://pub.dev/packages/google_one_tap_sign_in) to perform naive sign in, and pass the ID token to Supabase to complete the sign in.**
For Sign in with Apple:
```dart
final credential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
);
await supabase.auth.signInWithIdToken(
provider: Provider.apple,
idToken: credential.identityToken!,
);
```
And for Google:
```dart
var result = await GoogleOneTapSignIn.handleSignIn(webClientId: '<client ID>');
supabase.auth.signInWithIdToken(
provider: Provider.google,
idToken: result.data!.idToken!,
);
```
You can find more detailed instructions on the [here](https://github.com/supabase/supabase-flutter#authentication).
## Sign in with Apple JS, Google One Tap and Chrome Extensions
Although sign in on native platforms was the focus of the team when working on this feature, incidentally weve added proper support for Sign in with Apple JS, Googles One Tap and support for authenticating within Google Chrome extensions.
You can now take advantage of these web frameworks, most notably Googles One Tap and Automatic Sign-in support for a frictionless onboarding experience for your users.
All you need to do is configure the web frameworks and use the `signInWithIdToken()` method to pass the ID token provided by the Google and Apple libraries.
For example, to use Google One tap you should first [generate an embed code for the Google Sign in Button](https://developers.google.com/identity/gsi/web/tools/configurator). Register this method as the callback that will receive the authentication response from the button:
```tsx
async function handleSignInWithGoogle(response) {
const { data, error } = await supabase.auth.signInWithIdToken({
token: response.credential,
nonce: 'NONCE', // must be the same one as provided in data-nonce (if any)
})
}
```
## Resources
- [Login with Apple Guide](https://supabase.com/docs/guides/auth/social-login/auth-apple)
- [Login with Google Guide](https://supabase.com/docs/guides/auth/social-login/auth-google)

View File

@@ -34,8 +34,9 @@ about: Mendable is Chat Powered Search for Documentation.
Mendable was experiencing tremendous success, growing Weekly Active Users nearly 300% since March. They needed a tool to store and search through large amounts of vector data to improve the efficiency and accuracy of their similarity search operations. They tried Faiss, Weaviate, and Pinecone, but found them to be expensive and not very intuitive, especially when it came to storing metadata along with the vectors.
Why they chose Supabase:
Mendable discovered that Supabase supports pgvector and found it to be a simple and cost-effective solution. They were impressed with the open source nature of Supabase, as well as its ability to store metadata alongside the vectors. They also appreciated the intuitive interface and ease of use.
## Why they chose Supabase
Mendable discovered that Supabase supports [pgvector](https://supabase.com/docs/guides/database/extensions/pgvector) and found it to be a simple and cost-effective solution. They were impressed with the open source nature of Supabase, as well as its ability to store metadata alongside the vectors. They also appreciated the intuitive interface and ease of use.
<Quote img="caleb-peffer.jpg" caption="Caleb Peffer - CEO, Mendable">
We tried other vector databases - we tried Faiss, we tried Weaviate, we tried Pinecone. We found
@@ -45,18 +46,18 @@ Mendable discovered that Supabase supports pgvector and found it to be a simple
## What They Built
Using Supabase and pgvector, Mendable was able to build a more efficient and accurate search function for their AI chatbot. By storing vector data alongside metadata in Supabase, Mendable was able to quickly and easily search through their customers documentation to find the most relevant responses to queries. They found that Supabase's solution was just as performant as dedicated vector databases, but without the high cost.
Using [Supabase Vector](https://supabase.com/vector), Mendable was able to build a more efficient and accurate search function for their AI chatbot. By storing vector data alongside metadata in Supabase, Mendable was able to quickly and easily search through their customers documentation to find the most relevant responses to queries. They found that Supabase's solution was just as performant as dedicated vector databases, but without the high cost.
## The Results
Thanks to Supabase and pgvector, Mendable was able to significantly improve the efficiency and accuracy of their Chat Powered Search for Documentation. They were able to build faster and more cost-effectively using Supabases open source stack.
## Tech stack
Mendable's tech stack includes React, Next.js, Express, Vercel, and Supabase.
<Quote img="caleb-peffer.jpg" caption="Caleb Peffer - CEO, Mendable">
We looked at the alternatives and chose Supabase because its open source, its simpler, and, for
all the ways we need use it, Supabase has been just as performant - if not more performant - than
the other vector databases.
</Quote>
## Tech stack
Mendable's tech stack includes React, Next.js, Express, Vercel, and Supabase.

View File

@@ -72,7 +72,7 @@ const LayoutComparison = ({ components, props }: Props) => {
// to do: author urls should be internal in future
// currently we have external links to github profiles
authors: [props.blog.author_url],
tags: props.blog.tags.map((cat: string) => {
tags: props.blog.tags?.map((cat: string) => {
return cat
}),
},

View File

@@ -78,7 +78,7 @@ export const getSortedPosts = (
if (tags) {
sortedPosts = sortedPosts.filter((post: any) => {
const found = tags.some((tag: any) => post.tags.includes(tag))
const found = tags.some((tag: any) => post.tags?.includes(tag))
return found
})
}
@@ -151,7 +151,7 @@ export const getAllCategories = (directory: Directories) => {
posts.map((post: any) => {
// add tags into categories array
post.tags.map((tag: string) => {
post.tags?.map((tag: string) => {
if (!categories.includes(tag)) return categories.push(tag)
})
})

View File

@@ -708,17 +708,17 @@ module.exports = [
{
permanent: true,
source: '/blog/2020/12/02/case-study-monitoro',
destination: '/blog/case-study-monitoro',
destination: '/customers',
},
{
permanent: true,
source: '/blog/2020/12/02/case-study-tayfa',
destination: '/blog/case-study-tayfa',
destination: '/customers',
},
{
permanent: true,
source: '/blog/2020/12/02/case-study-xendit',
destination: '/blog/case-study-xendit',
destination: '/customers/xendit',
},
{
permanent: true,
@@ -743,7 +743,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2021/02/09/case-study-roboflow',
destination: '/blog/case-study-roboflow',
destination: '/customers/roboflow',
},
{
permanent: true,
@@ -763,7 +763,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2021/03/08/toad-a-link-shortener-with-simple-apis-for-low-coders',
destination: '/blog/toad-a-link-shortener-with-simple-apis-for-low-coders',
destination: '/customers',
},
{
permanent: true,
@@ -853,7 +853,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2021/07/26/epsilon3-self-hosting',
destination: '/blog/epsilon3-self-hosting',
destination: '/customers/epsilon3',
},
{
permanent: true,
@@ -868,7 +868,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2021/07/27/spot-flutter-with-postgres',
destination: '/blog/spot-flutter-with-postgres',
destination: '/customers',
},
{
permanent: true,
@@ -878,7 +878,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2021/07/28/mobbin-supabase-200000-users',
destination: '/blog/mobbin-supabase-200000-users',
destination: '/customers/mobbin',
},
{
permanent: true,
@@ -938,7 +938,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2021/10/19/replenysh-time-to-value-in-less-than-24-hours',
destination: '/blog/replenysh-time-to-value-in-less-than-24-hours',
destination: '/customers/replenysh',
},
{
permanent: true,
@@ -1103,7 +1103,7 @@ module.exports = [
{
permanent: true,
source: '/blog/2022/05/26/how-supabase-accelerates-development-of-all-pull-together',
destination: '/blog/how-supabase-accelerates-development-of-all-pull-together',
destination: '/customers',
},
{
permanent: true,
@@ -1931,6 +1931,11 @@ module.exports = [
// old case studies moved to /customers
{
permanent: true,
source: '/blog/tags/case-study',
destination: '/customers',
},
{
permanent: true,
source: '/blog/case-study-monitoro',
@@ -1983,8 +1988,8 @@ module.exports = [
},
{
permanent: true,
source: '/blog/how-supabase-accelerates-development-of-all-pull-together',
destination: '/customers',
source: '/blog/case-study-happyteams',
destination: '/customers/happyteams',
},
{
permanent: true,

View File

@@ -70,7 +70,7 @@ export default function MyApp({ Component, pageProps }: AppProps) {
site_name: 'Supabase',
images: [
{
url: `https://supabase.com${basePath}/images/og/og-image.jpg`,
url: `https://supabase.com${basePath}/images/og/og-image-v2.jpg`,
width: 800,
height: 600,
alt: 'Supabase Og Image',

View File

@@ -991,7 +991,7 @@ const Beta = (props: Props) => {
},
images: [
{
url: 'https://supabase.com/og/og-image.jpg',
url: 'https://supabase.com/og/og-image-v2.jpg',
},
],
}}

View File

@@ -26,7 +26,7 @@ export async function getStaticProps() {
fs.writeFileSync('./public/rss.xml', rss)
// generate a series of rss feeds for each author (for PlanetPG)
const planetPgPosts = allPostsData.filter((post: any) => post.tags.includes('planetpg'))
const planetPgPosts = allPostsData.filter((post: any) => post.tags?.includes('planetpg'))
const planetPgAuthors = planetPgPosts.map((post: any) => post.author.split(','))
const uniquePlanetPgAuthors = new Set([].concat(...planetPgAuthors))
@@ -73,7 +73,7 @@ function Blog(props: any) {
category === 'all'
? shiftedBlogs
: props.blogs.filter((post: any) => {
const found = post.tags.includes(category)
const found = post.tags?.includes(category)
return found
})
)
@@ -99,7 +99,7 @@ function Blog(props: any) {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}

View File

@@ -110,7 +110,7 @@ function BlogPostPage(props: any) {
<div className="space-y-8 py-8 lg:py-0">
<div>
<div className="flex flex-wrap gap-2">
{props.blog.tags.map((tag: string) => {
{props.blog.tags?.map((tag: string) => {
return (
<a href={`/blog/tags/${tag}`} key={`category-badge-${tag}`}>
<Badge>{tag}</Badge>
@@ -164,7 +164,7 @@ function BlogPostPage(props: any) {
// to do: author urls should be internal in future
// currently we have external links to github profiles
authors: [props.blog.author_url],
tags: props.blog.tags.map((cat: string) => {
tags: props.blog.tags?.map((cat: string) => {
return cat
}),
},

View File

@@ -29,7 +29,7 @@ const Index = () => {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}

View File

@@ -38,7 +38,7 @@ const Index = ({}: Props) => {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}

View File

@@ -20,7 +20,7 @@ const EnterpriseContactPage = () => {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}

View File

@@ -50,7 +50,7 @@ function CustomerStoriesPage(props: any) {
category === 'all'
? props.blogs
: props.blogs.filter((post: any) => {
const found = post.tags.includes(category)
const found = post.tags?.includes(category)
return found
})
)

View File

@@ -50,7 +50,7 @@ const OpenSource = () => {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}
@@ -94,7 +94,7 @@ const OpenSource = () => {
</div>
<div className="grid lg:grid-cols-2 gap-4">
{maintainers
.filter((x) => activePill == 'All' || x.tags.includes(activePill))
.filter((x) => activePill == 'All' || x.tags?.includes(activePill))
.sort((a, b) => a.handle.localeCompare(b.handle))
.map((x, idx) => (
<div className="" key={idx}>

View File

@@ -140,7 +140,7 @@ export default function IndexPage() {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}

View File

@@ -37,7 +37,7 @@ Spread the word on social channels and help to answer Supabase-related questions
### Builder
Build Supabase examples, blog about them, and add them to the [SupaSquad GitHub Org](https://github.com/supasquad).
Build Supabase examples, blog about them, and add them to the [Supabase repo](https://github.com/supabase/supabase/tree/master/examples).
### Author
@@ -59,7 +59,6 @@ Help us maintain the community guidelines in our GitHub and Community-led commun
- Free credits that you can use for Squad efforts.
- Direct access to members of the Supabase team for questions, suggestions, etc.
- Help shape the future of the program.
- Invited to the [SupaSquad GitHub Org](https://github.com/supasquad) to collaborate with the other squad members.
- Exclusive Supabase Team swag drops are usually exclusively reserved for the Supabase core team.
## How to join

View File

@@ -29,7 +29,7 @@ const Index = ({}: Props) => {
url: `https://supabase.com/${router.pathname}`,
images: [
{
url: `https://supabase.com/images/og/og-image.jpg`,
url: `https://supabase.com/images/og/og-image-v2.jpg`,
},
],
}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

View File

@@ -9,7 +9,7 @@ version: "3.8"
services:
studio:
container_name: supabase-studio
image: supabase/studio:20230330-99fed3d
image: supabase/studio:20230622-d8395eb
restart: unless-stopped
healthcheck:
test:
@@ -57,7 +57,7 @@ services:
auth:
container_name: supabase-auth
image: supabase/gotrue:v2.60.7
image: supabase/gotrue:v2.62.1
depends_on:
db:
# Disable this if you are using an external Postgres database
@@ -130,7 +130,7 @@ services:
realtime:
container_name: realtime-dev.supabase-realtime
image: supabase/realtime:v2.5.1
image: supabase/realtime:v2.10.1
depends_on:
db:
# Disable this if you are using an external Postgres database
@@ -168,7 +168,7 @@ services:
storage:
container_name: supabase-storage
image: supabase/storage-api:v0.28.2
image: supabase/storage-api:v0.40.4
depends_on:
db:
# Disable this if you are using an external Postgres database
@@ -211,7 +211,7 @@ services:
imgproxy:
container_name: supabase-imgproxy
image: darthsim/imgproxy:v3.13
image: darthsim/imgproxy:v3.8.0
healthcheck:
test: [ "CMD", "imgproxy", "health" ]
timeout: 5s
@@ -227,7 +227,7 @@ services:
meta:
container_name: supabase-meta
image: supabase/postgres-meta:v0.60.7
image: supabase/postgres-meta:v0.66.3
depends_on:
db:
# Disable this if you are using an external Postgres database
@@ -243,7 +243,7 @@ services:
functions:
container_name: supabase-edge-functions
image: supabase/edge-runtime:v1.2.12
image: supabase/edge-runtime:v1.5.2
restart: unless-stopped
environment:
JWT_SECRET: ${JWT_SECRET}
@@ -263,7 +263,7 @@ services:
# Comment out everything below this point if you are using an external Postgres database
db:
container_name: supabase-db
image: supabase/postgres:15.1.0.54-rc0
image: supabase/postgres:15.1.0.90
healthcheck:
test: pg_isready -U postgres -h localhost
interval: 5s

View File

@@ -8,7 +8,8 @@
"name": "full-nextjs-auth-helpers",
"version": "0.1.0",
"dependencies": {
"@supabase/auth-helpers-nextjs": "^0.7.0-next.8",
"@supabase/auth-helpers-nextjs": "^0.7.1",
"@supabase/supabase-js": "^2.26.0",
"@types/node": "^20.2.3",
"@types/react": "^18.2.6",
"@types/react-dom": "^18.2.4",
@@ -324,11 +325,11 @@
"dev": true
},
"node_modules/@supabase/auth-helpers-nextjs": {
"version": "0.7.0-next.8",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.7.0-next.8.tgz",
"integrity": "sha512-7pCbdnyAQo+D4qYQCvfg4B3OHIPtrILy/4LNwmF+1uheDeK7B6pxfN2SVeOR2TU3lolxMwEKUP6Q0h1qiCXbQg==",
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.7.2.tgz",
"integrity": "sha512-n5IyGBYJV/WiR5Rgw4CUaiJYiOv9yW2of4ZP4EyzKt2O6/6rztt7PcGE4AoK2vERw+fb5F2QtJBdt6J5eOYCCw==",
"dependencies": {
"@supabase/auth-helpers-shared": "0.4.0-next.3",
"@supabase/auth-helpers-shared": "0.4.1",
"set-cookie-parser": "^2.6.0"
},
"peerDependencies": {
@@ -336,9 +337,9 @@
}
},
"node_modules/@supabase/auth-helpers-shared": {
"version": "0.4.0-next.3",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.4.0-next.3.tgz",
"integrity": "sha512-ELvEbYPJdTlwvqXsHkRN8ADcRe1IQxHt+UNqxbV2SKIpJCieQ4BMsgUVI/w+e3gMQHRbydk0PaJpOa9aStzMyg==",
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.4.1.tgz",
"integrity": "sha512-IEDX9JzWkIjQiLUaP4Qy5YDiG0jFQatWfS+jw8cCQs6QfbNdEPd2Y3qonwGHnM90CZom9SvjuylBv2pFVAL7Lw==",
"dependencies": {
"jose": "^4.14.3"
},
@@ -347,37 +348,33 @@
}
},
"node_modules/@supabase/functions-js": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.1.tgz",
"integrity": "sha512-bIR1Puae6W+1/MzPfYBWOG/SCWGo4B5CB7c0ZZksvliNEAzhxNBJ0UFKYINcGdGtxG8ZC+1xr3utWpNZNwnoRw==",
"peer": true,
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.2.tgz",
"integrity": "sha512-QCR6pwJs9exCl37bmpMisUd6mf+0SUBJ6mUpiAjEkSJ/+xW8TCuO14bvkWHADd5hElJK9MxNlMQXxSA4DRz9nQ==",
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/gotrue-js": {
"version": "2.27.1",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.27.1.tgz",
"integrity": "sha512-rewbfKTC9DZNnPy4rRpr5ViBXre55wEXPWOueh/ZgwunR1TGmntRcraIM6SDKrP6iRD6ucx325a467uZ5U+KWg==",
"peer": true,
"version": "2.31.0",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.31.0.tgz",
"integrity": "sha512-YcwlbbNfedlue/HVIXtYBb4fuOrs29gNOTl6AmyxPp4zryRxzFvslVN9kmLDBRUAVU9fnPJh2bgOR3chRjJX5w==",
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/postgrest-js": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.6.1.tgz",
"integrity": "sha512-WDBUPOCOwcZonaCwEodwdA8hwWYOiXroDF9vWGxZxKAnuSVE2Ieci/kvhR4EsWvgGST2h90LRowgO+msXe8+fA==",
"peer": true,
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.7.1.tgz",
"integrity": "sha512-xPRYLaZrkLbXNlzmHW6Wtf9hmcBLjjI5xUz2zj8oE2hgXGaYoZBBkpN9bmW9i17Z1f6Ujxa942AqK439XOA36A==",
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/realtime-js": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.2.tgz",
"integrity": "sha512-Fi6xAl5PUkqnjl3wo4rdcQIbMG3+yTRX1aUZe/yfvTG84RMvmCXJ1yN6MmafVLeZpU1xkaz5Vx4L0tnHcLiy6w==",
"peer": true,
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.3.tgz",
"integrity": "sha512-c7TzL81sx2kqyxsxcDduJcHL9KJdCOoKimGP6lQSqiZKX42ATlBZpWbyy9KFGFBjAP4nyopMf5JhPi2ZH9jyNw==",
"dependencies": {
"@types/phoenix": "^1.5.4",
"@types/websocket": "^1.0.3",
@@ -388,21 +385,19 @@
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.1.tgz",
"integrity": "sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==",
"peer": true,
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/supabase-js": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.22.0.tgz",
"integrity": "sha512-omkgSWL1HwnpXZZy+yshFLx/qqxwk9kx9jbRM6IHNEylKrH/sz6JX7rGyIOmN9niDxMRjsCu1nwuBhD6IiF2xg==",
"peer": true,
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.26.0.tgz",
"integrity": "sha512-RXmTPTobaYAwkSobadHZmEVLmzX3SGrtRZIGfLWnLv92VzBRrjuXn0a+bJqKl50GUzsyqPA+j5pod7EwMkcH5A==",
"dependencies": {
"@supabase/functions-js": "^2.1.0",
"@supabase/gotrue-js": "^2.26.0",
"@supabase/postgrest-js": "^1.1.1",
"@supabase/realtime-js": "^2.7.2",
"@supabase/gotrue-js": "^2.31.0",
"@supabase/postgrest-js": "^1.7.0",
"@supabase/realtime-js": "^2.7.3",
"@supabase/storage-js": "^2.5.1",
"cross-fetch": "^3.1.5"
}
@@ -427,10 +422,9 @@
"integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw=="
},
"node_modules/@types/phoenix": {
"version": "1.5.6",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.5.6.tgz",
"integrity": "sha512-e7jZ6I9uyRGsg7MNwQcarmBvRlbGb9DibbocE9crVnxqsy6C23RMxLWbJ2CQ3vgCW7taoL1L+F02EcjA6ld7XA==",
"peer": true
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz",
"integrity": "sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@@ -464,7 +458,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz",
"integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==",
"peer": true,
"dependencies": {
"@types/node": "*"
}
@@ -797,7 +790,6 @@
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
"integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
@@ -897,7 +889,6 @@
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
"integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
"peer": true,
"dependencies": {
"node-fetch": "^2.6.11"
}
@@ -924,7 +915,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"peer": true,
"dependencies": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
@@ -1165,7 +1155,6 @@
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
@@ -1179,7 +1168,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"peer": true,
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
@@ -1190,7 +1178,6 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"peer": true,
"dependencies": {
"d": "^1.0.1",
"ext": "^1.1.2"
@@ -1651,7 +1638,6 @@
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"peer": true,
"dependencies": {
"type": "^2.7.2"
}
@@ -1659,8 +1645,7 @@
"node_modules/ext/node_modules/type": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
"peer": true
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
@@ -2380,8 +2365,7 @@
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"peer": true
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"node_modules/is-weakmap": {
"version": "2.0.1",
@@ -2687,14 +2671,12 @@
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
"peer": true
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node_modules/node-fetch": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
"integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
"peer": true,
"dependencies": {
"whatwg-url": "^5.0.0"
},
@@ -2714,7 +2696,6 @@
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
"integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
"peer": true,
"bin": {
"node-gyp-build": "bin.js",
"node-gyp-build-optional": "optional.js",
@@ -3477,8 +3458,7 @@
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"peer": true
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/tsconfig-paths": {
"version": "3.14.2",
@@ -3521,8 +3501,7 @@
"node_modules/type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
"peer": true
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -3564,7 +3543,6 @@
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"peer": true,
"dependencies": {
"is-typedarray": "^1.0.0"
}
@@ -3609,7 +3587,6 @@
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
"integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
@@ -3620,14 +3597,12 @@
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"peer": true
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"node_modules/websocket": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
"integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
"peer": true,
"dependencies": {
"bufferutil": "^4.0.1",
"debug": "^2.2.0",
@@ -3644,7 +3619,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -3652,14 +3626,12 @@
"node_modules/websocket/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"peer": true
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"peer": true,
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -3747,7 +3719,6 @@
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==",
"peer": true,
"engines": {
"node": ">=0.10.32"
}
@@ -3954,54 +3925,50 @@
"dev": true
},
"@supabase/auth-helpers-nextjs": {
"version": "0.7.0-next.8",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.7.0-next.8.tgz",
"integrity": "sha512-7pCbdnyAQo+D4qYQCvfg4B3OHIPtrILy/4LNwmF+1uheDeK7B6pxfN2SVeOR2TU3lolxMwEKUP6Q0h1qiCXbQg==",
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.7.2.tgz",
"integrity": "sha512-n5IyGBYJV/WiR5Rgw4CUaiJYiOv9yW2of4ZP4EyzKt2O6/6rztt7PcGE4AoK2vERw+fb5F2QtJBdt6J5eOYCCw==",
"requires": {
"@supabase/auth-helpers-shared": "0.4.0-next.3",
"@supabase/auth-helpers-shared": "0.4.1",
"set-cookie-parser": "^2.6.0"
}
},
"@supabase/auth-helpers-shared": {
"version": "0.4.0-next.3",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.4.0-next.3.tgz",
"integrity": "sha512-ELvEbYPJdTlwvqXsHkRN8ADcRe1IQxHt+UNqxbV2SKIpJCieQ4BMsgUVI/w+e3gMQHRbydk0PaJpOa9aStzMyg==",
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.4.1.tgz",
"integrity": "sha512-IEDX9JzWkIjQiLUaP4Qy5YDiG0jFQatWfS+jw8cCQs6QfbNdEPd2Y3qonwGHnM90CZom9SvjuylBv2pFVAL7Lw==",
"requires": {
"jose": "^4.14.3"
}
},
"@supabase/functions-js": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.1.tgz",
"integrity": "sha512-bIR1Puae6W+1/MzPfYBWOG/SCWGo4B5CB7c0ZZksvliNEAzhxNBJ0UFKYINcGdGtxG8ZC+1xr3utWpNZNwnoRw==",
"peer": true,
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.2.tgz",
"integrity": "sha512-QCR6pwJs9exCl37bmpMisUd6mf+0SUBJ6mUpiAjEkSJ/+xW8TCuO14bvkWHADd5hElJK9MxNlMQXxSA4DRz9nQ==",
"requires": {
"cross-fetch": "^3.1.5"
}
},
"@supabase/gotrue-js": {
"version": "2.27.1",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.27.1.tgz",
"integrity": "sha512-rewbfKTC9DZNnPy4rRpr5ViBXre55wEXPWOueh/ZgwunR1TGmntRcraIM6SDKrP6iRD6ucx325a467uZ5U+KWg==",
"peer": true,
"version": "2.31.0",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.31.0.tgz",
"integrity": "sha512-YcwlbbNfedlue/HVIXtYBb4fuOrs29gNOTl6AmyxPp4zryRxzFvslVN9kmLDBRUAVU9fnPJh2bgOR3chRjJX5w==",
"requires": {
"cross-fetch": "^3.1.5"
}
},
"@supabase/postgrest-js": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.6.1.tgz",
"integrity": "sha512-WDBUPOCOwcZonaCwEodwdA8hwWYOiXroDF9vWGxZxKAnuSVE2Ieci/kvhR4EsWvgGST2h90LRowgO+msXe8+fA==",
"peer": true,
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.7.1.tgz",
"integrity": "sha512-xPRYLaZrkLbXNlzmHW6Wtf9hmcBLjjI5xUz2zj8oE2hgXGaYoZBBkpN9bmW9i17Z1f6Ujxa942AqK439XOA36A==",
"requires": {
"cross-fetch": "^3.1.5"
}
},
"@supabase/realtime-js": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.2.tgz",
"integrity": "sha512-Fi6xAl5PUkqnjl3wo4rdcQIbMG3+yTRX1aUZe/yfvTG84RMvmCXJ1yN6MmafVLeZpU1xkaz5Vx4L0tnHcLiy6w==",
"peer": true,
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.3.tgz",
"integrity": "sha512-c7TzL81sx2kqyxsxcDduJcHL9KJdCOoKimGP6lQSqiZKX42ATlBZpWbyy9KFGFBjAP4nyopMf5JhPi2ZH9jyNw==",
"requires": {
"@types/phoenix": "^1.5.4",
"@types/websocket": "^1.0.3",
@@ -4012,21 +3979,19 @@
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.1.tgz",
"integrity": "sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==",
"peer": true,
"requires": {
"cross-fetch": "^3.1.5"
}
},
"@supabase/supabase-js": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.22.0.tgz",
"integrity": "sha512-omkgSWL1HwnpXZZy+yshFLx/qqxwk9kx9jbRM6IHNEylKrH/sz6JX7rGyIOmN9niDxMRjsCu1nwuBhD6IiF2xg==",
"peer": true,
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.26.0.tgz",
"integrity": "sha512-RXmTPTobaYAwkSobadHZmEVLmzX3SGrtRZIGfLWnLv92VzBRrjuXn0a+bJqKl50GUzsyqPA+j5pod7EwMkcH5A==",
"requires": {
"@supabase/functions-js": "^2.1.0",
"@supabase/gotrue-js": "^2.26.0",
"@supabase/postgrest-js": "^1.1.1",
"@supabase/realtime-js": "^2.7.2",
"@supabase/gotrue-js": "^2.31.0",
"@supabase/postgrest-js": "^1.7.0",
"@supabase/realtime-js": "^2.7.3",
"@supabase/storage-js": "^2.5.1",
"cross-fetch": "^3.1.5"
}
@@ -4051,10 +4016,9 @@
"integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw=="
},
"@types/phoenix": {
"version": "1.5.6",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.5.6.tgz",
"integrity": "sha512-e7jZ6I9uyRGsg7MNwQcarmBvRlbGb9DibbocE9crVnxqsy6C23RMxLWbJ2CQ3vgCW7taoL1L+F02EcjA6ld7XA==",
"peer": true
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz",
"integrity": "sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g=="
},
"@types/prop-types": {
"version": "15.7.5",
@@ -4088,7 +4052,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz",
"integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==",
"peer": true,
"requires": {
"@types/node": "*"
}
@@ -4315,7 +4278,6 @@
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
"integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
"peer": true,
"requires": {
"node-gyp-build": "^4.3.0"
}
@@ -4384,7 +4346,6 @@
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
"integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
"peer": true,
"requires": {
"node-fetch": "^2.6.11"
}
@@ -4408,7 +4369,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"peer": true,
"requires": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
@@ -4601,7 +4561,6 @@
"version": "0.10.62",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"peer": true,
"requires": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
@@ -4612,7 +4571,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"peer": true,
"requires": {
"d": "1",
"es5-ext": "^0.10.35",
@@ -4623,7 +4581,6 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"peer": true,
"requires": {
"d": "^1.0.1",
"ext": "^1.1.2"
@@ -4968,7 +4925,6 @@
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"peer": true,
"requires": {
"type": "^2.7.2"
},
@@ -4976,8 +4932,7 @@
"type": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
"peer": true
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
}
}
},
@@ -5485,8 +5440,7 @@
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"peer": true
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"is-weakmap": {
"version": "2.0.1",
@@ -5705,14 +5659,12 @@
"next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
"peer": true
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node-fetch": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
"integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
"peer": true,
"requires": {
"whatwg-url": "^5.0.0"
}
@@ -5720,8 +5672,7 @@
"node-gyp-build": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
"integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
"peer": true
"integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ=="
},
"object-assign": {
"version": "4.1.1",
@@ -6228,8 +6179,7 @@
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"peer": true
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"tsconfig-paths": {
"version": "3.14.2",
@@ -6268,8 +6218,7 @@
"type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
"peer": true
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"type-check": {
"version": "0.4.0",
@@ -6299,7 +6248,6 @@
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"peer": true,
"requires": {
"is-typedarray": "^1.0.0"
}
@@ -6333,7 +6281,6 @@
"version": "5.0.10",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
"integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
"peer": true,
"requires": {
"node-gyp-build": "^4.3.0"
}
@@ -6341,14 +6288,12 @@
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"peer": true
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"websocket": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
"integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
"peer": true,
"requires": {
"bufferutil": "^4.0.1",
"debug": "^2.2.0",
@@ -6362,7 +6307,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"peer": true,
"requires": {
"ms": "2.0.0"
}
@@ -6370,8 +6314,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"peer": true
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
@@ -6379,7 +6322,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"peer": true,
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -6445,8 +6387,7 @@
"yaeti": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==",
"peer": true
"integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug=="
},
"yallist": {
"version": "4.0.0",

View File

@@ -9,7 +9,8 @@
"lint": "next lint"
},
"dependencies": {
"@supabase/auth-helpers-nextjs": "^0.7.0",
"@supabase/auth-helpers-nextjs": "^0.7.1",
"@supabase/supabase-js": "^2.26.0",
"@types/node": "^20.2.3",
"@types/react": "^18.2.6",
"@types/react-dom": "^18.2.4",

View File

@@ -1,7 +1,6 @@
import { createClient } from '@supabase/supabase-js'
import { Database } from './schema'
export const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
process.env.NEXT_PUBLIC_SUPABASE_URL ?? '',
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ?? ''
)

View File

@@ -11,6 +11,7 @@
"@supabase/auth-helpers-nextjs": "^0.7.1",
"@supabase/auth-ui-react": "^0.4.2",
"@supabase/auth-ui-shared": "^0.1.6",
"@supabase/supabase-js": "^2.26.0",
"@types/node": "20.1.4",
"@types/react": "18.2.6",
"@types/react-dom": "18.2.4",
@@ -375,34 +376,30 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.1.tgz",
"integrity": "sha512-bIR1Puae6W+1/MzPfYBWOG/SCWGo4B5CB7c0ZZksvliNEAzhxNBJ0UFKYINcGdGtxG8ZC+1xr3utWpNZNwnoRw==",
"peer": true,
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/gotrue-js": {
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.26.0.tgz",
"integrity": "sha512-orxz8nwaF5D1nY/9H5xxTfFSCTvYeDLx24UO/Mxsx83xFP0t5RNxQZ0lEHBOhHhXJ4vR/COv79AxoWCOTu/7Rg==",
"peer": true,
"version": "2.31.0",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.31.0.tgz",
"integrity": "sha512-YcwlbbNfedlue/HVIXtYBb4fuOrs29gNOTl6AmyxPp4zryRxzFvslVN9kmLDBRUAVU9fnPJh2bgOR3chRjJX5w==",
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/postgrest-js": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.6.1.tgz",
"integrity": "sha512-WDBUPOCOwcZonaCwEodwdA8hwWYOiXroDF9vWGxZxKAnuSVE2Ieci/kvhR4EsWvgGST2h90LRowgO+msXe8+fA==",
"peer": true,
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.7.1.tgz",
"integrity": "sha512-xPRYLaZrkLbXNlzmHW6Wtf9hmcBLjjI5xUz2zj8oE2hgXGaYoZBBkpN9bmW9i17Z1f6Ujxa942AqK439XOA36A==",
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/realtime-js": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.2.tgz",
"integrity": "sha512-Fi6xAl5PUkqnjl3wo4rdcQIbMG3+yTRX1aUZe/yfvTG84RMvmCXJ1yN6MmafVLeZpU1xkaz5Vx4L0tnHcLiy6w==",
"peer": true,
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.3.tgz",
"integrity": "sha512-c7TzL81sx2kqyxsxcDduJcHL9KJdCOoKimGP6lQSqiZKX42ATlBZpWbyy9KFGFBjAP4nyopMf5JhPi2ZH9jyNw==",
"dependencies": {
"@types/phoenix": "^1.5.4",
"@types/websocket": "^1.0.3",
@@ -413,21 +410,19 @@
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.1.tgz",
"integrity": "sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==",
"peer": true,
"dependencies": {
"cross-fetch": "^3.1.5"
}
},
"node_modules/@supabase/supabase-js": {
"version": "2.21.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.21.0.tgz",
"integrity": "sha512-FW3ZzBoc4orSgfX0dXrmJoXAcI/hiekmqXTkN64vjtUF2Urp3UjyAf71UTtV9Jl6ejHoe3K++e0+Rg9zKUJh5w==",
"peer": true,
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.26.0.tgz",
"integrity": "sha512-RXmTPTobaYAwkSobadHZmEVLmzX3SGrtRZIGfLWnLv92VzBRrjuXn0a+bJqKl50GUzsyqPA+j5pod7EwMkcH5A==",
"dependencies": {
"@supabase/functions-js": "^2.1.0",
"@supabase/gotrue-js": "^2.23.0",
"@supabase/postgrest-js": "^1.1.1",
"@supabase/realtime-js": "^2.7.2",
"@supabase/gotrue-js": "^2.31.0",
"@supabase/postgrest-js": "^1.7.0",
"@supabase/realtime-js": "^2.7.3",
"@supabase/storage-js": "^2.5.1",
"cross-fetch": "^3.1.5"
}
@@ -451,10 +446,9 @@
"integrity": "sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q=="
},
"node_modules/@types/phoenix": {
"version": "1.5.6",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.5.6.tgz",
"integrity": "sha512-e7jZ6I9uyRGsg7MNwQcarmBvRlbGb9DibbocE9crVnxqsy6C23RMxLWbJ2CQ3vgCW7taoL1L+F02EcjA6ld7XA==",
"peer": true
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz",
"integrity": "sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@@ -488,7 +482,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz",
"integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==",
"peer": true,
"dependencies": {
"@types/node": "*"
}
@@ -823,7 +816,6 @@
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
"integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
@@ -940,7 +932,6 @@
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz",
"integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==",
"peer": true,
"dependencies": {
"node-fetch": "^2.6.11"
}
@@ -967,7 +958,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"peer": true,
"dependencies": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
@@ -1240,7 +1230,6 @@
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
@@ -1254,7 +1243,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"peer": true,
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
@@ -1265,7 +1253,6 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"peer": true,
"dependencies": {
"d": "^1.0.1",
"ext": "^1.1.2"
@@ -1731,7 +1718,6 @@
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"peer": true,
"dependencies": {
"type": "^2.7.2"
}
@@ -1739,8 +1725,7 @@
"node_modules/ext/node_modules/type": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
"peer": true
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
@@ -2468,8 +2453,7 @@
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"peer": true
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"node_modules/is-weakmap": {
"version": "2.0.1",
@@ -2807,14 +2791,12 @@
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
"peer": true
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"node_modules/node-fetch": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
"integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
"peer": true,
"dependencies": {
"whatwg-url": "^5.0.0"
},
@@ -2834,7 +2816,6 @@
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
"integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
"peer": true,
"bin": {
"node-gyp-build": "bin.js",
"node-gyp-build-optional": "optional.js",
@@ -3723,8 +3704,7 @@
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"peer": true
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/tsconfig-paths": {
"version": "3.14.2",
@@ -3764,8 +3744,7 @@
"node_modules/type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
"peer": true
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -3806,7 +3785,6 @@
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"peer": true,
"dependencies": {
"is-typedarray": "^1.0.0"
}
@@ -3858,7 +3836,6 @@
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
"integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"node-gyp-build": "^4.3.0"
},
@@ -3869,14 +3846,12 @@
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"peer": true
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"node_modules/websocket": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
"integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
"peer": true,
"dependencies": {
"bufferutil": "^4.0.1",
"debug": "^2.2.0",
@@ -3893,7 +3868,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -3901,14 +3875,12 @@
"node_modules/websocket/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"peer": true
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"peer": true,
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -3993,7 +3965,6 @@
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==",
"peer": true,
"engines": {
"node": ">=0.10.32"
}

View File

@@ -10,6 +10,7 @@
},
"dependencies": {
"@supabase/auth-helpers-nextjs": "^0.7.1",
"@supabase/supabase-js": "^2.26.0",
"@supabase/auth-ui-react": "^0.4.2",
"@supabase/auth-ui-shared": "^0.1.6",
"@types/node": "20.1.4",

View File

@@ -12,9 +12,9 @@
- [x] Хоствана база данни Postgres. [Документи](https://supabase.com/docs/guides/database)
- [x] Удостоверяване и оторизация. [Документи](https://supabase.com/docs/guides/auth)
- [x] Автоматично генерирани API.
- [x] REST. [Документи](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Документи](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Абонаменти в реално време. [Документи](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Документи](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Документи](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Абонаменти в реално време. [Документи](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Функции.
- [x] Функции за бази данни. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Крайни функции [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] হোস্ট করা পোস্টগ্রেস ডাটাবেস. [ডক্স](https://supabase.com/docs/guides/database)
- [x] অথেনটিকেশন এবং অথরাইজড . [ডক্স](https://supabase.com/docs/guides/auth)
- [x] স্বয়ংক্রিয়ভাবে তৈরি এপিআই.
- [x] রেস্ট. [ডক্স](https://supabase.com/docs/guides/database/api#rest-api)
- [x] রিয়েলটাইম সাবস্ক্রিপশন. [ডক্স](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] গ্রাফকিউএল (বেটা). [ডক্স](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] রেস্ট. [ডক্স](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] রিয়েলটাইম সাবস্ক্রিপশন. [ডক্স](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] গ্রাফকিউএল (বেটা). [ডক্স](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] ফাংশনস.
- [x] ডাটাবেস ফাংশনস. [ডক্স](https://supabase.com/docs/guides/database/functions)
- [x] এজ ফাংশনস. [ডক্স](https://supabase.com/docs/guides/functions)
@@ -43,7 +43,7 @@
- [x] পাবলিক বেটা: বেশিরভাগ নন-এন্টারপ্রাইজ ব্যবহারের ক্ষেত্রে যথেষ্ট স্থিতিশীল
- [ ] পাবলিক: প্রোডাকশন রেডি
আমরা বর্তমানে পাবলিক বটাতে আছি। বড় আপডেটের বিজ্ঞপ্তি পেতে এই রিপুর "রিলিজ" দেখুন।
আমরা বর্তমানে পাবলিক বিটাতে আছি। বড় আপডেটের বিজ্ঞপ্তি পেতে এই রেপোর "রিলিজ" দেখুন।
<kbd><img src="https://raw.githubusercontent.com/supabase/supabase/d5f7f413ab356dc1a92075cb3cee4e40a957d5b1/web/static/watch-repo.gif" alt="এই রিপু দেখুন"/></kbd>

View File

@@ -12,9 +12,9 @@
- [x] hostovaná databáze Postgres. [Dokumenty](https://supabase.com/docs/guides/database)
- [x] Ověřování a autorizace. [Dokumenty](https://supabase.com/docs/guides/auth)
- [x] Automaticky generované rozhraní API.
- [x] REST. [Dokumenty](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Dokumenty](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Odběry v reálném čase. [Dokumenty](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Dokumenty](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Dokumenty](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Odběry v reálném čase. [Dokumenty](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funkce.
- [x] Databázové funkce. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Okrajové funkce [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hosted Postgres Database. [Docs](https://supabase.com/docs/guides/database)
- [x] Autentifikation og autorisering. [Docs](https://supabase.com/docs/guides/auth)
- [x] Automatisk genererede API'er.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Realtidsabonnementer. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Realtidsabonnementer. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funktioner.
- [x] Databasefunktioner. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge-funktioner [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Gehostete Postgres-Datenbank. [Docs](https://supabase.com/docs/guides/database)
- [x] Authentifizierung und Autorisierung. [Docs](https://supabase.com/docs/guides/auth)
- [x] Auto-generierte APIs.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Echtzeit-Abonnements. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Echtzeit-Abonnements. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funktionen.
- [x] Datenbank-Funktionen. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge-Funktionen [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hosted Postgres Database. [Docs](https://supabase.com/docs/guides/database)
- [x] Αυθεντικοποίηση και εξουσιοδότηση. [Έγγραφα](https://supabase.com/docs/guides/auth)
- [x] Αυτόματα παραγόμενα APIs.
- [x] REST. [Έγγραφα](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Συνδρομές σε πραγματικό χρόνο. [Έγγραφα](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Έγγραφα](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Συνδρομές σε πραγματικό χρόνο. [Έγγραφα](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Συναρτήσεις.
- [x] Συναρτήσεις βάσης δεδομένων. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge Functions [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- Base de datos Postgres alojada. [Documentación](https://supabase.com/docs/guides/database)
- [x] Autenticación y autorización. [Documentos](https://supabase.com/docs/guides/auth)
- [x] API autogeneradas.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Documentos](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Suscripciones en tiempo real. [Documentos](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Documentos](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Suscripciones en tiempo real. [Documentos](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funciones.
- [x] Funciones de base de datos. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Funciones de borde [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hostitud Postgres andmebaas. [Dokumendid](https://supabase.com/docs/guides/database)
- [x] Autentimine ja autoriseerimine. [Dokumendid](https://supabase.com/docs/guides/auth)
- [x] Automaatselt genereeritud APId.
- [x] REST. [Dokumendid](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Dokumendid](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Reaalajas toimivad tellimused. [Dokumendid](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Dokumendid](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Dokumendid](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Reaalajas toimivad tellimused. [Dokumendid](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funktsioonid.
- [x] Andmebaasi funktsioonid. [Dokumendid](https://supabase.com/docs/guides/database/functions)
- [x] Edge Functions [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hosted Postgres Database. [Docs](https://supabase.com/docs/guides/database)
- [x] Tunnistus ja valtuutus. [Docs](https://supabase.com/docs/guides/auth)
- [x] Automaattisesti luodut API:t.
- [x] REST. [Asiakirjat](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Asiakirjat](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Reaaliaikaiset tilaukset. [Asiakirjat](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Asiakirjat](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Asiakirjat](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Reaaliaikaiset tilaukset. [Asiakirjat](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funktiot.
- [x] Tietokantafunktiot. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Reunatoiminnot [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Base de données Postgres hébergée. [Docs](https://supabase.com/docs/guides/database)
- [x] Authentification et autorisation. [Docs](https://supabase.com/docs/guides/auth)
- [x] API générées automatiquement.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Abonnements en temps réel. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Abonnements en temps réel. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Fonctions.
- [x] Fonctions de base de données. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Fonctions Edge [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] होस्टेड पोस्टग्रेज डेटाबेस। [प्रलेखन](https://supabase.com/docs/guides/database)
- [x] प्रमाणीकरण और प्राधिकरण। [प्रलेखन](https://supabase.com/docs/guides/auth)
- [x] उत्पन्न एपीआईस।
- [x] रेस्ट। [प्रलेखन](https://supabase.com/docs/guides/database/api#rest-api)
- [x] रीयलटाइम सदस्यता। [प्रलेखन](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] ग्राफ़क्यूएल (प्रयोगात्मक)। [प्रलेखन](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] रेस्ट। [प्रलेखन](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] रीयलटाइम सदस्यता। [प्रलेखन](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] ग्राफ़क्यूएल (प्रयोगात्मक)। [प्रलेखन](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] फ़ंक्शंस।
- [x] डेटाबेस फ़ंक्शंस। [प्रलेखन](https://supabase.com/docs/guides/database/functions)
- [x] एज फ़ंक्शंस। [प्रलेखन](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hosted Postgres adatbázis. [Docs](https://supabase.com/docs/guides/database)
- [x] Hitelesítés és engedélyezés. [Docs](https://supabase.com/docs/guides/auth)
- [x] Automatikusan generált API-k.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Valós idejű előfizetések. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Valós idejű előfizetések. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funkciók.
- [x] Database Functions. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge Functions [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Basis Data Postgres yang dihosting. [Dokumen](https://supabase.com/docs/guides/database)
- [x] Otentikasi dan Otorisasi. [Dokumen](https://supabase.com/docs/guides/auth)
- [x] API yang dibuat secara otomatis.
- [x] REST. [Documents](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Documents](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Langganan realtime. [Documents](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Documents](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Documents](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Langganan realtime. [Documents](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Fungsi-fungsi.
- [x] Fungsi-fungsi Basis Data. [Documents](https://supabase.com/docs/guides/database/functions)
- [x] Fungsi Tepi [Documents](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- Database Postgres ospitato. [Documenti](https://supabase.com/docs/guides/database)
- [x] Autenticazione e autorizzazione. [Documenti](https://supabase.com/docs/guides/auth)
- [x] API generate automaticamente.
- [x] REST. [Documenti](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Documenti](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Sottoscrizioni in tempo reale. [Documenti](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Documenti](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Documenti](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Sottoscrizioni in tempo reale. [Documenti](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funzioni.
- [x] Funzioni di database. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Funzioni Edge [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] ホスティングされた Postgres データベースです。[ドックス](https://supabase.com/docs/guides/database)
- [x] 認証と認可。[ドキュメント](https://supabase.com/docs/guides/auth)
- [x] 自動生成される API。
- [x] REST。[ドキュメント](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL。[Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] リアルタイムサブスクリプション。[ドキュメント](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST。[ドキュメント](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL。[Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] リアルタイムサブスクリプション。[ドキュメント](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] 関数。
- [x] データベースファンクション。[Docs](https://supabase.com/docs/guides/database/functions)
- [x] エッジ機能 [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] ホスティングされた Postgres データベース [Docs](https://supabase.com/docs/guides/database)
- [x] 認証・認可 [Docs](https://supabase.com/docs/guides/auth)
- [x] API を自動生成
- [x] REST [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] リアルタイムサブスクリプション [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] GraphQL (Beta) [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] REST [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] リアルタイムサブスクリプション [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] GraphQL (Beta) [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] 関数
- [x] データベース関数 [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge Functions [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] 호스팅된 Postgres 데이터베이스. [문서](https://supabase.com/docs/guides/database)
- [x] 인증 및 권한 부여. [문서](https://supabase.com/docs/guides/auth)
- [x] 자동 생성 API.
- [x] REST. [문서](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [문서](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] 실시간 구독. [문서](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [문서](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [문서](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] 실시간 구독. [문서](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] 함수.
- [x] 데이터베이스 함수. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] 엣지 기능 [문서](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Prieglobos Postgres duomenų bazė. [Dokumentai](https://supabase.com/docs/guides/database)
- [x] Autentiškumo nustatymas ir autorizavimas. [Dokumentai](https://supabase.com/docs/guides/auth)
- [x] Automatiškai generuojamos API.
- [x] REST. [Dokumentai](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Dokumentai](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Realaus laiko prenumeratos. [Dokumentai](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Dokumentai](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Dokumentai](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Realaus laiko prenumeratos. [Dokumentai](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funkcijos.
- [x] Duomenų bazės funkcijos. [Dokumentai](https://supabase.com/docs/guides/database/functions)
- [x] Kraštų funkcijos [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hosted Postgres datubāze. [Dokumenti](https://supabase.com/docs/guides/database)
- [x] Autentifikācija un autorizācija. [Dokumenti](https://supabase.com/docs/guides/auth)
- [x] Automātiski ģenerēti API.
- [x] REST. [Dokumenti](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Dokumenti](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Reāllaika abonēšana. [Dokumenti](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Dokumenti](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Dokumenti](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Reāllaika abonēšana. [Dokumenti](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funkcijas.
- [x] Datubāzes funkcijas. [Dokumenti](https://supabase.com/docs/guides/database/functions)
- [x] Edge funkcijas [Dokumenti](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Hostet Postgres-database. [Dokumenter](https://supabase.com/docs/guides/database)
- [x] Autentisering og autorisasjon. [Dokumenter](https://supabase.com/docs/guides/auth)
- [x] Autogenererte API-er.
- [x] REST. [Dokumenter](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Dokumenter](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Sanntidsabonnementer. [Dokumenter](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Dokumenter](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Dokumenter](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Sanntidsabonnementer. [Dokumenter](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funksjoner.
- [x] Databasefunksjoner. [Dokumenter](https://supabase.com/docs/guides/database/functions)
- [x] Edge-funksjoner [Dokumenter](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x]Gehoste Postgres Database. [Docs](https://supabase.com/docs/guides/database)
- [x] Authenticatie en Autorisatie. [Docs](https://supabase.com/docs/guides/auth)
- [x] Automatisch gegenereerde API's.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Realtime abonnementen. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Realtime abonnementen. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Functies.
- [x] Database functies. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Randfuncties. [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] hostowana baza danych Postgres [x]. [Dokumenty](https://supabase.com/docs/guides/database)
- [x] uwierzytelnianie i autoryzacja [x]. [Dokumenty](https://supabase.com/docs/guides/auth)
- [x] Automatycznie generowane interfejsy API.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Subskrypcje w czasie rzeczywistym. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Subskrypcje w czasie rzeczywistym. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funkcje.
- [x] Funkcje bazy danych. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Funkcje brzegowe [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Base de dados Postgres alojada. [Docs](https://supabase.com/docs/guides/database)
- [x] Autenticação e autorização. [Docs](https://supabase.com/docs/guides/auth)
- [x] APIs geradas automaticamente.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Assinaturas em tempo real. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Assinaturas em tempo real. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funções.
- [x] Funções de base de dados. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Funções de Borda [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Banco de dados Postgres hospedado. [Docs](https://supabase.com/docs/guides/database)
- [x] Autenticação e autorização. [Docs](https://supabase.com/docs/guides/auth)
- [x] APIs geradas automaticamente.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Assinaturas em tempo real. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Assinaturas em tempo real. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funções.
- [x] Funções de banco de dados. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Funções de borda [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Baza de date Postgres găzduită. [Docs](https://supabase.com/docs/guides/database)
- [x] Autentificare și autorizare. [Docs](https://supabase.com/docs/guides/auth)
- [x] API-uri generate automat.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Abonamente în timp real. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Abonamente în timp real. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funcții.
- [x] Funcții de baze de date. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Funcții de margine. [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] Хостируемая база данных Postgres. [Docs](https://supabase.com/docs/guides/database)
- [x] Аутентификация и авторизация. [Docs](https://supabase.com/docs/guides/auth)
- [x] Автоматически генерируемые API.
- [x] REST. [Docs](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Подписки в реальном времени. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Docs](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Docs](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Подписки в реальном времени. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Функции.
- [x] Функции базы данных. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Edge Functions [Docs](https://supabase.com/docs/guides/functions)

View File

@@ -12,9 +12,9 @@
- [x] hostovaná databáza Postgres. [Dokumenty](https://supabase.com/docs/guides/database)
- [x] Autentifikácia a autorizácia. [Dokumenty](https://supabase.com/docs/guides/auth)
- [x] Automaticky generované rozhrania API.
- [x] REST. [Dokumenty](https://supabase.com/docs/guides/database/api#rest-api)
- [x] GraphQL. [Dokumenty](https://supabase.com/docs/guides/database/api#graphql-api)
- [x] Odbery v reálnom čase. [Docs](https://supabase.com/docs/guides/database/api#realtime-api)
- [x] REST. [Dokumenty](https://supabase.com/docs/guides/api#rest-api-overview)
- [x] GraphQL. [Dokumenty](https://supabase.com/docs/guides/api#graphql-api-overview)
- [x] Odbery v reálnom čase. [Docs](https://supabase.com/docs/guides/api#realtime-api-overview)
- [x] Funkcie.
- [x] Databázové funkcie. [Docs](https://supabase.com/docs/guides/database/functions)
- [x] Okrajové funkcie [Docs](https://supabase.com/docs/guides/functions)

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