No files matched your search
@@ -142,7 +142,7 @@ Our approach for client libraries is modular. Each sub-library is a standalone i
|
||||
<td>-</td>
|
||||
<td><a href="https://github.com/supabase-community/gotrue-java" target="_blank" rel="noopener noreferrer">gotrue-java</a></td>
|
||||
<td>-</td>
|
||||
<td><a href="https://github.com/supabase-community/storage-java" target="_blanke" rel="noopener noreferrer">storage-java</a></td>
|
||||
<td><a href="https://github.com/supabase-community/storage-java" target="_blank" rel="noopener noreferrer">storage-java</a></td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -204,6 +204,11 @@ export const menuItems: NavMenu = {
|
||||
url: '/guides/database/extensions/plv8',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
name: 'PostGIS: Geo queries',
|
||||
url: '/guides/database/extensions/postgis',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
name: 'uuid-ossp: Unique Identifiers',
|
||||
url: '/guides/database/extensions/uuid-ossp',
|
||||
@@ -300,6 +305,7 @@ export const menuItems: NavMenu = {
|
||||
{ name: 'Authsignal', url: '/guides/integrations/authsignal', items: [] },
|
||||
{ name: 'Clerk', url: '/guides/integrations/clerk', items: [] },
|
||||
{ name: 'keyri', url: '/guides/integrations/keyri', items: [] },
|
||||
{ name: 'Picket', url: '/guides/integrations/picket', items: [] },
|
||||
{ name: 'Stytch', url: '/guides/integrations/stytch', items: [] },
|
||||
{ name: 'SuperTokens', url: '/guides/integrations/supertokens', items: [] },
|
||||
],
|
||||
|
||||
@@ -42,13 +42,14 @@ export const gettingstarted = {
|
||||
items: [
|
||||
{ name: 'Features', url: '/guides/getting-started/features', items: [] },
|
||||
{ name: 'Architecture', url: '/guides/getting-started/architecture', items: [] },
|
||||
// {
|
||||
// name: 'Quickstarts',
|
||||
// items: [
|
||||
// { name: 'NextJS', url: '/guides/getting-started/quickstarts/nextjs', items: [] },
|
||||
// { name: 'ReactJS', url: '/guides/getting-started/quickstarts/reactjs', items: [] },
|
||||
// ],
|
||||
// },
|
||||
{
|
||||
name: 'Framework Quickstarts',
|
||||
items: [
|
||||
{ name: 'ReactJS', url: '/guides/getting-started/quickstarts/reactjs', items: [] },
|
||||
{ name: 'NextJS', url: '/guides/getting-started/quickstarts/nextjs', items: [] },
|
||||
{ name: 'Flutter', url: '/guides/getting-started/quickstarts/flutter', items: [] },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Web app tutorials',
|
||||
items: [
|
||||
@@ -389,6 +390,11 @@ export const database = {
|
||||
url: '/guides/database/extensions/pgnet',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
name: 'PostGIS: Geo queries',
|
||||
url: '/guides/database/extensions/postgis',
|
||||
items: [],
|
||||
},
|
||||
{ name: 'pgTAP: Unit Testing', url: '/guides/database/extensions/pgtap', items: [] },
|
||||
{
|
||||
name: 'uuid-ossp: Unique Identifiers',
|
||||
|
||||
@@ -7,10 +7,6 @@ import { IconChevronLeft } from '~/../../packages/ui'
|
||||
import * as NavItems from './NavigationMenu.constants'
|
||||
import * as Accordion from '@radix-ui/react-accordion'
|
||||
|
||||
interface ImPureProps {
|
||||
// users: Array<User>
|
||||
}
|
||||
|
||||
const HeaderImage = React.memo(function HeaderImage(props: any) {
|
||||
const router = useRouter()
|
||||
const { isDarkMode } = useTheme()
|
||||
@@ -45,12 +41,6 @@ const ContentAccordionLink = React.memo(function ContentAccordionLink(props: any
|
||||
const router = useRouter()
|
||||
const { isDarkMode } = useTheme()
|
||||
|
||||
let subItemMenuOpen = false
|
||||
|
||||
if (router.asPath.includes(props.subItem.url)) {
|
||||
subItemMenuOpen = true
|
||||
}
|
||||
|
||||
const LinkContainer = (props) => {
|
||||
return (
|
||||
<Link href={props.url} passHref>
|
||||
@@ -188,7 +178,7 @@ const Content = (props) => {
|
||||
return (
|
||||
<div key={x.name}>
|
||||
{x.items && x.items.length > 0 ? (
|
||||
<div>
|
||||
<div className="flex flex-col gap-1">
|
||||
{x.items.map((subItem, subItemIndex) => {
|
||||
return (
|
||||
<ContentAccordionLink
|
||||
|
||||
@@ -148,7 +148,7 @@ const RenderLink = React.memo(function RenderLink(props: any) {
|
||||
|
||||
const SideMenuTitle = ({ title }: { title: string }) => {
|
||||
return (
|
||||
<span className="font-mono text-xs uppercase text-scale-1200 font-medium tracking-wider mb-3">
|
||||
<span className="font-mono text-xs uppercase text-scale-1200 font-medium tracking-wider">
|
||||
{title}
|
||||
</span>
|
||||
)
|
||||
@@ -245,7 +245,7 @@ const Content: React.FC<INavigationMenuRefList> = ({ id, lib, commonSections, sp
|
||||
<RevVersionDropdown />
|
||||
</div>
|
||||
|
||||
<ul className="function-link-list">
|
||||
<ul className="function-link-list flex flex-col gap-1">
|
||||
{sections.map((fn: any, fnIndex) => {
|
||||
// run allow check
|
||||
if (isFuncNotInLibraryOrVersion(fn.id, fn.type, allowedKeys)) {
|
||||
|
||||
@@ -139,7 +139,7 @@ Middleware runs before every route declared in the `matcher` array. Since we don
|
||||
>
|
||||
<TabPanel id="js" label="JavaScript">
|
||||
|
||||
Create a new file at `/pages/middleware.js` and populate with the following:
|
||||
Create a new file at `/app/middleware.js` and populate with the following:
|
||||
|
||||
```jsx title="middleware.js"
|
||||
import { createMiddlewareSupabaseClient } from '@supabase/auth-helpers-nextjs'
|
||||
@@ -166,7 +166,7 @@ export const config = {
|
||||
|
||||
<TabPanel id="ts" label="TypeScript">
|
||||
|
||||
Create a new file at `/middleware.ts` (a sibling of /pages) and populate with the following:
|
||||
Create a new file at `/app/middleware.ts` and populate with the following:
|
||||
|
||||
```tsx title="middleware.ts"
|
||||
import { createMiddlewareSupabaseClient } from '@supabase/auth-helpers-nextjs'
|
||||
@@ -220,11 +220,13 @@ export default function SupabaseListener({ accessToken }) {
|
||||
const router = useRouter()
|
||||
|
||||
useEffect(() => {
|
||||
supabase.auth.onAuthStateChange((event, session) => {
|
||||
const { data: subscription } = supabase.auth.onAuthStateChange((event, session) => {
|
||||
if (session?.access_token !== accessToken) {
|
||||
router.reload()
|
||||
router.refresh()
|
||||
}
|
||||
})
|
||||
|
||||
return () => subscription.unsubscribe()
|
||||
}, [accessToken])
|
||||
|
||||
return null
|
||||
|
||||
@@ -34,6 +34,10 @@ Make sure to specify the `on delete cascade` clause when referencing `auth.users
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Deleting Users
|
||||
|
||||
You may delete users directly or via the management console at Authentication > Users. Note that deleting a user from the `auth.users` table does not automatically sign out a user. As Supabase makes use of JSON Web Tokens (JWT), a user's JWT will remain "valid" until it has expired. Should you wish to immediately revoke access for a user, do considering making use of a Row Level Security policy as described below.
|
||||
|
||||
## Public access
|
||||
|
||||
Since Row Level Security is enabled, this table is accessible via the API but no data will be returned unless we set up some Policies.
|
||||
|
||||
@@ -6,7 +6,7 @@ export const meta = {
|
||||
description: 'Add Twitter OAuth to your Supabase project',
|
||||
}
|
||||
|
||||
To enable Twitter Auth for your project, you need to set up a Twitter OAuth application with [elevated access](https://developer.twitter.com/en/portal/products/elevated)and add the application credentials in the Supabase Dashboard.
|
||||
To enable Twitter Auth for your project, you need to set up a Twitter OAuth application with [elevated access](https://developer.twitter.com/en/portal/products/elevated) and add the application credentials in the Supabase Dashboard.
|
||||
|
||||
## Overview
|
||||
|
||||
|
||||
@@ -0,0 +1,302 @@
|
||||
import Layout from '~/layouts/DefaultGuideLayout'
|
||||
|
||||
export const meta = {
|
||||
id: 'postgis',
|
||||
title: 'PostGIS: Geo queries',
|
||||
description: 'Working with geo-spatial data in Postgres',
|
||||
}
|
||||
|
||||
[PostGIS](https://postgis.net/) is a Postgres extension that allows you to interact with Geo data within Postgres. You can sort your data by geographic location, get data within certain geographic boundaries, and do much more with it.
|
||||
|
||||
## Overview
|
||||
|
||||
While you may be able to store simple lat/long geographic coordinates as a set of decimals, it does not scale very well when you try to query through a large data set. PostGIS comes with special data types that are efficient, and indexable for high scalability.
|
||||
|
||||
The additional data types that PostGIS provides include [Point](https://postgis.net/docs/using_postgis_dbmanagement.html#Point), [Polygon](https://postgis.net/docs/using_postgis_dbmanagement.html#Polygon), [Linestring](https://postgis.net/docs/using_postgis_dbmanagement.html#LineString), and many more to represent different types of geographical data. In this guide, we will mainly focus on how to interact with `Point` type, which represents a single set of latitude and longitude. If you are interested in digging deeper, you can learn more about different data types on the [data management section of PostGIS docs](https://postgis.net/docs/using_postgis_dbmanagement.html).
|
||||
|
||||
## Usage
|
||||
|
||||
### Enable the extension
|
||||
|
||||
You can get started with PostGIS by enabling the PostGIS extension in your Supabase dashboard.
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="dashboard"
|
||||
>
|
||||
<TabPanel id="dashboard" label="Dashboard">
|
||||
|
||||
1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard.
|
||||
2. Click on **Extensions** in the sidebar.
|
||||
3. Search for "postgis" and enable the extension.
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="sql" label="SQL">
|
||||
|
||||
```sql
|
||||
-- Example: enable the "postgis" extension
|
||||
create extension postgis with schema extensions;
|
||||
|
||||
-- Example: disable the "postgis" extension
|
||||
drop extension if exists postgis;
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
## Examples
|
||||
|
||||
Now that we are ready to get started with PostGIS, let’s create a table and see how we can utilize PostGIS for some typical use cases. Let’s imagine we are creating a simple restaurant-searching app.
|
||||
|
||||
Let’s create our table. Each row represents a restaurant with its location stored in `location` column as a `Point` type.
|
||||
|
||||
```sql
|
||||
create table if not exists public.restaurants (
|
||||
id int generated by default as identity primary key,
|
||||
name text not null,
|
||||
location geography(POINT) not null
|
||||
);
|
||||
```
|
||||
|
||||
We can then set a [spatial index](https://postgis.net/docs/using_postgis_dbmanagement.html#build-indexes) on the `location` column of this table.
|
||||
|
||||
```sql
|
||||
create index restaurants_geo_index
|
||||
on public.restaurants
|
||||
using GIST (location);
|
||||
```
|
||||
|
||||
### Inserting data
|
||||
|
||||
You can insert geographical data through SQL or through our API.
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="data"
|
||||
>
|
||||
<TabPanel id="data" label="Data">
|
||||
|
||||
<h4>Restaurants</h4>
|
||||
|
||||
| id | name | location |
|
||||
| --- | ----------- | -------------------------------- |
|
||||
| 1 | Supa Burger | lat: 40.807416, long: -73.946823 |
|
||||
| 2 | Supa Pizza | lat: 40.807475, long: -73.94581 |
|
||||
| 3 | Supa Taco | lat: 40.80629, long: -73.945826 |
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="sql" label="SQL">
|
||||
|
||||
```sql
|
||||
insert into public.restaurants
|
||||
(name, location)
|
||||
values
|
||||
('Supa Burger', st_point(-73.946823, 40.807416)),
|
||||
('Supa Pizza', st_point(-73.94581, 40.807475)),
|
||||
('Supa Taco', st_point(-73.945826, 40.80629));
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="js" label="JavaScript">
|
||||
|
||||
```js
|
||||
const { error } = await supabase.from('restaurants').insert([
|
||||
{
|
||||
name: 'Supa Burger',
|
||||
location: 'POINT(-73.946823 40.807416)',
|
||||
},
|
||||
{
|
||||
name: 'Supa Pizza',
|
||||
location: 'POINT(-73.94581 40.807475)',
|
||||
},
|
||||
{
|
||||
name: 'Supa Taco',
|
||||
location: 'POINT(-73.945826 40.80629)',
|
||||
},
|
||||
])
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="dart" label="Dart">
|
||||
|
||||
```dart
|
||||
await supabase.from('restaurants').insert([
|
||||
{
|
||||
'name': 'Supa Burger',
|
||||
'location': 'POINT(-73.946823 40.807416)',
|
||||
},
|
||||
{
|
||||
'name': 'Supa Pizza',
|
||||
'location': 'POINT(-73.94581 40.807475)',
|
||||
},
|
||||
{
|
||||
'name': 'Supa Taco',
|
||||
'location': 'POINT(-73.945826 40.80629)',
|
||||
},
|
||||
]);
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
Notice the order in which you pass the latitude and longitude. Longitude comes first, and is because longitude represents the x-axis of the location. Another thing to watch for is when inserting data from the client library, there is no comma between the two values, just a single space.
|
||||
|
||||
At this point, if you go into your Supabase dashboard and look at the data, you will notice that the value of the `location` column looks something like this.
|
||||
|
||||
```
|
||||
0101000020E6100000A4DFBE0E9C91614044FAEDEBC0494240
|
||||
```
|
||||
|
||||
We can query the `restaurants` table directly, but it will return the `location` column in the format you see above. We will create [database functions](https://supabase.com/docs/guides/database/functions) so that we can use the [st_astext()](https://postgis.net/docs/ST_AsText.html) function to convert it back to a human-readable format like `POINT(-73.946713 40.807313)`.
|
||||
|
||||
### Order by distance
|
||||
|
||||
Sorting datasets from closest to farthest, sometimes called nearest-neighbor sort, is a very common use case in Geo-queries. PostGIS can handle it very easily with the use of the [`<->`](https://postgis.net/docs/geometry_distance_knn.html) operator. `<->` operator returns the two-dimensional distance between two geometries and will utilize the spatial index when used within `order by` clause. You can create the following database function to sort the restaurants from closest to farthest by passing the current locations as parameters.
|
||||
|
||||
```sql
|
||||
create or replace function nearby_restaurants(lat float, long float)
|
||||
returns setof record
|
||||
language sql
|
||||
as $$
|
||||
select id, name, st_astext(location) as location, st_distance(location, st_point(long, lat)::geography) as dist_meters
|
||||
from public.restaurants
|
||||
order by location <-> st_point(long, lat)::geography;
|
||||
$$;
|
||||
```
|
||||
|
||||
You can call this function from your client using `rpc()` like this:
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="js"
|
||||
>
|
||||
<TabPanel id="js" label="JavaScript">
|
||||
|
||||
```js
|
||||
const { data, error } = await supabase.rpc('nearby_restaurants', {
|
||||
lat: 40.807313,
|
||||
long: -73.946713,
|
||||
})
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="dart" label="Dart">
|
||||
|
||||
```dart
|
||||
final data = await supabase.rpc('nearby_restaurants',params: {
|
||||
'lat': 40.807313,
|
||||
'long': -73.946713,
|
||||
});
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="result" label="Result">
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Supa Burger",
|
||||
"location": "POINT(-73.946823 40.807416)",
|
||||
"dist_meters": 14.73033739
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Supa Pizza",
|
||||
"location": "POINT(-73.94581 40.807475)",
|
||||
"dist_meters": 78.28980007
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Supa Taco",
|
||||
"location": "POINT(-73.945826 40.80629)",
|
||||
"dist_meters": 136.04329002
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
### Finding all data points within a bounding box
|
||||
|
||||

|
||||
|
||||
When you are working on a map-based application where the user scrolls through your map, you might want to load the that lies within the bounding box of the map every time your users scroll. PostGIS can return the rows that are within the bounding box just by supplying the bottom left and the top right coordinates. Let’s look at what the function would look like.
|
||||
|
||||
```sql
|
||||
create or replace function restaurants_in_view(min_lat float, min_long float, max_lat float, max_long float)
|
||||
returns setof record
|
||||
language sql
|
||||
as $$
|
||||
select id, name, st_astext(location) as location
|
||||
from public.restaurants
|
||||
where location && ST_SetSRID(ST_MakeBox2D(ST_Point(min_long, min_lat), ST_Point(max_long, max_lat)),4326)
|
||||
$$;
|
||||
```
|
||||
|
||||
[`&&`](https://postgis.net/docs/geometry_overlaps.html) operator used in the `where` statement here returns a boolean of whether the bounding box of the two geometries intersect or not. We basically are creating a bounding box from the two points and finding those points that fall under the bounding box. We are also utilizing a few different PostGIS functions here.
|
||||
|
||||
- [ST_MakeBox2D](https://postgis.net/docs/ST_MakeBox2D.html): Creates a 2-dimensional box from two points.
|
||||
- [ST_SetSRID](https://postgis.net/docs/ST_SetSRID.html): Sets the [SRID](https://postgis.net/docs/manual-dev/using_postgis_dbmanagement.html#spatial_ref_sys), which is an identifier of what coordinate system to use, for the geometry. 4326 the standard longitude and latitude coordinate systems.
|
||||
|
||||
You can call this function from your client using `rpc()` like this:
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="js"
|
||||
>
|
||||
<TabPanel id="js" label="JavaScript">
|
||||
|
||||
```js
|
||||
const { data, error } = await supabase.rpc('restaurants_in_view', {
|
||||
min_lat: 40.807,
|
||||
min_long: -73.946,
|
||||
max_lat: 40.808,
|
||||
max_long: -73.945,
|
||||
})
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="dart" label="Dart">
|
||||
|
||||
```dart
|
||||
final data = await supabase.rpc('restaurants_in_view', params: {
|
||||
'min_lat': 40.807,
|
||||
'min_long': -73.946,
|
||||
'max_lat': 40.808,
|
||||
'max_long': -73.945,
|
||||
});
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="result" label="Result">
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Supa Pizza",
|
||||
"location": "POINT(-73.94581 40.807475)"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
## Resources
|
||||
|
||||
- [Official PostGIS documentation](https://postgis.net/documentation/)
|
||||
|
||||
export const Page = ({ children }) => <Layout meta={meta} children={children} />
|
||||
|
||||
export default Page
|
||||
@@ -108,8 +108,7 @@ const { data, error } = await supabase.from('books').select().eq('title', 'Harry
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.eq('title', 'Harry')
|
||||
.execute();
|
||||
.eq('title', 'Harry');
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -146,8 +145,7 @@ const { data, error } = await supabase.from('books').select().textSearch('title'
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('title', "'Harry'")
|
||||
.execute();
|
||||
.textSearch('title', "'Harry'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -191,8 +189,7 @@ const { data, error } = await supabase.from('books').select().textSearch('descri
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('description', "'big'")
|
||||
.execute();
|
||||
.textSearch('description', "'big'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -278,8 +275,7 @@ const { data, error } = await supabase
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('description', "'little' & 'big'")
|
||||
.execute();
|
||||
.textSearch('description', "'little' & 'big'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -331,8 +327,7 @@ const { data, error } = await supabase
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('description', "'little' | 'big'")
|
||||
.execute();
|
||||
.textSearch('description', "'little' | 'big'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -430,8 +425,7 @@ const { data, error } = await supabase.from('books').select().textSearch('fts',
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('fts', "'little' & 'big'")
|
||||
.execute();
|
||||
.textSearch('fts', "'little' & 'big'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -488,8 +482,7 @@ const { data, error } = await supabase
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('description', "'big' <-> 'dreams'")
|
||||
.execute();
|
||||
.textSearch('description', "'big' <-> 'dreams'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -531,8 +524,7 @@ const { data, error } = await supabase
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('description', "'year' <2> 'school'")
|
||||
.execute();
|
||||
.textSearch('description', "'year' <2> 'school'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
@@ -577,8 +569,7 @@ const { data, error } = await supabase
|
||||
final result = await client
|
||||
.from('books')
|
||||
.select()
|
||||
.textSearch('description', "'big' & !'little'")
|
||||
.execute();
|
||||
.textSearch('description', "'big' & !'little'");
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
import Layout from '~/layouts/DefaultGuideLayout'
|
||||
import StepHikeCompact from '~/components/StepHikeCompact'
|
||||
|
||||
export const meta = {
|
||||
title: 'Use Supabase with Flutter',
|
||||
subtitle:
|
||||
'Learn how to create a Supabase project, add some sample data to your database, and query the data from a Flutter app.',
|
||||
breadcrumb: 'Framework Quickstarts',
|
||||
}
|
||||
|
||||
<StepHikeCompact>
|
||||
|
||||
<StepHikeCompact.Step step={1}>
|
||||
<StepHikeCompact.Details title="Set up a Supabase project with sample data">
|
||||
|
||||
[Create a new project](https://app.supabase.com) in the Supabase Dashboard.
|
||||
|
||||
After your project is ready, create a table in your Supabase database using the [SQL Editor](https://app.supabase.com/project/_/sql) in the Dashboard. Use the following SQL statement to create a `countries` table with some sample data.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
|
||||
<StepHikeCompact.Code>
|
||||
|
||||
```sql SQL_EDITOR
|
||||
-- Create the table
|
||||
CREATE TABLE countries (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL
|
||||
);
|
||||
-- Insert some sample data into the table
|
||||
INSERT INTO countries (name) VALUES ('United States');
|
||||
INSERT INTO countries (name) VALUES ('Canada');
|
||||
INSERT INTO countries (name) VALUES ('Mexico');
|
||||
````
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={2}>
|
||||
|
||||
<StepHikeCompact.Details title="Create a Flutter app">
|
||||
|
||||
Create a Flutter app using the `flutter create` command. You can skip this step if you already have a working app.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
|
||||
<StepHikeCompact.Code>
|
||||
|
||||
```bash Terminal
|
||||
flutter create my_app
|
||||
```
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={3}>
|
||||
|
||||
<StepHikeCompact.Details title="Install the Supabase client library">
|
||||
|
||||
The fastest way to get started is to use the [`supabase_flutter`](https://pub.dev/packages/supabase_flutter) client library which provides a convenient interface for working with Supabase from a Flutter app.
|
||||
|
||||
Open the `pubspec.yaml` file inside your Flutter app and add `supabase_flutter` as a dependency.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
|
||||
<StepHikeCompact.Code>
|
||||
|
||||
```yaml pubspec.yaml
|
||||
supabase_flutter: ^1.2.2
|
||||
```
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={4}>
|
||||
|
||||
<StepHikeCompact.Details title="Initialize the Supabase client">
|
||||
|
||||
Open `lib/main.dart` and edit the main function to initialize Supabase using your [project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api).
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
|
||||
<StepHikeCompact.Code>
|
||||
|
||||
```dart lib/main.dart
|
||||
import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
await Supabase.initialize(
|
||||
url: 'YOUR_SUPABASE_URL',
|
||||
anonKey: 'YOUR_SUPABASE_ANON_KEY',
|
||||
);
|
||||
runApp(MyApp());
|
||||
}
|
||||
```
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={5}>
|
||||
|
||||
<StepHikeCompact.Details title="Query data from the app">
|
||||
|
||||
Use a `FutureBuilder` to fetch the data when the home page loads and display the query result in a `ListView`.
|
||||
|
||||
Replace the default `MyApp` and `MyHomePage` classes with the following code.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
|
||||
<StepHikeCompact.Code>
|
||||
|
||||
```dart lib/main.dart
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const MaterialApp(
|
||||
title: 'Countries',
|
||||
home: HomePage(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HomePage extends StatefulWidget {
|
||||
const HomePage({super.key});
|
||||
|
||||
@override
|
||||
State<HomePage> createState() => _HomePageState();
|
||||
}
|
||||
|
||||
class _HomePageState extends State<HomePage> {
|
||||
final _future = Supabase.instance.client
|
||||
.from('countries')
|
||||
.select<List<Map<String, dynamic>>>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: FutureBuilder<List<Map<String, dynamic>>>(
|
||||
future: _future,
|
||||
builder: (context, snapshot) {
|
||||
if (!snapshot.hasData) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
final countries = snapshot.data!;
|
||||
return ListView.builder(
|
||||
itemCount: countries.length,
|
||||
itemBuilder: ((context, index) {
|
||||
final country = countries[index];
|
||||
return ListTile(
|
||||
title: Text(country['name']),
|
||||
);
|
||||
}),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={6}>
|
||||
<StepHikeCompact.Details title="Start the app">
|
||||
|
||||
Run your app on a platform of your choosing! By default an app should launch in your web browser.
|
||||
|
||||
Note that `supabase_flutter` is compatible with web, iOS, Android, macOS, and Windows apps.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
|
||||
<StepHikeCompact.Code>
|
||||
|
||||
```bash Terminal
|
||||
flutter run
|
||||
```
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
</StepHikeCompact>
|
||||
|
||||
export const Page = ({ children }) => <Layout meta={meta} children={children} hideToc={true} />
|
||||
|
||||
export default Page
|
||||
@@ -3,7 +3,8 @@ import StepHikeCompact from '~/components/StepHikeCompact'
|
||||
|
||||
export const meta = {
|
||||
title: 'Use Supabase with NextJS',
|
||||
subtitle: 'Learn how to create a Supabase project, add some sample data to your database, and query the data from a NextJS app.',
|
||||
subtitle:
|
||||
'Learn how to create a Supabase project, add some sample data to your database, and query the data from a NextJS app.',
|
||||
breadcrumb: 'Framework Quickstarts',
|
||||
}
|
||||
|
||||
@@ -58,7 +59,7 @@ export const meta = {
|
||||
<StepHikeCompact.Details title="Install the Supabase client library">
|
||||
|
||||
The fastest way to get started is to use the `supabase-js` client library which provides a convenient interface for working with Supabase from a NextJS app.
|
||||
|
||||
|
||||
Navigate to the NextJS app and install `supabase-js`.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
@@ -85,7 +86,7 @@ export const meta = {
|
||||
```js lib/supabaseClient.js
|
||||
import { createClient } from '@supabase/supabase-js'
|
||||
|
||||
const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')
|
||||
export const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')
|
||||
```
|
||||
|
||||
</StepHikeCompact.Code>
|
||||
@@ -95,8 +96,8 @@ export const meta = {
|
||||
<StepHikeCompact.Step step={5}>
|
||||
<StepHikeCompact.Details title="Query data from the app">
|
||||
|
||||
Use a `getInitialProps` method to fetch the data when the page loads and display the query result as a simple list.
|
||||
|
||||
Use the `getServerSideProps` method to fetch the data server-side and display the query result as a simple list.
|
||||
|
||||
Replace the existing function in your index file in the `pages` directory with the following code.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
@@ -116,11 +117,13 @@ export const meta = {
|
||||
);
|
||||
}
|
||||
|
||||
Page.getInitialProps = async () => {
|
||||
const { data, error } = await supabase.from('countries').select()
|
||||
export async function getServerSideProps() {
|
||||
let { data } = await supabase.from('countries').select()
|
||||
|
||||
return {
|
||||
countries: data
|
||||
props: {
|
||||
countries: data
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,8 @@ import StepHikeCompact from '~/components/StepHikeCompact'
|
||||
|
||||
export const meta = {
|
||||
title: 'Use Supabase with React',
|
||||
subtitle: 'Learn how to create a Supabase project, add some sample data to your database, and query the data from a React app.',
|
||||
subtitle:
|
||||
'Learn how to create a Supabase project, add some sample data to your database, and query the data from a React app.',
|
||||
breadcrumb: 'Framework Quickstarts',
|
||||
}
|
||||
|
||||
@@ -58,7 +59,7 @@ export const meta = {
|
||||
<StepHikeCompact.Details title="Install the Supabase client library">
|
||||
|
||||
The fastest way to get started is to use the `supabase-js` client library which provides a convenient interface for working with Supabase from a React app.
|
||||
|
||||
|
||||
Navigate to the React app and install `supabase-js`.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
@@ -73,11 +74,11 @@ export const meta = {
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={5}>
|
||||
<StepHikeCompact.Step step={4}>
|
||||
<StepHikeCompact.Details title="Query data from the app">
|
||||
|
||||
In `index.js`, create a Supabase client using your [Project URL and public API (anon) key](https://app.supabase.com/project/_/settings/api).
|
||||
|
||||
|
||||
Add a `getCountries` function to fetch the data and log the query result to the browser console.
|
||||
|
||||
</StepHikeCompact.Details>
|
||||
@@ -90,7 +91,7 @@ export const meta = {
|
||||
const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')
|
||||
|
||||
async function getCountries() {
|
||||
const countries = await supabase.from('countries').select('*')
|
||||
const countries = await supabase.from('countries').select()
|
||||
console.log(countries)
|
||||
}
|
||||
|
||||
@@ -101,7 +102,7 @@ export const meta = {
|
||||
|
||||
</StepHikeCompact.Step>
|
||||
|
||||
<StepHikeCompact.Step step={6}>
|
||||
<StepHikeCompact.Step step={5}>
|
||||
<StepHikeCompact.Details title="Start the app">
|
||||
|
||||
Start the app, go to http://localhost:3000 in a browser, and open the browser console and you should see the list of countries.
|
||||
|
||||
@@ -129,6 +129,7 @@ Wrap your `pages/_app.tsx` component with the `SessionContextProvider` component
|
||||
import { useState } from 'react'
|
||||
import { createBrowserSupabaseClient } from '@supabase/auth-helpers-nextjs'
|
||||
import { SessionContextProvider, Session } from '@supabase/auth-helpers-react'
|
||||
import { AppProps } from 'next/app'
|
||||
|
||||
function MyApp({
|
||||
Component,
|
||||
|
||||
@@ -56,8 +56,7 @@ import { env } from '$env/dynamic/public'
|
||||
export const supabase = createClient(env.PUBLIC_SUPABASE_URL, env.PUBLIC_SUPABASE_ANON_KEY)
|
||||
```
|
||||
|
||||
And one optional step is to update the CSS file `public/global.css` to make the app look nice.
|
||||
You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css).
|
||||
Optionally, update `src/routes/style.css` with the [CSS from the example](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css).
|
||||
|
||||
### Supabase Auth Helpers
|
||||
|
||||
|
||||
@@ -0,0 +1,572 @@
|
||||
import Layout from '~/layouts/DefaultGuideLayout'
|
||||
|
||||
export const meta = {
|
||||
id: 'picket',
|
||||
title: 'Picket',
|
||||
description:
|
||||
"Get the best of web2 and web3. Picket allows your users to log in with their wallet without sacrificing Supabase's awesome data management and security features.",
|
||||
}
|
||||
|
||||
[Picket](https://picketapi.com) is a developer-first, multi-chain web3 auth platform. With Picket, you can easily authenticate users via their wallets and token gate anything.
|
||||
|
||||
This guide steps through building a simple todo list Next.js application with Picket and Supabase. We use Picket to allow users to login into our app with their wallets and leverage Supabase's Row Level Security (RLS) to securely store user information off-chain.
|
||||
|
||||
> Checkout a [live demo](https://picket-supabase-auth-example-v36z.vercel.app/) of a Picket + Supabase integration
|
||||
|
||||
The code for this guide is based of [this example repo](https://github.com/picketapi/picket-supabase-auth-example).
|
||||
|
||||
## Requirements
|
||||
|
||||
- You have [Supabase](https://supabase.com) account. If you don't, sign up at https://supabase.com/
|
||||
- You have a [Picket](https://picketapi.com) account. If you don't, sign up at https://picketapi.com/
|
||||
- You've read the [Picket Setup Guide](https://docs.picketapi.com/picket-docs/quick-start-guides/quick-start-guides/start-here-setup)
|
||||
- Familiarity with [React](https://reactjs.org/) and [Next.js](https://nextjs.org/)
|
||||
|
||||
## Step 1: Create a Picket Project
|
||||
|
||||
First, we'll create a new project in our [Picket dashboard](https://picketapi.com/dashboard).
|
||||
|
||||
Click the `Create New Project` button at the top of the Projects section on your [Picket dashboard](https://picketapi.com/dashboard). Edit the project to give it a memorable name.
|
||||
|
||||

|
||||
|
||||
We're done for now! We'll revisit this project when we are setting up environment variables in our app.
|
||||
|
||||
## Step 2: Create a Supabase Project
|
||||
|
||||
From your [Supabase dashboard](https://app.supabase.com/), click `New project`.
|
||||
|
||||
Enter a `Name` for your Supabase project.
|
||||
|
||||
Enter a secure `Database Password`.
|
||||
|
||||
Select the any `Region`.
|
||||
|
||||
Click `Create new project`.
|
||||
|
||||

|
||||
|
||||
## Step 3: Create new New Table with RLS in Supabase
|
||||
|
||||
### Create a `todos` Table
|
||||
|
||||
From the sidebar menu in the [Supabase dashboard](https://app.supabase.com/), click `Table editor`, then `New table`.
|
||||
|
||||
Enter `todos` as the `Name` field.
|
||||
|
||||
Select `Enable Row Level Security (RLS)`.
|
||||
|
||||
Create four columns:
|
||||
|
||||
- `name` as `text`
|
||||
- `wallet_address` as `text`
|
||||
- `completed` as `bool` with the default value `false`
|
||||
- `created_at` as timestamptz with a default value of `now()`
|
||||
|
||||
Click `Save` to create the new table.
|
||||
|
||||

|
||||
|
||||
### Setup Row Level Security (RLS)
|
||||
|
||||
Now we want to make sure that only the `todos` owner, the user's `wallet_address`, can access their todos. The key component of the this RLS policy is the expression
|
||||
|
||||
```sql
|
||||
((jwt() ->> 'walletAddress'::text) = wallet_address)
|
||||
```
|
||||
|
||||
This expression checks that the wallet address in the requesting JWT access token is the same as the `wallet_address` in the `todos` table.
|
||||
|
||||

|
||||
|
||||
## Step 4: Create a Next.js app
|
||||
|
||||
Now, let's start building!
|
||||
|
||||
Create a [new Typescript Next.js app](https://nextjs.org/docs/getting-started)
|
||||
|
||||
```bash
|
||||
npx create-next-app@latest --typescript
|
||||
```
|
||||
|
||||
Create a `.env.local` file and enter the following values
|
||||
|
||||
- `NEXT_PUBLIC_PICKET_PUBLISHABLE_KEY` => Copy the publishable key from the Picket project you created in step 1
|
||||
- `PICKET_PROJECT_SECRET_KEY` => Copy the secret key from the Picket project you created in the step 1
|
||||
- `NEXT_PUBLIC_SUPABASE_URL` => You can find this URL under "Settings > API" in your Supabase project
|
||||
- `NEXT_PUBLIC_SUPABASE_ANON_KEY` => You can find this project API key under "Settings > API" in your Supabase project
|
||||
- `SUAPBASE_JWT_SECRET`=> You can find this secret under "Settings > API" in your Supabase project
|
||||
|
||||
```txt
|
||||
NEXT_PUBLIC_PICKET_PUBLISHABLE_KEY="YOUR_PICKET_PUBLISHABLE_KEY"
|
||||
PICKET_PROJECT_SECRET_KEY="YOUR_PICKET_PROJECT_SECRET_KEY"
|
||||
NEXT_PUBLIC_SUPABASE_URL="YOUR_SUPABASE_URL"
|
||||
NEXT_PUBLIC_SUPABASE_ANON_KEY="YOUR_SUPABASE_ANON_KEY"
|
||||
SUPABASE_JWT_SECRET="YOUR_SUPABASE_JWT_SECRET"
|
||||
```
|
||||
|
||||
## Step 5: Setup Picket for Wallet Login
|
||||
|
||||
> For more information on how to setup [Picket](https://picketapi.com) in your Next.js app, checkout the [Picket getting started guide](https://docs.picketapi.com/picket-docs/quick-start-guides/quick-start-guides/wallet-login)
|
||||
> After initializing our app, we can setup Picket.
|
||||
|
||||
Install the Picket [React](/picket-docs/reference/libraries-and-sdks/react-sdk-picket-react) and [Node](/picket-docs/reference/libraries-and-sdks/node.js-library-picket-node) libraries
|
||||
|
||||
```bash
|
||||
npm i @picketapi/picket-react @picketapi/picket-node
|
||||
```
|
||||
|
||||
Update `pages/_app.tsx` to setup the `PicketProvider`
|
||||
|
||||
```tsx
|
||||
import '../styles/globals.css'
|
||||
import type { AppProps } from 'next/app'
|
||||
|
||||
import { PicketProvider } from '@picketapi/picket-react'
|
||||
|
||||
export default function App({ Component, pageProps }: AppProps) {
|
||||
return (
|
||||
<PicketProvider apiKey={process.env.NEXT_PUBLIC_PICKET_PUBLISHABLE_KEY!}>
|
||||
<Component {...pageProps} />
|
||||
</PicketProvider>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
Update `pages/index.tsx` to let users log in and out with their wallet
|
||||
|
||||
```tsx
|
||||
import { GetServerSideProps } from 'next'
|
||||
import { useRouter } from 'next/router'
|
||||
import { useCallback } from 'react'
|
||||
|
||||
import styles from '../styles/Home.module.css'
|
||||
|
||||
import { usePicket } from '@picketapi/picket-react'
|
||||
import { cookieName } from '../utils/supabase'
|
||||
|
||||
type Props = {
|
||||
loggedIn: boolean
|
||||
}
|
||||
|
||||
export default function Home(props: Props) {
|
||||
const { loggedIn } = props
|
||||
const { login, logout, authState } = usePicket()
|
||||
const router = useRouter()
|
||||
|
||||
const handleLogin = useCallback(async () => {
|
||||
let auth = authState
|
||||
// no need to re-login if they've already connected with Picket
|
||||
if (!auth) {
|
||||
// login with Picket
|
||||
auth = await login()
|
||||
}
|
||||
|
||||
// login failed
|
||||
if (!auth) return
|
||||
|
||||
// create a corresponding supabase access token
|
||||
await fetch('/api/login', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
accessToken: auth.accessToken,
|
||||
}),
|
||||
})
|
||||
// redirect to their todos page
|
||||
router.push('/todos')
|
||||
}, [authState, login, router])
|
||||
|
||||
const handleLogout = useCallback(async () => {
|
||||
// clear both picket and supabase session
|
||||
await logout()
|
||||
await fetch('/api/logout', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
})
|
||||
// refresh the page
|
||||
router.push('/')
|
||||
}, [logout, router])
|
||||
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<main className={styles.main}>
|
||||
{loggedIn ? (
|
||||
<button onClick={handleLogout}>Log Out to Switch Wallets</button>
|
||||
) : (
|
||||
<button onClick={handleLogin}>Log In with Your Wallet</button>
|
||||
)}
|
||||
</main>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export const getServerSideProps: GetServerSideProps<Props> = async ({ req }) => {
|
||||
// get supabase token server-side
|
||||
const accessToken = req.cookies[cookieName]
|
||||
|
||||
if (!accessToken) {
|
||||
return {
|
||||
props: {
|
||||
loggedIn: false,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
props: {
|
||||
loggedIn: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Step 6: Issue a Supabase JWT on Wallet Login
|
||||
|
||||
Great, now we have setup a typical Picket Next.js app. Next, we need to implement the log in/out API routes to allow users to securely query our Supabase project.
|
||||
|
||||
First, install dependencies
|
||||
|
||||
```bash
|
||||
npm install @supabase/supabase-js jsonwebtoken cookie js-cookie
|
||||
```
|
||||
|
||||
Create a utility function to create a Supabase client with a custom access token in `utils/supabase.ts`
|
||||
|
||||
```ts
|
||||
import { createClient, SupabaseClientOptions } from '@supabase/supabase-js'
|
||||
|
||||
export const cookieName = 'sb-access-token'
|
||||
|
||||
const getSupabase = (accessToken: string) => {
|
||||
const options: SupabaseClientOptions<'public'> = {}
|
||||
|
||||
if (accessToken) {
|
||||
options.global = {
|
||||
headers: {
|
||||
// This gives Supabase information about the user (wallet) making the request
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const supabase = createClient(
|
||||
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
||||
options
|
||||
)
|
||||
|
||||
return supabase
|
||||
}
|
||||
|
||||
export { getSupabase }
|
||||
```
|
||||
|
||||
Create new api route `pages/api/login.ts`. This route validates the Picket access token then issues another equivalent Supabase access token for us to use with the Supabase client.
|
||||
|
||||
```ts
|
||||
import type { NextApiRequest, NextApiResponse } from 'next'
|
||||
import jwt from 'jsonwebtoken'
|
||||
import cookie from 'cookie'
|
||||
import Picket from '@picketapi/picket-node'
|
||||
|
||||
import { cookieName } from '../../utils/supabase'
|
||||
|
||||
// create picket node client with your picket secret api key
|
||||
const picket = new Picket(process.env.PICKET_PROJECT_SECRET_KEY!)
|
||||
|
||||
const expToExpiresIn = (exp: number) => exp - Math.floor(Date.now() / 1000)
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
const { accessToken } = req.body
|
||||
// omit expiration time,.it will conflict with jwt.sign
|
||||
const { exp, ...payload } = await picket.validate(accessToken)
|
||||
const expiresIn = expToExpiresIn(exp)
|
||||
|
||||
const supabaseJWT = jwt.sign(
|
||||
{
|
||||
...payload,
|
||||
},
|
||||
process.env.SUPABASE_JWT_SECRET!,
|
||||
{
|
||||
expiresIn,
|
||||
}
|
||||
)
|
||||
|
||||
// Set a new cookie with the name
|
||||
res.setHeader(
|
||||
'Set-Cookie',
|
||||
cookie.serialize(cookieName, supabaseJWT, {
|
||||
path: '/',
|
||||
secure: process.env.NODE_ENV !== 'development',
|
||||
// allow the cookie to be accessed client-side
|
||||
httpOnly: false,
|
||||
sameSite: 'strict',
|
||||
maxAge: expiresIn,
|
||||
})
|
||||
)
|
||||
res.status(200).json({})
|
||||
}
|
||||
```
|
||||
|
||||
And now create an equivalent logout api route `/pages/api/logout.ts` to delete the Supabase access token cookie.
|
||||
|
||||
```ts
|
||||
import type { NextApiRequest, NextApiResponse } from 'next'
|
||||
import cookie from 'cookie'
|
||||
|
||||
import { cookieName } from '../../utils/supabase'
|
||||
|
||||
export default async function handler(_req: NextApiRequest, res: NextApiResponse) {
|
||||
// Clear the supabase cookie
|
||||
res.setHeader(
|
||||
'Set-Cookie',
|
||||
cookie.serialize(cookieName, '', {
|
||||
path: '/',
|
||||
maxAge: -1,
|
||||
})
|
||||
)
|
||||
|
||||
res.status(200).json({})
|
||||
}
|
||||
```
|
||||
|
||||
We can now login and logout to the app with our wallet!
|
||||
|
||||
## Step 7: Interacting with Data in Supabase
|
||||
|
||||
Now that we can login to the app, it's time to start interacting with Supabase. Let's make a todo list page for authenticated users.
|
||||
|
||||
Create a new file `pages/todos.tsx`
|
||||
|
||||
```tsx
|
||||
import { GetServerSideProps } from 'next'
|
||||
import Head from 'next/head'
|
||||
import Link from 'next/link'
|
||||
import { useState, useMemo } from 'react'
|
||||
import jwt from 'jsonwebtoken'
|
||||
import Cookies from 'js-cookie'
|
||||
|
||||
import styles from '../styles/Home.module.css'
|
||||
|
||||
import { getSupabase, cookieName } from '../utils/supabase'
|
||||
|
||||
type Todo = {
|
||||
name: string
|
||||
completed: boolean
|
||||
}
|
||||
|
||||
type Props = {
|
||||
walletAddress: string
|
||||
todos: Todo[]
|
||||
}
|
||||
|
||||
const displayWalletAddress = (walletAddress: string) =>
|
||||
`${walletAddress.slice(0, 6)}...${walletAddress.slice(-4)}`
|
||||
|
||||
export default function Todos(props: Props) {
|
||||
const { walletAddress } = props
|
||||
const [todos, setTodos] = useState(props.todos)
|
||||
|
||||
// avoid re-creating supabase client every render
|
||||
const supabase = useMemo(() => {
|
||||
const accessToken = Cookies.get(cookieName)
|
||||
return getSupabase(accessToken || '')
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<Head>
|
||||
<title>Picket 💜 Supabase</title>
|
||||
</Head>
|
||||
|
||||
<main className={styles.main}>
|
||||
<h1 className={styles.title}>Your Personal Todo List</h1>
|
||||
<div
|
||||
style={{
|
||||
maxWidth: '600px',
|
||||
textAlign: 'left',
|
||||
fontSize: '1.125rem',
|
||||
margin: '36px 0 24px 0',
|
||||
}}
|
||||
>
|
||||
<p>Welcome {displayWalletAddress(walletAddress)},</p>
|
||||
<p>
|
||||
Your todo list is stored in Supabase and are only accessible to you and your wallet
|
||||
address. Picket + Supabase makes it easy to build scalable, hybrid web2 and web3 apps.
|
||||
Use Supabase to store non-critical or private data off-chain like user app preferences
|
||||
or todo lists.
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
textAlign: 'left',
|
||||
fontSize: '1.125rem',
|
||||
}}
|
||||
>
|
||||
<h2>Todo List</h2>
|
||||
{todos.map((todo) => (
|
||||
<div
|
||||
key={todo.name}
|
||||
style={{
|
||||
margin: '8px 0',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={todo.completed}
|
||||
onChange={async () => {
|
||||
await supabase.from('todos').upsert({
|
||||
wallet_address: walletAddress,
|
||||
name: todo.name,
|
||||
completed: !todo.completed,
|
||||
})
|
||||
setTodos((todos) =>
|
||||
todos.map((t) => (t.name === todo.name ? { ...t, completed: !t.completed } : t))
|
||||
)
|
||||
}}
|
||||
/>
|
||||
<span
|
||||
style={{
|
||||
margin: '0 0 0 8px',
|
||||
}}
|
||||
>
|
||||
{todo.name}
|
||||
</span>
|
||||
</div>
|
||||
))}
|
||||
<div
|
||||
style={{
|
||||
margin: '24px 0',
|
||||
}}
|
||||
>
|
||||
<Link
|
||||
href={'/'}
|
||||
style={{
|
||||
textDecoration: 'underline',
|
||||
}}
|
||||
>
|
||||
Go back home →
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export const getServerSideProps: GetServerSideProps<Props> = async ({ req }) => {
|
||||
// example of fetching data server-side
|
||||
const accessToken = req.cookies[cookieName]
|
||||
|
||||
// require authentication
|
||||
if (!accessToken) {
|
||||
return {
|
||||
redirect: {
|
||||
destination: '/',
|
||||
},
|
||||
props: {
|
||||
walletAddress: '',
|
||||
todos: [],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// check if logged in user has completed the tutorial
|
||||
const supabase = getSupabase(accessToken)
|
||||
const { walletAddress } = jwt.decode(accessToken) as {
|
||||
walletAddress: string
|
||||
}
|
||||
|
||||
// get todos for the users
|
||||
// if none exist, create the default todos
|
||||
let { data } = await supabase.from('todos').select('*')
|
||||
|
||||
if (!data || data.length === 0) {
|
||||
let error = null
|
||||
;({ data, error } = await supabase
|
||||
.from('todos')
|
||||
.insert([
|
||||
{
|
||||
wallet_address: walletAddress,
|
||||
name: 'Complete the Picket + Supabase Tutorial',
|
||||
completed: true,
|
||||
},
|
||||
{
|
||||
wallet_address: walletAddress,
|
||||
name: 'Create a Picket Account (https://picketapi.com/)',
|
||||
completed: false,
|
||||
},
|
||||
{
|
||||
wallet_address: walletAddress,
|
||||
name: 'Read the Picket Docs (https://docs.picketapi.com/)',
|
||||
completed: false,
|
||||
},
|
||||
{
|
||||
wallet_address: walletAddress,
|
||||
name: 'Build an Awesome Web3 Experience',
|
||||
completed: false,
|
||||
},
|
||||
])
|
||||
.select('*'))
|
||||
|
||||
if (error) {
|
||||
// log error and redirect home
|
||||
console.error(error)
|
||||
return {
|
||||
redirect: {
|
||||
destination: '/',
|
||||
},
|
||||
props: {
|
||||
walletAddress: '',
|
||||
todos: [],
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
props: {
|
||||
walletAddress,
|
||||
todos: data as Todo[],
|
||||
},
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This is a long file, but don't be intimidated. The page is actually straightforward. It
|
||||
|
||||
1. Verifies server-side that the user is authenticated and if they are not redirects them to the homepage
|
||||
2. Checks to see if they already have `todos` . If so, it returns them. If not, it initializes them for the users
|
||||
3. We render the `todos` and when the user selects or deselects a todo, we update the data in the database
|
||||
|
||||
## Step 8: Try it Out!
|
||||
|
||||
And that's it. If you haven't already, run your app to test it out yourself
|
||||
|
||||
```bash
|
||||
# start the app
|
||||
npm run dev
|
||||
# open http://localhost:3000
|
||||
```
|
||||
|
||||
### What's Next?
|
||||
|
||||
- Explore the [Picket documentation](https://docs.picketapi.com/picket-docs/)
|
||||
- Play with the live [Picket + Supabase demo](https://picket-supabase-auth-example-v36z.vercel.app/)
|
||||
- Checkout Picket's [example Github repositories](https://github.com/picketapi)
|
||||
|
||||
### Common Use-Case for Picket + Supabase
|
||||
|
||||
- Account linking. Allow users to associate their wallet address(es) with their existing web2 account in your app
|
||||
- Leverage Supabase's awesome libraries and ecosystem while still enabling wallet login
|
||||
- Store app-specific data, like user preferences, about your user's wallet adress off-chain
|
||||
- Cache on-chain data to improve your DApp's performance
|
||||
|
||||
export const Page = ({ children }) => <Layout meta={meta} children={children} />
|
||||
|
||||
export default Page
|
||||
@@ -13,7 +13,7 @@ In this guide we will build a simple expense tracker web application using Stytc
|
||||
|
||||
We will leverage Supabase to store and authorize access to user data. Supabase makes it simple to set up Row Level Security (RLS) policies which ensure users can only read and write data that they are authorized to do so. If you do not already have a Supabase account, you will need to create one.
|
||||
|
||||
This guide will use [Next.js](https://nextjs.org/) which is a web application framework built on top of React. Stytch provides a [Node.js library](https://github.com/stytchauth/stytch-node) and a [React library](https://github.com/stytchauth/stytch-react) which makes building Next.js apps super easy.
|
||||
This guide will use [Next.js](https://nextjs.org/) which is a web application framework built on top of React. Stytch provides a [Node.js library](https://github.com/stytchauth/stytch-node) and a [React library](https://stytch.com/docs/sdks/javascript-sdk) which makes building Next.js apps super easy.
|
||||
|
||||
> Note: You can find a completed version of this project on [Github](https://github.com/stytchauth/stytch-nextjs-supabase).
|
||||
|
||||
|
||||
@@ -8,18 +8,18 @@ export const meta = {
|
||||
|
||||
Every project on the Supabase Platform comes with its own dedicated Postgres instance running inside a virtual machine (VM). The following table describes the base instance with additional compute add-ons available if you need extra performance when scaling up Supabase.
|
||||
|
||||
| Plan | Pricing | CPU | Memory | Disk IO Bandwidth | Connections: Direct | Connections: Pooler |
|
||||
| --------------- | ------- | ----------------------- | ------ | ----------------- | ------------------- | -------------------- |
|
||||
| Free (Included) | $0 | 2-core ARM (shared) | 1 GB | Up to 2,606 Mbps | 10 (recommended) | 50 (recommended) |
|
||||
| Small | $5 | 2-core ARM (shared) | 2 GB | Up to 2,606 Mbps | 30 (recommended) | 75 (recommended) |
|
||||
| Medium | $50 | 2-core ARM (shared) | 4 GB | Up to 2,606 Mbps | 50 (recommended) | 150 (recommended) |
|
||||
| Large | $100 | 2-core ARM (dedicated) | 8 GB | Up to 4,750 Mbps | 100 (recommended) | 300 (recommended) |
|
||||
| XL | $200 | 4-core ARM (dedicated) | 16 GB | Up to 4,750 Mbps | 200 (recommended) | 600 (recommended) |
|
||||
| 2XL | $400 | 8-core ARM (dedicated) | 32 GB | Up to 4,750 Mbps | 350 (recommended) | 1200 (recommended) |
|
||||
| 4XL | $950 | 16-core ARM (dedicated) | 64 GB | Up to 4,750 Mbps | 420 (recommended) | 2800 (recommended) |
|
||||
| 8XL | $1,860 | 32-core ARM (dedicated) | 128 GB | Up to 9,000 Mbps | 450 (recommended) | 5600 (recommended) |
|
||||
| 12XL | $2,790 | 48-core ARM (dedicated) | 192 GB | Up to 13,500 Mbps | 480 (recommended) | 8600 (recommended) |
|
||||
| 16XL | $3,720 | 64-core ARM (dedicated) | 256 GB | Up to 19,000 Mbps | 500 (recommended) | 11,600 (recommended) |
|
||||
| Plan | Pricing | CPU | Memory | Maximum Disk IO Bandwidth | Baseline Disk IO Bandwidth | Connections: Direct (recommended) | Connections: Pooler (recommended) |
|
||||
| --------------- | ------- | ----------------------- | ------ | ------------------------- | -------------------------- | --------------------------------- | --------------------------------- |
|
||||
| Free (Included) | $0 | 2-core ARM (shared) | 1 GB | 2,606 Mbps | 87 Mbps | 10 | 50 |
|
||||
| Small | $5 | 2-core ARM (shared) | 2 GB | 2,606 Mbps | 174 Mbps | 30 | 75 |
|
||||
| Medium | $50 | 2-core ARM (shared) | 4 GB | 2,606 Mbps | 347 Mbps | 50 | 150 |
|
||||
| Large | $100 | 2-core ARM (dedicated) | 8 GB | 4,750 Mbps | 630 Mbps | 100 | 300 |
|
||||
| XL | $200 | 4-core ARM (dedicated) | 16 GB | 4,750 Mbps | 1,188 Mbps | 200 | 600 |
|
||||
| 2XL | $400 | 8-core ARM (dedicated) | 32 GB | 4,750 Mbps | 2,375 Mbps | 350 | 1200 |
|
||||
| 4XL | $950 | 16-core ARM (dedicated) | 64 GB | 4,750 Mbps | 4,750 Mbps | 420 | 2800 |
|
||||
| 8XL | $1,860 | 32-core ARM (dedicated) | 128 GB | 9,500 Mbps | 9,500 Mbps | 450 | 5600 |
|
||||
| 12XL | $2,790 | 48-core ARM (dedicated) | 192 GB | 14,250 Mbps | 14,250 Mbps | 480 | 8600 |
|
||||
| 16XL | $3,720 | 64-core ARM (dedicated) | 256 GB | 19,000 Mbps | 19,000 Mbps | 500 | 11,600 |
|
||||
|
||||
[Contact us](https://supabase.com/contact/enterprise) if you require a custom plan.
|
||||
|
||||
@@ -33,7 +33,9 @@ When considering compute upgrades, assess whether your bottlenecks are hardware-
|
||||
|
||||
## Disk IO bandwidth
|
||||
|
||||
Disk IO bandwidth can be measured in IOPS, a unit of measurement representing the number of input/output operations per second. These operations are calculated in Megabits per second. Depending on the read/write load of your application, you may need to upgrade to a larger instance capable of a higher number of IOPS. If you're unsure of how many IOPS your application requires, you can load test your project and inspect these [metrics in the Dashboard](https://app.supabase.com/project/_/reports). Alternatively, you can start on a smaller instance size and upgrade later as needed.
|
||||
SSD Disks are attached to your servers and the disk performance of your workload is determined by the Disk IO bandwidth of this connection. Smaller compute instances can burst up to the maximum disk IO bandwidth for 30 minutes in a day. Beyond that, the performance reverts to the baseline disk IO bandwidth. For example, the free tier can burst up to 2,606 Mbps for 30 minutes a day and reverts to the baseline performance of 87 Mbps. If you need consistent disk performance, choose the 4XL or larger compute add-on which has the same baseline and maximum disk IO bandwidth.
|
||||
|
||||
If you're unsure of how many IOPS your application requires, you can load test your project and inspect these [metrics in the Dashboard](https://app.supabase.com/project/_/reports). If the `Daily Disk IO Budget % Remaining` stat is less than 100%, it indicates that your workload has burst beyond the baseline IO throughput during the day. If this metric drops to zero, the workload has used up all the burst IO throughput minutes during the day and is running at the baseline performance. These projects are good candidates for upgrading to a larger compute add with higher baseline throughput.
|
||||
|
||||
export const Page = ({ children }) => <Layout meta={meta} children={children} />
|
||||
|
||||
|
||||
@@ -11,16 +11,15 @@ export const meta = {
|
||||
|
||||
<h2 className="text-base max-w-xl m-0">
|
||||
Supabase is an open source Firebase alternative providing all the backend features you need to
|
||||
build a product. [Learn more](/docs/guides/getting-started/architecture) about Supabase, start
|
||||
with the [tutorials](/docs/guides/getting-started#tutorials), or dive straight into the different
|
||||
products and APIs.
|
||||
build a product. [Learn more](/docs/guides/getting-started/architecture) about Supabase, follow a
|
||||
quickstart for an overview, or dive straight into the different products and APIs.
|
||||
</h2>
|
||||
|
||||
{/* start container */}
|
||||
|
||||
<div className="flex flex-col gap-12 my-12">
|
||||
|
||||
<div className="space-y-8 hidden">
|
||||
<div className="space-y-8">
|
||||
<div className="
|
||||
border border-scale-400
|
||||
relative overflow-hidden
|
||||
@@ -63,16 +62,21 @@ export const meta = {
|
||||
<Button size="small">Get started</Button>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 md:gap-6">
|
||||
<Link href={`/getting-started/quickstarts/reactjs`} passHref>
|
||||
<Link href={`/guides/getting-started/quickstarts/reactjs`} passHref>
|
||||
<a className="no-underline">
|
||||
<IconPanel title="ReactJS" icon="/docs/img/icons/react-icon" />
|
||||
</a>
|
||||
</Link>
|
||||
<Link href={`/getting-started/quickstarts/nextjs`} passHref>
|
||||
<Link href={`/guides/getting-started/quickstarts/nextjs`} passHref>
|
||||
<a className="no-underline">
|
||||
<IconPanel title="NextJS" icon="/docs/img/icons/nextjs-icon" />
|
||||
</a>
|
||||
</Link>
|
||||
<Link href={`/guides/getting-started/quickstarts/flutter`} passHref>
|
||||
<a className="no-underline">
|
||||
<IconPanel title="Flutter" icon="/docs/img/icons/flutter-icon" />
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -106,7 +110,7 @@ export const meta = {
|
||||
md:items-center md:gap-3
|
||||
">
|
||||
<h2 className="text-sm lg:text-base text-scale-1200 m-0">Ready to make a fully working app?</h2>
|
||||
<p className="text-sm lg:text-base text-scale-1100 m-0">Follow the step-by-step <Link href="/guides/tutorials"><a className="m-0 text-scale-1200 underline">tutorials</a></Link>.</p>
|
||||
<p className="text-sm lg:text-base text-scale-1100 m-0">Follow the step-by-step <Link href="/guides/getting-started#tutorials"><a className="m-0 text-scale-1200 underline">tutorials</a></Link>.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
After Width: | Height: | Size: 4.3 MiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 166 KiB |
@@ -8,6 +8,7 @@ author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e3
|
||||
authorURL: https://github.com/dragarcia
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '07-09-2020'
|
||||
---
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e3
|
||||
authorURL: https://github.com/dragarcia
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '07-07-2020'
|
||||
---
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e3
|
||||
authorURL: https://github.com/dragarcia
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '08-02-2020'
|
||||
---
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ authorURL: https://github.com/dragarcia
|
||||
image: postgres-views.png
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '11-18-2020'
|
||||
---
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ thumb: elephants.png
|
||||
tags:
|
||||
- sql
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '02-27-2021'
|
||||
---
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ image: supabase-postgres-cron.png
|
||||
thumb: supabase-postgres-cron.png
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '03-05-2021'
|
||||
---
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ image: postgres-hooks/og-postgres-hooks.jpg
|
||||
thumb: postgres-hooks/cover-postgres-hooks.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2021-07-02'
|
||||
---
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ image: supa-audit/postgres_auditing_in_150_lines_of_SQL.png
|
||||
thumb: supa-audit/postgres_auditing_in_150_lines_of_SQL.png
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-03-08'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -7,6 +7,7 @@ thumb: partial-dumps/og-partial-dumps-with-rls.png
|
||||
tags:
|
||||
- postgresql
|
||||
- data
|
||||
- planetpg
|
||||
date: '2022-06-28'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: seen-by/seen-by-postgresql-thumb.png
|
||||
thumb: seen-by/seen-by-postgresql-thumb.png
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-07-18'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: primary-keys/postgres-primary-key.jpg
|
||||
thumb: primary-keys/postgres-primary-key.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-09-08'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: postgres-wasm/postgres-wasm.jpg
|
||||
thumb: postgres-wasm/postgres-wasm.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-10-03'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: postgres-fts-vs-the-rest/postgres-full-text-search.jpg
|
||||
thumb: postgres-fts-vs-the-rest/postgres-full-text-search.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-10-14'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: what-is-postgres-commitfest/what-is-postgres-commitfest.jpg
|
||||
thumb: what-is-postgres-commitfest/what-is-postgres-commitfest.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-10-27'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: 2022-11-24-sql-nosql-postgresql/sql-nosql-postgresql.jpg
|
||||
thumb: 2022-11-24-sql-nosql-postgresql/sql-nosql-postgresql.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-11-24'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -6,6 +6,7 @@ image: transparent-column-encryption-with-postgres.jpg
|
||||
thumb: transparent-column-encryption-with-postgres.jpg
|
||||
tags:
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-12-01'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -7,6 +7,7 @@ thumb: lw6-community/pg15.png
|
||||
tags:
|
||||
- postgres
|
||||
- launch-week
|
||||
- planetpg
|
||||
date: '2022-12-16'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -8,6 +8,7 @@ tags:
|
||||
- graphql
|
||||
- postgres
|
||||
- launch-week
|
||||
- planetpg
|
||||
date: '2022-12-16'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -8,6 +8,7 @@ tags:
|
||||
- launch-week
|
||||
- postgres
|
||||
- backups
|
||||
- planetpg
|
||||
date: '2022-12-16'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -7,6 +7,7 @@ thumb: lw6-community/postgrest.png
|
||||
tags:
|
||||
- postgres
|
||||
- launch-week
|
||||
- planetpg
|
||||
date: '2022-12-16'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -8,6 +8,7 @@ tags:
|
||||
- launch-week
|
||||
- postgres
|
||||
- encryption
|
||||
- planetpg
|
||||
date: '2022-12-16'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
---
|
||||
title: 'Launch Week 6 Hackathon Winners'
|
||||
description: Announcing the winners of the Launch Week 6 Hackathon!
|
||||
author: andrew_smith,tyler_shukert
|
||||
image: lw6-hackathon-winners/hackathon-winners.png
|
||||
thumb: lw6-hackathon-winners/hackathon-winners.png
|
||||
tags:
|
||||
- hackathon
|
||||
- community
|
||||
date: '2023-01-03'
|
||||
toc_depth: 2
|
||||
---
|
||||
|
||||
We ended 2022 shipping tons of features in [Launch Week 6](https://supabase.com/launch-week), but the fun hasn’t ended yet, because we get to announce the winners of our [Hackathon No.6](https://supabase.com/blog/launch-week-6-hackathon)!
|
||||
|
||||
As usual, we enjoyed looking at all the awesome projects, and this time we got to share the excitement with the folks from Deno, who judged the [Best Edge Functions Project](https://deno.com/blog/edge-functions-supabase-launch-week-6-hackathon#Winners). You can view all the submissions on [madewithsupabase.com](https://www.madewithsupabase.com/).
|
||||
|
||||
And now, without further ado, congratulations to the winners of Supabase Launch Week 6 Hackathon!
|
||||
|
||||
## Best Overall Project
|
||||
|
||||
### Winner
|
||||
|
||||
[Depulso](https://github.com/KarthikeyanRanasthala/depulso/) - by [@\_iamkarthikeyan](https://twitter.com/_iamkarthikeyan) and [@SindhuMansi](https://twitter.com/SindhuMansi).
|
||||
|
||||
Depulso is a CLI and a web app to easily and quickly setup static site deployments. Each deployment gets assigned a .depulso.site subdomain with SSL.
|
||||
|
||||

|
||||
|
||||
### Runner Up
|
||||
|
||||
[Supa SQL App](https://github.com/rodgetech/supa-sql-app) - by [@luis_rodge](https://twitter.com/luis_rodge).
|
||||
|
||||
Supa SQL App turns human language into SQL queries. Simply tell it what you want to do and it will generate the SQL query for you.
|
||||
|
||||

|
||||
|
||||
## Most Fun/Interesting
|
||||
|
||||
### Winner
|
||||
|
||||
[HTTP Sense](https://github.com/http-sense/http-sense) - by [@tchyut_p](https://twitter.com/tchyut_p) and [@nkitsaini](https://github.com/nkitsaini).
|
||||
|
||||
HTTP Sense is a reverse proxy and network monitoring tool that provides comprehensive network monitoring for your backend servers and microservices. It provides a secure and high-performance gateway that can be used to monitor incoming traffic.
|
||||
|
||||

|
||||
|
||||
### Runner Up
|
||||
|
||||
[supabase-js-rs](https://github.com/wa1aric/supabase-js-rs) - by [@wa1aric](https://twitter.com/wa1aric).
|
||||
|
||||
supabase-js-rs is a rust bindings for Supabase JavaScript library via WebAssembly. You can import it in your Rust WASM project to interact with Supabase.
|
||||
|
||||

|
||||
|
||||
## Best Flutter Project
|
||||
|
||||
### Winner
|
||||
|
||||
[supaquiz - Multiplayer trivia/quiz game](https://github.com/yallurium/supaquiz) - by [@yallurium](https://twitter.com/yallurium).
|
||||
|
||||
Supaquiz is a realtime multiplayer trivia/quiz game where you can host or join games with other players remotely.
|
||||
|
||||

|
||||
|
||||
## Best Storage Project
|
||||
|
||||
### Winner
|
||||
|
||||
[Lookout](https://github.com/luxecraft/lookout) - by [Aman](https://twitter.com/Amanrk28), [Nivas](https://twitter.com/nithsua), [Hari](https://twitter.com/_harisaran_), and [Sabesh](https://twitter.com/sabeshbharathi).
|
||||
|
||||
Lookout is an application that lets you discover images from across various media by searching them using their metadata - their properties, content inside the image, textual data found inside the image etc.
|
||||
|
||||

|
||||
|
||||
### Runner Up
|
||||
|
||||
[Penelope AI](https://github.com/taishikato/Penelope-AI) - by [@taishik\_](https://twitter.com/taishik_).
|
||||
|
||||
Penelope AI is an AI writing assistant that can summarize, paraphrase, create stories, and auto-complete from your writing.
|
||||
|
||||

|
||||
|
||||
## Best Edge Functions Project
|
||||
|
||||
### Winner
|
||||
|
||||
[Vista](https://github.com/zernonia/vista) - by [@zernonia](https://twitter.com/zernonia).
|
||||
|
||||
Vista is a video transcoder that adds subtitles from the audio. The design of the subtitles are customizable to fit the theme of the video.
|
||||
|
||||

|
||||
|
||||
### Runner Up
|
||||
|
||||
[Supa Que](https://github.com/suciptoid/supaque) - by [@suciptodev](https://twitter.com/suciptodev).
|
||||
|
||||
Supa Que is a serverless queue worker.
|
||||
|
||||

|
||||
|
||||
## The Prizes
|
||||
|
||||
As promised in the [hackathon announcement article](https://supabase.com/blog/launch-week-6-hackathon) the winners of the Best overall project will be granted the extremely limited edition Supabase Darkmode Keyboard!
|
||||
|
||||

|
||||
|
||||
Each members of the winners in other categories will receive a limited edition supaverified swag kit, and the winners of the Best Edge Functions projects will receive swag kits from the Deno team.
|
||||
|
||||

|
||||
|
||||
The swag kits are limited edition and extremely valuable, so keep them safe! Again, congratulations on all the winners!
|
||||
|
||||
## Hang out with us and the winners of the Hackathon
|
||||
|
||||
To celebrate the massive success of the Hackathon, we are hosting a Discord Stage Channel and inviting the winners and everyone who participated. Join us on Thursday, Jan 5th at 7:00 AM PST.
|
||||
|
||||
[**Join the Discord event**](https://discord.gg/8gGcMp5x?event=1059852103754989659)
|
||||
|
||||

|
||||
|
||||
### Get Started Guides
|
||||
|
||||
If you're inspired to build, check out some of the latest resources:
|
||||
|
||||
- [**supabase-js v2**](https://supabase.com/blog/supabase-js-v2)
|
||||
- [**Supabase Storage Guide**](https://supabase.com/docs/guides/storage)
|
||||
- [**Flutter Quick Start Guide**](https://supabase.com/docs/guides/with-flutter)
|
||||
- [**Supabase CLI local development guide**](https://supabase.com/docs/guides/local-development)
|
||||
- [**Edge Functions Guide**](https://supabase.com/docs/guides/functions)
|
||||
@@ -0,0 +1,121 @@
|
||||
---
|
||||
title: Supabase Beta December 2022
|
||||
description: This month the Beta Update is a Launch Week 6 Special, where we review the cascade of announcements.
|
||||
author: ant_wilson
|
||||
image: 2023-01-05-december-beta-update/monthly-update-december2022.jpg
|
||||
thumb: 2023-01-05-december-beta-update/monthly-update-december2022.jpg
|
||||
tags:
|
||||
- release-notes
|
||||
date: '2023-01-05'
|
||||
toc_depth: 3
|
||||
---
|
||||
|
||||
Happy New Year! Hope you are off to a great start. We closed 2022 on a high note with [Launch Week 6](https://supabase.com/launch-week) and a cascade of announcements. Here is everything we shipped so you can try them all 💻
|
||||
|
||||
## Day 1: New Docs
|
||||
|
||||

|
||||
|
||||
Documentation is super important to us, it's part of the product, and the Supabase docs needed a refresh. That's why we worked on a new redesign, better navigation, better reference docs, and we rebuilt the site using Next.js.
|
||||
|
||||
- [Blog Post](https://supabase.com/blog/new-supabase-docs-built-with-nextjs)
|
||||
- [Video announcement](https://www.youtube.com/watch?v=Q1Amk6iDlF8)
|
||||
|
||||
## Day 2: Storage v2 - Image resizing and Smart CDN
|
||||
|
||||

|
||||
|
||||
We introduced three new features for Supabase Storage: Image resizing, webhooks, and a Smart CDN. These features are designed to work together to deliver a next-gen image resizing system.
|
||||
|
||||
- [Blog Post](https://supabase.com/blog/storage-image-resizing-smart-cdn)
|
||||
- [Video announcement](https://www.youtube.com/watch?v=NpEl20iuOtg)
|
||||
|
||||
## Day 3 - Multi-factor Authentication via Row Level Security Enforcement
|
||||
|
||||

|
||||
|
||||
We released Multi-factor Authentication (MFA) for everyone, including the option to enforce it via RLS 🔐. Plus, in preparation for releasing SAML, we're "dogfooding" the feature with the introduction of Single Sign On (SSO) on our dashboard.
|
||||
|
||||
- [Blog post](https://supabase.com/blog/mfa-auth-via-rls)
|
||||
- [Video announcement](https://www.youtube.com/watch?v=He7LI2mv9v0)
|
||||
|
||||
## Day 4 - Supabase Wrappers, a Postgres FDW framework
|
||||
|
||||

|
||||
|
||||
Foreign Data Wrappers are a core feature of PostgreSQL. With Supabase Wrappers, we've extended this feature to query other databases or any other external system (including third-party APIs), using SQL.
|
||||
|
||||
- [Blog post](https://supabase.com/blog/postgres-foreign-data-wrappers-rust)
|
||||
- [Video announcement](https://www.youtube.com/watch?v=QA2qC5F-4OU)
|
||||
|
||||
## Day 5 - The Vault is now in Beta
|
||||
|
||||

|
||||
|
||||
The Vault is a new Postgres extension that makes it safe and easy to store encrypted secrets and encrypt other stored data in your database.
|
||||
|
||||
- [Blog post](https://supabase.com/blog/vault-now-in-beta)
|
||||
- [Video announcement](https://www.youtube.com/watch?v=QHLPNDrdN2w)
|
||||
|
||||
## Community Day
|
||||
|
||||

|
||||
|
||||
It's starting to feel like Supabase is really just a "community of communities" 🤗. Far too much has happened in the last 3 months for us to possibly feature it all here, so here's a collection of the highlights!
|
||||
|
||||
[Blog post](https://supabase.com/blog/launch-week-6-community-day)
|
||||
|
||||
## Postgres Ecosystem
|
||||
|
||||
We are all in on Postgres. That is why contributing to the ecosystem is always a priority. Launch Week 6 was no exception, with several announcements:
|
||||
|
||||

|
||||
|
||||
- [pg_graphql v1.0](https://supabase.com/blog/pg-graphql-v1)
|
||||
- [PostgREST 11 pre-release](https://supabase.com/blog/postgrest-11-prerelease)
|
||||
- [What's new in Postgres 15\?](https://supabase.com/blog/new-in-postgres-15)
|
||||
- [pg_crdt - an experimental CRDT extension for Postgres](https://supabase.com/blog/postgres-crdt)
|
||||
|
||||
## Custom Domains and Point-in-Time Recovery
|
||||
|
||||

|
||||
|
||||
Two key features to level up your projects are now available: Custom domains allow you to use your own domain for your Supabase project, while PITR provides the ability for a database to be restored at any specified point in time.
|
||||
|
||||
- [Custom Domains](https://supabase.com/blog/custom-domain-names)
|
||||
- [Point in Time Recovery](https://supabase.com/blog/postgres-point-in-time-recovery)
|
||||
|
||||
## Hackathon Winners
|
||||
|
||||

|
||||
|
||||
It was great to see so many high-quality projects. The decision wasn't easy, but in the end, the panel of judges chose Depulso as the winner of the Best Overall Project.
|
||||
|
||||
Congratulations 👏 to [@_iamkarthikeyan](https://twitter.com/_iamkarthikeyan) and [@SindhuMansi](https://twitter.com/SindhuMansi) who get each a Supabase Darkmode Keyboard and the $1500 Github sponsorship!
|
||||
|
||||
- [Full list of Winners](https://supabase.com/blog/launch-week-6-hackathon-winners)
|
||||
- [See all the submissions](https://www.madewithsupabase.com/launch-week-6)
|
||||
|
||||
## Extended Community Highlights
|
||||
|
||||

|
||||
|
||||
- FlutterFlow and Supabase integration. [Video](https://www.youtube.com/watch?v=hw9Q-NjASbU)
|
||||
- ClickHouse and PostgreSQL - a match made in data heaven. [Article](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres)
|
||||
- Build any Front-end like Admin Panel or CRM for your Supabase. [Article](https://blog.jetadmin.io/how-to-build-any-front-end-such-as-admin-panel-or-crm-for-your-supabase-in-minutes/)
|
||||
- Everything Svelte: a course with all you need to know to build a modern web application. [Course](https://www.everythingsvelte.com/)
|
||||
- Edgy Edge Functions: a look at a new Edge Function per week. [Youtube Playlist](https://www.youtube.com/playlist?list=PL5S4mPUpp4OulD3olUW8Eq1IYKpUbk5Ob)
|
||||
- Pixels, an app that provides canvas to create pixel art. [App](https://pixels.refine.dev/) | [Github Repo](https://github.com/refinedev/refine/tree/next/examples/pixels)
|
||||
- Supabase Angular authentication with RxJS Observables. [Tutorial](https://dev.to/kylerummens/supabase-angular-authentication-with-rxjs-observables-3d0f)
|
||||
- Create Calendar Events in React With Google Calendar API and Supabase. [Video Tutorial](https://www.youtube.com/watch?v=tgcCl52EN84)
|
||||
- Going Serverless with Supabase. [Part 1](https://dev.to/davepar/going-serverless-with-supabase-103h)
|
||||
- Supabase a Complete Backend Solution. [Video](https://www.youtube.com/watch?v=Ve0qE55fw0Y)
|
||||
- Supabase OAuth with SvelteKit (Discord, Google, GitHub). [Video](https://www.youtube.com/watch?v=KfezTtt2GsA)
|
||||
|
||||
## Meme Zone
|
||||
|
||||
As always, one of our favorite memes from last month. [Follow us on Twitter](https://twitter.com/supabase) for more.
|
||||
|
||||

|
||||
|
||||
See you next month!
|
||||
@@ -24,8 +24,7 @@ const Favicons = () => {
|
||||
/>
|
||||
<link rel="manifest" href={`${basePath}/favicon/site.webmanifest`} />
|
||||
{/* <link rel="mask-icon" href={`${basePath}/favicon/safari-pinned-tab.svg`} color="#333333" /> */}
|
||||
{/* <link rel="shortcut icon" href={`${basePath}/favicon/favicon.ico`} /> */}
|
||||
<link rel="shortcut icon" href={`${basePath}/favicon/favicon-lw.svg`} />
|
||||
<link rel="shortcut icon" href={`${basePath}/favicon/favicon.ico`} />
|
||||
<meta name="msapplication-TileColor" content="#1E1E1E" />
|
||||
<meta name="msapplication-config" content={`${basePath}/favicon/browserconfig.xml`} />
|
||||
<meta name="theme-color" content="#1E1E1E" />
|
||||
|
||||
@@ -14,16 +14,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$0" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "1 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 2,606 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "87 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "10 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "10"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "50 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "50"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -33,16 +38,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$5" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "2 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 2,606 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "174 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "30 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "30"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "75 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "75"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -52,16 +62,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$50" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "4 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 2,606 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "347 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "50 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "50"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "150 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "150"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -71,16 +86,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$100" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "2-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "8 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "630 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "100 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "100"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "300 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "300"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -90,16 +110,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$200" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "4-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "16 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "1,188 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "200 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "200"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "600 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "600"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -109,16 +134,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$400" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "8-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "32 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "2,375 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "350 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "350"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "1200 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "1200"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -128,16 +158,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$950" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "16-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "64 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "4,750 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "420 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "420"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "2800 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "2800"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -147,16 +182,21 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$1,860" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "32-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "128 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 9,000 Mbps" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "9,500 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "450 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "450"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "5600 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "5600"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -166,16 +206,25 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$2,790" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "48-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "192 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 13,500 Mbps" },
|
||||
{
|
||||
"key": "maxDiskIO",
|
||||
"title": "Maximum Disk IO Bandwidth",
|
||||
"value": "14,250 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "14,250 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "480 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "480"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "8600 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "8600"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -185,16 +234,25 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "$3,720" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "64-core ARM (dedicated)" },
|
||||
{ "key": "memory", "title": "Memory", "value": "256 GB" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 19,000 Mbps" },
|
||||
{
|
||||
"key": "maxDiskIO",
|
||||
"title": "Maximum Disk IO Bandwidth",
|
||||
"value": "19,000 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "19,000 Mbps"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"value": "500 (recommended)"
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "500"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"value": "11,600 (recommended)"
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "11,600"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -204,15 +262,20 @@
|
||||
{ "key": "pricing", "title": "Pricing", "value": "Contact Us" },
|
||||
{ "key": "cpu", "title": "CPU", "value": "Contact Us" },
|
||||
{ "key": "memory", "title": "Memory", "value": "Contact Us" },
|
||||
{ "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Contact Us" },
|
||||
{ "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "Contact Us" },
|
||||
{
|
||||
"key": "baseDiskIO",
|
||||
"title": "Baseline Disk IO Bandwidth",
|
||||
"value": "Contact Us"
|
||||
},
|
||||
{
|
||||
"key": "directConnections",
|
||||
"title": "Connections: Direct",
|
||||
"title": "Connections: Direct (recommended)",
|
||||
"value": "Contact Us"
|
||||
},
|
||||
{
|
||||
"key": "poolerConnections",
|
||||
"title": "Connections: Pooler",
|
||||
"title": "Connections: Pooler (recommended)",
|
||||
"value": "Contact Us"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1217,26 +1217,11 @@ module.exports = [
|
||||
source: '/docs/reference/cli/supabase-db-commit',
|
||||
destination: '/docs/reference/cli/usage',
|
||||
},
|
||||
{
|
||||
permanent: true,
|
||||
source: '/docs/reference/cli/supabase-db-reset',
|
||||
destination: '/docs/reference/cli/usage',
|
||||
},
|
||||
{
|
||||
permanent: true,
|
||||
source: '/docs/reference/cli/supabase-db-remote-set',
|
||||
destination: '/docs/reference/cli/usage',
|
||||
},
|
||||
{
|
||||
permanent: true,
|
||||
source: '/docs/reference/cli/supabase-db-remote-commit',
|
||||
destination: '/docs/reference/cli/usage',
|
||||
},
|
||||
{
|
||||
permanent: true,
|
||||
source: '/docs/reference/cli/supabase-db-push',
|
||||
destination: '/docs/reference/cli/usage',
|
||||
},
|
||||
{
|
||||
permanent: true,
|
||||
source: '/docs/reference/cli/supabase-functions-delete',
|
||||
|
||||
@@ -19,11 +19,17 @@ export async function getStaticProps() {
|
||||
const allPostsData = getSortedPosts('_blog', undefined, undefined, '** BLOG PAGE **')
|
||||
const categories = getAllCategories('_blog')
|
||||
const rss = generateRss(allPostsData)
|
||||
// @ts-ignore
|
||||
const planetPgPosts = allPostsData.filter((post) => post.tags.includes('planetpg'))
|
||||
const planetPgrss = generateRss(planetPgPosts)
|
||||
|
||||
// create a rss feed in public directory
|
||||
// rss feed is added via <Head> component in render return
|
||||
fs.writeFileSync('./public/rss.xml', rss)
|
||||
|
||||
// create separate feed for just posts promoted in PlanetPG
|
||||
fs.writeFileSync('./public/planetpg-rss.xml', planetPgrss)
|
||||
|
||||
return {
|
||||
props: {
|
||||
blogs: allPostsData,
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
Pricing Changelog
|
||||
|
||||
### 09 Jan 2023
|
||||
----
|
||||
|
||||
Database Compute Add ons
|
||||
- Clarified iops values to the latest instance types
|
||||
|
||||
### 02 Nov 2022
|
||||
----
|
||||
|
||||
|
||||
@@ -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 them add to the [SupaSquad GitHub Org](https://github.com/supasquad).
|
||||
Build Supabase examples, blog about them, and add them to the [SupaSquad GitHub Org](https://github.com/supasquad).
|
||||
|
||||
### Author
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="1.48403" y="1.48403" width="29.0319" height="29.0319" rx="4.33084" fill="url(#paint0_linear_920_70794)"/>
|
||||
<rect x="1.48403" y="1.48403" width="29.0319" height="29.0319" rx="4.33084" stroke="url(#paint1_linear_920_70794)" stroke-width="0.577445"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9125 7.63694C15.9013 6.89111 14.9598 6.57102 14.4954 7.1552L7.48827 15.9706C6.6612 17.011 7.40299 18.5455 8.73305 18.5455H15.9793L16.0645 24.2263C16.0757 24.9721 17.0172 25.2922 17.4815 24.7081L24.4887 15.8927C25.3157 14.8522 24.5739 13.3177 23.2439 13.3177H15.9498L15.9125 7.63694Z" fill="url(#paint2_linear_920_70794)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_920_70794" x1="10.1877" y1="9.76698" x2="25.4827" y2="42.2286" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#14292C"/>
|
||||
<stop offset="1" stop-color="#121212"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_920_70794" x1="19.9762" y1="1.25667" x2="28.1178" y2="12.0371" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#76A891" stop-opacity="0.11"/>
|
||||
<stop offset="1" stop-color="#132525" stop-opacity="0.35"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_920_70794" x1="3.62028" y1="6.85546" x2="32.7486" y2="6.85546" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#F4FFFA"/>
|
||||
<stop offset="1" stop-color="#D8FFEC" stop-opacity="0.6"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 205 KiB |
|
After Width: | Height: | Size: 321 KiB |
|
After Width: | Height: | Size: 143 KiB |
|
After Width: | Height: | Size: 171 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 265 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 366 KiB |
|
After Width: | Height: | Size: 318 KiB |
|
After Width: | Height: | Size: 932 KiB |
|
After Width: | Height: | Size: 3.8 MiB |
|
After Width: | Height: | Size: 615 KiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 634 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 690 KiB |
@@ -0,0 +1,159 @@
|
||||
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Blog - Supabase</title>
|
||||
<link>https://supabase.com</link>
|
||||
<description>Latest news from Supabase</description>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Thu, 15 Dec 2022 03:03:30 +0000</lastBuildDate>
|
||||
<atom:link href="https://supabase.com/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/vault-now-in-beta</guid>
|
||||
<title>Supabase Vault is now in Beta</title>
|
||||
<link>https://supabase.com/blog/vault-now-in-beta</link>
|
||||
<description>A Postgres extension to store encrypted secrets and encrypt data.</description>
|
||||
<pubDate>Thu, 15 Dec 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgrest-11-prerelease</guid>
|
||||
<title>PostgREST 11 pre-release</title>
|
||||
<link>https://supabase.com/blog/postgrest-11-prerelease</link>
|
||||
<description>Describes new features of PostgREST 11 pre-release</description>
|
||||
<pubDate>Thu, 15 Dec 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-point-in-time-recovery</guid>
|
||||
<title>Point in Time Recovery is now available for Pro projects</title>
|
||||
<link>https://supabase.com/blog/postgres-point-in-time-recovery</link>
|
||||
<description>We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use.</description>
|
||||
<pubDate>Thu, 15 Dec 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/pg-graphql-v1</guid>
|
||||
<title>pg_graphql v1.0</title>
|
||||
<link>https://supabase.com/blog/pg-graphql-v1</link>
|
||||
<description>Announcing the v1.0 release of pg_graphql</description>
|
||||
<pubDate>Thu, 15 Dec 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/new-in-postgres-15</guid>
|
||||
<title>What's new in Postgres 15?</title>
|
||||
<link>https://supabase.com/blog/new-in-postgres-15</link>
|
||||
<description>Describes the release of Postgres 15, new features and reasons to use it</description>
|
||||
<pubDate>Thu, 15 Dec 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/transparent-column-encryption-with-postgres</guid>
|
||||
<title>Transparent Column Encryption with Postgres</title>
|
||||
<link>https://supabase.com/blog/transparent-column-encryption-with-postgres</link>
|
||||
<description>Using pgsodium's Transparent Column Encryption to encrypt data and provide your users with row-level encryption.</description>
|
||||
<pubDate>Wed, 30 Nov 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/sql-or-nosql-both-with-postgresql</guid>
|
||||
<title>SQL or NoSQL? Why not use both (with PostgreSQL)?</title>
|
||||
<link>https://supabase.com/blog/sql-or-nosql-both-with-postgresql</link>
|
||||
<description>How to turn Postgres into an easy-to-use NoSQL database that retains all the power of SQL</description>
|
||||
<pubDate>Wed, 23 Nov 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-commitfest</guid>
|
||||
<title>What is PostgreSQL commitfest and how to contribute</title>
|
||||
<link>https://supabase.com/blog/postgresql-commitfest</link>
|
||||
<description>A time-tested method for contributing to the core Postgres code</description>
|
||||
<pubDate>Wed, 26 Oct 2022 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-full-text-search-vs-the-rest</guid>
|
||||
<title>Postgres Full Text Search vs the rest</title>
|
||||
<link>https://supabase.com/blog/postgres-full-text-search-vs-the-rest</link>
|
||||
<description>Comparing one of the most popular Postgres features against alternatives</description>
|
||||
<pubDate>Thu, 13 Oct 2022 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-wasm</guid>
|
||||
<title>Postgres WASM by Snaplet and Supabase</title>
|
||||
<link>https://supabase.com/blog/postgres-wasm</link>
|
||||
<description>We're open sourcing postgres-wasm, a PostgresQL server that runs inside a browser, with our friends at Snaplet.</description>
|
||||
<pubDate>Sun, 02 Oct 2022 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/choosing-a-postgres-primary-key</guid>
|
||||
<title>Choosing a Postgres Primary Key</title>
|
||||
<link>https://supabase.com/blog/choosing-a-postgres-primary-key</link>
|
||||
<description>Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out</description>
|
||||
<pubDate>Wed, 07 Sep 2022 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/seen-by-in-postgresql</guid>
|
||||
<title>Implementing "seen by" functionality with Postgres</title>
|
||||
<link>https://supabase.com/blog/seen-by-in-postgresql</link>
|
||||
<description>Different approaches for tracking visitor counts with PostgreSQL.</description>
|
||||
<pubDate>Sun, 17 Jul 2022 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/partial-postgresql-data-dumps-with-rls</guid>
|
||||
<title>Partial data dumps using Postgres Row Level Security</title>
|
||||
<link>https://supabase.com/blog/partial-postgresql-data-dumps-with-rls</link>
|
||||
<description>Using RLS to create seed files for local PostgreSQL testing.</description>
|
||||
<pubDate>Mon, 27 Jun 2022 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/audit</guid>
|
||||
<title>Postgres Auditing in 150 lines of SQL</title>
|
||||
<link>https://supabase.com/blog/audit</link>
|
||||
<description>PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.</description>
|
||||
<pubDate>Mon, 07 Mar 2022 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/roles-postgres-hooks</guid>
|
||||
<title>Protecting reserved roles with PostgreSQL Hooks</title>
|
||||
<link>https://supabase.com/blog/roles-postgres-hooks</link>
|
||||
<description>Using Postgres Hooks to protect functionality in your Postgres database.</description>
|
||||
<pubDate>Thu, 01 Jul 2021 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-as-a-cron-server</guid>
|
||||
<title>Postgres as a CRON Server</title>
|
||||
<link>https://supabase.com/blog/postgres-as-a-cron-server</link>
|
||||
<description>Running repetitive tasks with your Postgres database.</description>
|
||||
<pubDate>Fri, 05 Mar 2021 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/cracking-postgres-interview</guid>
|
||||
<title>Cracking PostgreSQL Interview Questions</title>
|
||||
<link>https://supabase.com/blog/cracking-postgres-interview</link>
|
||||
<description>Understand the top PostgreSQL Interview Questions</description>
|
||||
<pubDate>Sat, 27 Feb 2021 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-views</guid>
|
||||
<title>Postgres Views</title>
|
||||
<link>https://supabase.com/blog/postgresql-views</link>
|
||||
<description>Creating and using a view in PostgreSQL.</description>
|
||||
<pubDate>Wed, 18 Nov 2020 03:03:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/continuous-postgresql-backup-walg</guid>
|
||||
<title>Continuous PostgreSQL Backups using WAL-G</title>
|
||||
<link>https://supabase.com/blog/continuous-postgresql-backup-walg</link>
|
||||
<description>Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.</description>
|
||||
<pubDate>Sun, 02 Aug 2020 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-templates</guid>
|
||||
<title>What are PostgreSQL Templates?</title>
|
||||
<link>https://supabase.com/blog/postgresql-templates</link>
|
||||
<description>What are PostgreSQL templates and what are they used for?</description>
|
||||
<pubDate>Thu, 09 Jul 2020 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgresql-physical-logical-backups</guid>
|
||||
<title>Physical vs Logical Backups in PostgreSQL</title>
|
||||
<link>https://supabase.com/blog/postgresql-physical-logical-backups</link>
|
||||
<description>What are physical and logical backups in Postgres?</description>
|
||||
<pubDate>Tue, 07 Jul 2020 02:02:30 +0000</pubDate>
|
||||
</item>
|
||||
|
||||
</channel>
|
||||
</rss>
|
||||
@@ -74,4 +74,5 @@ STUDIO_DEFAULT_ORGANIZATION=Default Organization
|
||||
STUDIO_DEFAULT_PROJECT=Default Project
|
||||
|
||||
STUDIO_PORT=3000
|
||||
SUPABASE_PUBLIC_URL=http://localhost:8000 # replace if you intend to use Studio outside of localhost
|
||||
# replace if you intend to use Studio outside of localhost
|
||||
SUPABASE_PUBLIC_URL=http://localhost:8000
|
||||
@@ -18,6 +18,8 @@ services:
|
||||
db:
|
||||
restart: 'no'
|
||||
volumes:
|
||||
# Always use a fresh database when developing
|
||||
- /var/lib/postgresql/data
|
||||
# Seed data should be inserted last (alphabetical order)
|
||||
- ./dev/data.sql:/docker-entrypoint-initdb.d/seed.sql
|
||||
storage:
|
||||
|
||||
@@ -47,7 +47,7 @@ services:
|
||||
|
||||
auth:
|
||||
container_name: supabase-auth
|
||||
image: supabase/gotrue:v2.31.0
|
||||
image: supabase/gotrue:v2.40.1
|
||||
depends_on:
|
||||
db: # Disable this if you are using an external Postgres database
|
||||
condition: service_healthy
|
||||
@@ -104,29 +104,30 @@ services:
|
||||
PGRST_DB_USE_LEGACY_GUCS: "false"
|
||||
|
||||
realtime:
|
||||
container_name: supabase-realtime
|
||||
image: supabase/realtime:v0.25.1
|
||||
container_name: realtime-dev.supabase-realtime
|
||||
image: supabase/realtime:v2.1.0
|
||||
depends_on:
|
||||
db: # Disable this if you are using an external Postgres database
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
PORT: 4000
|
||||
DB_HOST: ${POSTGRES_HOST}
|
||||
DB_PORT: ${POSTGRES_PORT}
|
||||
DB_NAME: ${POSTGRES_DB}
|
||||
DB_USER: supabase_admin
|
||||
DB_USER: ${POSTGRES_USER}
|
||||
DB_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DB_SSL: "false"
|
||||
PORT: 4000
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
REPLICATION_MODE: RLS
|
||||
REPLICATION_POLL_INTERVAL: 100
|
||||
SECURE_CHANNELS: "true"
|
||||
SLOT_NAME: supabase_realtime_rls
|
||||
TEMPORARY_SLOT: "true"
|
||||
DB_NAME: ${POSTGRES_DB}
|
||||
DB_AFTER_CONNECT_QUERY: 'SET search_path TO _realtime'
|
||||
DB_ENC_KEY: supabaserealtime
|
||||
API_JWT_SECRET: ${JWT_SECRET}
|
||||
FLY_ALLOC_ID: fly123
|
||||
FLY_APP_NAME: realtime
|
||||
SECRET_KEY_BASE: UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq
|
||||
ERL_AFLAGS: -proto_dist inet_tcp
|
||||
ENABLE_TAILSCALE: "false"
|
||||
DNS_NODES: "''"
|
||||
command: >
|
||||
bash -c "./prod/rel/realtime/bin/realtime eval Realtime.Release.migrate
|
||||
&& ./prod/rel/realtime/bin/realtime start"
|
||||
sh -c "/app/bin/migrate && /app/bin/realtime eval 'Realtime.Release.seeds(Realtime.Repo)' && /app/bin/server"
|
||||
|
||||
storage:
|
||||
container_name: supabase-storage
|
||||
@@ -208,5 +209,6 @@ services:
|
||||
PGDATABASE: ${POSTGRES_DB}
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
volumes:
|
||||
- ./volumes/db/realtime.sql:/docker-entrypoint-initdb.d/realtime.sql
|
||||
- ./volumes/db/roles.sql:/docker-entrypoint-initdb.d/roles.sql
|
||||
- ./volumes/db/data:/var/lib/postgresql/data
|
||||
@@ -124,7 +124,7 @@ services:
|
||||
## Secure Realtime routes
|
||||
- name: realtime-v1
|
||||
_comment: "Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*"
|
||||
url: http://realtime:4000/socket/
|
||||
url: http://realtime-dev.supabase-realtime:4000/socket/
|
||||
routes:
|
||||
- name: realtime-v1-all
|
||||
strip_path: true
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
\set pguser `echo "$POSTGRES_USER"`
|
||||
|
||||
create schema if not exists _realtime;
|
||||
alter schema _realtime owner to :pguser;
|
||||
@@ -2180,9 +2180,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
@@ -4922,9 +4922,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
|
||||
@@ -7093,9 +7093,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
@@ -17212,9 +17212,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true
|
||||
},
|
||||
"jsonc-parser": {
|
||||
|
||||
@@ -2364,9 +2364,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
@@ -5219,9 +5219,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
|
||||
@@ -4385,9 +4385,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
@@ -10873,9 +10873,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true
|
||||
},
|
||||
"jsonc-parser": {
|
||||
|
||||
@@ -4140,9 +4140,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cache-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -6823,9 +6823,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/html-webpack-plugin/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -7642,9 +7642,9 @@
|
||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
@@ -9446,9 +9446,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -12440,9 +12440,9 @@
|
||||
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
|
||||
},
|
||||
"node_modules/vue-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -12591,9 +12591,9 @@
|
||||
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
|
||||
},
|
||||
"node_modules/vue-style-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -13407,9 +13407,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/webpack/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -17088,9 +17088,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -19177,9 +19177,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -19762,9 +19762,9 @@
|
||||
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "6.1.0",
|
||||
@@ -21177,9 +21177,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -23561,9 +23561,9 @@
|
||||
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -23686,9 +23686,9 @@
|
||||
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -24190,9 +24190,9 @@
|
||||
}
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
|
||||
@@ -4273,9 +4273,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/babel-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -9521,9 +9521,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/html-webpack-plugin/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -12595,12 +12595,9 @@
|
||||
"integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
|
||||
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.5"
|
||||
},
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
@@ -13133,9 +13130,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/mini-css-extract-plugin/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -14942,9 +14939,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -16818,9 +16815,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-url-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -19194,9 +19191,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig-paths/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -20999,9 +20996,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/webpack/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -24968,9 +24965,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -29143,9 +29140,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -31411,12 +31408,9 @@
|
||||
"integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
|
||||
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
}
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "6.1.0",
|
||||
@@ -31836,9 +31830,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -33259,9 +33253,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -34764,9 +34758,9 @@
|
||||
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -36653,9 +36647,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -37523,9 +37517,9 @@
|
||||
"integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
|
||||
@@ -1320,9 +1320,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
@@ -2631,9 +2631,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"dev": true
|
||||
},
|
||||
"merge-anything": {
|
||||
|
||||
@@ -9706,75 +9706,6 @@
|
||||
"tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@tanstack/match-sorter-utils": {
|
||||
"version": "8.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.1.1.tgz",
|
||||
"integrity": "sha512-IdmEekEYxQsoLOR0XQyw3jD1GujBpRRYaGJYQUw1eOT1eUugWxdc7jomh1VQ1EKHcdwDLpLaCz/8y4KraU4T9A==",
|
||||
"dependencies": {
|
||||
"remove-accents": "0.4.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/kentcdodds"
|
||||
}
|
||||
},
|
||||
"node_modules/@tanstack/query-core": {
|
||||
"version": "4.15.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.15.1.tgz",
|
||||
"integrity": "sha512-+UfqJsNbPIVo0a9ANW0ZxtjiMfGLaaoIaL9vZeVycvmBuWywJGtSi7fgPVMCPdZQFOzMsaXaOsDtSKQD5xLRVQ==",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
}
|
||||
},
|
||||
"node_modules/@tanstack/react-query": {
|
||||
"version": "4.16.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.16.1.tgz",
|
||||
"integrity": "sha512-PDE9u49wSDykPazlCoLFevUpceLjQ0Mm8i6038HgtTEKb/aoVnUZdlUP7C392ds3Cd75+EGlHU7qpEX06R7d9Q==",
|
||||
"dependencies": {
|
||||
"@tanstack/query-core": "4.15.1",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-native": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"react-dom": {
|
||||
"optional": true
|
||||
},
|
||||
"react-native": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@tanstack/react-query-devtools": {
|
||||
"version": "4.16.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-4.16.1.tgz",
|
||||
"integrity": "sha512-VrDYLmG+OOcvGSZL5avG4R8jhqeMFP7pzW2sh2BWEV9UfI+aocG+CW8y8ygacxuKy48m8Tyo/xfe8H1z9BGb+g==",
|
||||
"dependencies": {
|
||||
"@tanstack/match-sorter-utils": "8.1.1",
|
||||
"superjson": "^1.10.0",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@tanstack/react-query": "4.16.1",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@testdeck/core": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@testdeck/core/-/core-0.2.2.tgz",
|
||||
@@ -11040,6 +10971,15 @@
|
||||
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
|
||||
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
|
||||
},
|
||||
"node_modules/@zip.js/zip.js": {
|
||||
"version": "2.6.61",
|
||||
"resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.6.61.tgz",
|
||||
"integrity": "sha512-3zBN4zSTXUTz0vFzSnVV76a1tNVBj5cH6rSRDGpYzY95P6JQkepN0puXgtUqLHMTsnfGbwnpG1yVO93RH3xQ1g==",
|
||||
"engines": {
|
||||
"deno": ">=1.0.0",
|
||||
"node": ">=16.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/abab": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
|
||||
@@ -14531,9 +14471,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/css-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
@@ -19576,9 +19516,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/html-webpack-plugin/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
@@ -22579,9 +22519,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/js-yaml-loader/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -22725,9 +22665,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
@@ -34674,9 +34614,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig-paths/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -36613,9 +36553,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/webpack/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@@ -37583,8 +37523,9 @@
|
||||
"@supabase/react-data-grid": "^7.1.0-beta.7",
|
||||
"@supabase/shared-types": "^0.1.29",
|
||||
"@supabase/supabase-js": "^2.1.1",
|
||||
"@tanstack/react-query": "^4.16.1",
|
||||
"@tanstack/react-query-devtools": "^4.16.1",
|
||||
"@tanstack/react-query": "^4.22.0",
|
||||
"@tanstack/react-query-devtools": "^4.22.0",
|
||||
"@zip.js/zip.js": "^2.6.61",
|
||||
"ajv": "^8.6.3",
|
||||
"analytics-node": "^3.5.0",
|
||||
"awesome-debounce-promise": "^2.1.0",
|
||||
@@ -37717,6 +37658,75 @@
|
||||
"tailwindcss": ">=3.0.0 || insiders"
|
||||
}
|
||||
},
|
||||
"studio/node_modules/@tanstack/match-sorter-utils": {
|
||||
"version": "8.7.6",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.7.6.tgz",
|
||||
"integrity": "sha512-2AMpRiA6QivHOUiBpQAVxjiHAA68Ei23ZUMNaRJrN6omWiSFLoYrxGcT6BXtuzp0Jw4h6HZCmGGIM/gbwebO2A==",
|
||||
"dependencies": {
|
||||
"remove-accents": "0.4.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/kentcdodds"
|
||||
}
|
||||
},
|
||||
"studio/node_modules/@tanstack/query-core": {
|
||||
"version": "4.22.0",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.22.0.tgz",
|
||||
"integrity": "sha512-OeLyBKBQoT265f5G9biReijeP8mBxNFwY7ZUu1dKL+YzqpG5q5z7J/N1eT8aWyKuhyDTiUHuKm5l+oIVzbtrjw==",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
}
|
||||
},
|
||||
"studio/node_modules/@tanstack/react-query": {
|
||||
"version": "4.22.0",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.22.0.tgz",
|
||||
"integrity": "sha512-P9o+HjG42uB/xHR6dMsJaPhtZydSe4v0xdG5G/cEj1oHZAXelMlm67/rYJNQGKgBamKElKogj+HYGF+NY2yHYg==",
|
||||
"dependencies": {
|
||||
"@tanstack/query-core": "4.22.0",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-native": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"react-dom": {
|
||||
"optional": true
|
||||
},
|
||||
"react-native": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"studio/node_modules/@tanstack/react-query-devtools": {
|
||||
"version": "4.22.0",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-4.22.0.tgz",
|
||||
"integrity": "sha512-YeYFBnfqvb+ZlA0IiJqiHNNSzepNhI1p2o9i8NlhQli9+Zrn230M47OBaBUs8qr3DD1dC2zGB1Dis50Ktz8gAA==",
|
||||
"dependencies": {
|
||||
"@tanstack/match-sorter-utils": "^8.7.0",
|
||||
"superjson": "^1.10.0",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/tannerlinsley"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@tanstack/react-query": "4.22.0",
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"studio/node_modules/@types/d3-path": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.2.tgz",
|
||||
@@ -44528,38 +44538,6 @@
|
||||
"mini-svg-data-uri": "^1.2.3"
|
||||
}
|
||||
},
|
||||
"@tanstack/match-sorter-utils": {
|
||||
"version": "8.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.1.1.tgz",
|
||||
"integrity": "sha512-IdmEekEYxQsoLOR0XQyw3jD1GujBpRRYaGJYQUw1eOT1eUugWxdc7jomh1VQ1EKHcdwDLpLaCz/8y4KraU4T9A==",
|
||||
"requires": {
|
||||
"remove-accents": "0.4.2"
|
||||
}
|
||||
},
|
||||
"@tanstack/query-core": {
|
||||
"version": "4.15.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.15.1.tgz",
|
||||
"integrity": "sha512-+UfqJsNbPIVo0a9ANW0ZxtjiMfGLaaoIaL9vZeVycvmBuWywJGtSi7fgPVMCPdZQFOzMsaXaOsDtSKQD5xLRVQ=="
|
||||
},
|
||||
"@tanstack/react-query": {
|
||||
"version": "4.16.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.16.1.tgz",
|
||||
"integrity": "sha512-PDE9u49wSDykPazlCoLFevUpceLjQ0Mm8i6038HgtTEKb/aoVnUZdlUP7C392ds3Cd75+EGlHU7qpEX06R7d9Q==",
|
||||
"requires": {
|
||||
"@tanstack/query-core": "4.15.1",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"@tanstack/react-query-devtools": {
|
||||
"version": "4.16.1",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-4.16.1.tgz",
|
||||
"integrity": "sha512-VrDYLmG+OOcvGSZL5avG4R8jhqeMFP7pzW2sh2BWEV9UfI+aocG+CW8y8ygacxuKy48m8Tyo/xfe8H1z9BGb+g==",
|
||||
"requires": {
|
||||
"@tanstack/match-sorter-utils": "8.1.1",
|
||||
"superjson": "^1.10.0",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"@testdeck/core": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@testdeck/core/-/core-0.2.2.tgz",
|
||||
@@ -45664,6 +45642,11 @@
|
||||
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
|
||||
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
|
||||
},
|
||||
"@zip.js/zip.js": {
|
||||
"version": "2.6.61",
|
||||
"resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.6.61.tgz",
|
||||
"integrity": "sha512-3zBN4zSTXUTz0vFzSnVV76a1tNVBj5cH6rSRDGpYzY95P6JQkepN0puXgtUqLHMTsnfGbwnpG1yVO93RH3xQ1g=="
|
||||
},
|
||||
"abab": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
|
||||
@@ -48413,9 +48396,9 @@
|
||||
}
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
@@ -52812,9 +52795,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
@@ -55175,9 +55158,9 @@
|
||||
}
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -55282,9 +55265,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
|
||||
},
|
||||
"jsonc-parser": {
|
||||
"version": "3.2.0",
|
||||
@@ -63365,11 +63348,11 @@
|
||||
"@supabase/shared-types": "^0.1.29",
|
||||
"@supabase/supabase-js": "^2.1.1",
|
||||
"@tailwindcss/typography": "^0.5.2",
|
||||
"@tanstack/react-query": "^4.16.1",
|
||||
"@tanstack/react-query-devtools": "^4.16.1",
|
||||
"@tanstack/react-query": "^4.22.0",
|
||||
"@tanstack/react-query-devtools": "^4.22.0",
|
||||
"@testing-library/dom": "^8.19.0",
|
||||
"@testing-library/react": "^12.1.5",
|
||||
"@testing-library/react-hooks": "*",
|
||||
"@testing-library/react-hooks": "^8.0.1",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"@types/blueimp-md5": "^2.18.0",
|
||||
"@types/file-saver": "^2.0.2",
|
||||
@@ -63391,6 +63374,7 @@
|
||||
"@types/sqlstring": "^2.3.0",
|
||||
"@types/uuid": "^8.3.4",
|
||||
"@types/zxcvbn": "^4.4.1",
|
||||
"@zip.js/zip.js": "^2.6.61",
|
||||
"ajv": "^8.6.3",
|
||||
"analytics-node": "^3.5.0",
|
||||
"autoprefixer": "10.4.2",
|
||||
@@ -63484,6 +63468,38 @@
|
||||
"postcss-selector-parser": "6.0.10"
|
||||
}
|
||||
},
|
||||
"@tanstack/match-sorter-utils": {
|
||||
"version": "8.7.6",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.7.6.tgz",
|
||||
"integrity": "sha512-2AMpRiA6QivHOUiBpQAVxjiHAA68Ei23ZUMNaRJrN6omWiSFLoYrxGcT6BXtuzp0Jw4h6HZCmGGIM/gbwebO2A==",
|
||||
"requires": {
|
||||
"remove-accents": "0.4.2"
|
||||
}
|
||||
},
|
||||
"@tanstack/query-core": {
|
||||
"version": "4.22.0",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.22.0.tgz",
|
||||
"integrity": "sha512-OeLyBKBQoT265f5G9biReijeP8mBxNFwY7ZUu1dKL+YzqpG5q5z7J/N1eT8aWyKuhyDTiUHuKm5l+oIVzbtrjw=="
|
||||
},
|
||||
"@tanstack/react-query": {
|
||||
"version": "4.22.0",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.22.0.tgz",
|
||||
"integrity": "sha512-P9o+HjG42uB/xHR6dMsJaPhtZydSe4v0xdG5G/cEj1oHZAXelMlm67/rYJNQGKgBamKElKogj+HYGF+NY2yHYg==",
|
||||
"requires": {
|
||||
"@tanstack/query-core": "4.22.0",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"@tanstack/react-query-devtools": {
|
||||
"version": "4.22.0",
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-4.22.0.tgz",
|
||||
"integrity": "sha512-YeYFBnfqvb+ZlA0IiJqiHNNSzepNhI1p2o9i8NlhQli9+Zrn230M47OBaBUs8qr3DD1dC2zGB1Dis50Ktz8gAA==",
|
||||
"requires": {
|
||||
"@tanstack/match-sorter-utils": "^8.7.0",
|
||||
"superjson": "^1.10.0",
|
||||
"use-sync-external-store": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"@types/d3-path": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.2.tgz",
|
||||
@@ -64526,9 +64542,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
@@ -66043,9 +66059,9 @@
|
||||
"integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw=="
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
|
||||
@@ -338,165 +338,6 @@
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/secrets": {
|
||||
"get": {
|
||||
"operationId": "getSecrets",
|
||||
"summary": "List all secrets",
|
||||
"description": "Returns all secrets you've previously added to the specified project.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/components/schemas/SecretResponse" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's secrets" }
|
||||
},
|
||||
"tags": ["secrets"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
},
|
||||
"post": {
|
||||
"operationId": "createSecrets",
|
||||
"summary": "Bulk create secrets",
|
||||
"description": "Creates multiple secrets and adds them to the specified project.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/components/schemas/CreateSecretBody" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"201": { "description": "" },
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to create project's secrets" }
|
||||
},
|
||||
"tags": ["secrets"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
},
|
||||
"delete": {
|
||||
"operationId": "deleteSecrets",
|
||||
"summary": "Bulk delete secrets",
|
||||
"description": "Deletes all secrets with the given names from the specified project",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": { "schema": { "type": "array", "items": { "type": "string" } } }
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": { "application/json": { "schema": { "type": "object" } } }
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to delete secrets with given names" }
|
||||
},
|
||||
"tags": ["secrets"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/postgrest": {
|
||||
"get": {
|
||||
"operationId": "getPostgRESTConfig",
|
||||
"summary": "Gets project's postgrest config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PostgrestConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's postgrest config" }
|
||||
},
|
||||
"tags": ["services"],
|
||||
"security": [{ "bearer": [] }]
|
||||
},
|
||||
"patch": {
|
||||
"operationId": "updatePostgRESTConfig",
|
||||
"summary": "Updates project's postgrest config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/UpdatePostgrestConfigBody" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PostgrestConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to update project's postgrest config" }
|
||||
},
|
||||
"tags": ["services"],
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/custom-hostname": {
|
||||
"get": {
|
||||
"operationId": "getCustomHostnameConfig",
|
||||
@@ -641,106 +482,6 @@
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/pgsodium": {
|
||||
"get": {
|
||||
"operationId": "getConfig",
|
||||
"summary": "Gets project's pgsodium config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PgsodiumConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's pgsodium config" }
|
||||
},
|
||||
"tags": ["pgsodium (beta)"],
|
||||
"security": [{ "bearer": [] }]
|
||||
},
|
||||
"put": {
|
||||
"operationId": "updateConfig",
|
||||
"summary": "Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/UpdatePgsodiumConfigBody" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PgsodiumConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to update project's pgsodium config" }
|
||||
},
|
||||
"tags": ["pgsodium (beta)"],
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/types/typescript": {
|
||||
"get": {
|
||||
"operationId": "getTypescriptTypes",
|
||||
"summary": "Generate TypeScript types",
|
||||
"description": "Returns the TypeScript types of your schema for use with supabase-js.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "included_schemas",
|
||||
"required": false,
|
||||
"in": "query",
|
||||
"schema": { "default": "public", "type": "string" }
|
||||
},
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/TypescriptResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to generate TypeScript types" }
|
||||
},
|
||||
"tags": ["projects"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/network-bans/retrieve": {
|
||||
"post": {
|
||||
"operationId": "getNetworkBans",
|
||||
@@ -866,6 +607,329 @@
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/pgsodium": {
|
||||
"get": {
|
||||
"operationId": "getConfig",
|
||||
"summary": "Gets project's pgsodium config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PgsodiumConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's pgsodium config" }
|
||||
},
|
||||
"tags": ["pgsodium (beta)"],
|
||||
"security": [{ "bearer": [] }]
|
||||
},
|
||||
"put": {
|
||||
"operationId": "updateConfig",
|
||||
"summary": "Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/UpdatePgsodiumConfigBody" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PgsodiumConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to update project's pgsodium config" }
|
||||
},
|
||||
"tags": ["pgsodium (beta)"],
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/postgrest": {
|
||||
"get": {
|
||||
"operationId": "getPostgRESTConfig",
|
||||
"summary": "Gets project's postgrest config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PostgrestConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's postgrest config" }
|
||||
},
|
||||
"tags": ["services"],
|
||||
"security": [{ "bearer": [] }]
|
||||
},
|
||||
"patch": {
|
||||
"operationId": "updatePostgRESTConfig",
|
||||
"summary": "Updates project's postgrest config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/UpdatePostgrestConfigBody" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/PostgrestConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to update project's postgrest config" }
|
||||
},
|
||||
"tags": ["services"],
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/secrets": {
|
||||
"get": {
|
||||
"operationId": "getSecrets",
|
||||
"summary": "List all secrets",
|
||||
"description": "Returns all secrets you've previously added to the specified project.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/components/schemas/SecretResponse" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's secrets" }
|
||||
},
|
||||
"tags": ["secrets"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
},
|
||||
"post": {
|
||||
"operationId": "createSecrets",
|
||||
"summary": "Bulk create secrets",
|
||||
"description": "Creates multiple secrets and adds them to the specified project.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/components/schemas/CreateSecretBody" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"201": { "description": "" },
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to create project's secrets" }
|
||||
},
|
||||
"tags": ["secrets"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
},
|
||||
"delete": {
|
||||
"operationId": "deleteSecrets",
|
||||
"summary": "Bulk delete secrets",
|
||||
"description": "Deletes all secrets with the given names from the specified project",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": { "schema": { "type": "array", "items": { "type": "string" } } }
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": { "application/json": { "schema": { "type": "object" } } }
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to delete secrets with given names" }
|
||||
},
|
||||
"tags": ["secrets"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/ssl-enforcement": {
|
||||
"get": {
|
||||
"operationId": "getSslEnforcementConfig",
|
||||
"summary": "Get project's SSL enforcement configuration.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/SslEnforcementResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to retrieve project's SSL enforcement config" }
|
||||
},
|
||||
"tags": ["ssl enforcement (beta)"],
|
||||
"security": [{ "bearer": [] }]
|
||||
},
|
||||
"put": {
|
||||
"operationId": "updateSslEnforcementConfig",
|
||||
"summary": "Update project's SSL enforcement configuration.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/SslEnforcementRequest" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/SslEnforcementResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to update project's SSL enforcement configuration." }
|
||||
},
|
||||
"tags": ["ssl enforcement (beta)"],
|
||||
"security": [{ "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/types/typescript": {
|
||||
"get": {
|
||||
"operationId": "getTypescriptTypes",
|
||||
"summary": "Generate TypeScript types",
|
||||
"description": "Returns the TypeScript types of your schema for use with supabase-js.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "included_schemas",
|
||||
"required": false,
|
||||
"in": "query",
|
||||
"schema": { "default": "public", "type": "string" }
|
||||
},
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/TypescriptResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": { "description": "" },
|
||||
"500": { "description": "Failed to generate TypeScript types" }
|
||||
},
|
||||
"tags": ["projects"],
|
||||
"security": [{ "apiKeyHeader": [], "apiKeyParam": [] }, { "bearer": [] }]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/vanity-subdomain": {
|
||||
"get": {
|
||||
"operationId": "getVanitySubdomainConfig",
|
||||
@@ -1100,36 +1164,6 @@
|
||||
"verify_jwt": { "type": "boolean" }
|
||||
}
|
||||
},
|
||||
"SecretResponse": {
|
||||
"type": "object",
|
||||
"properties": { "name": { "type": "string" }, "value": { "type": "string" } },
|
||||
"required": ["name", "value"]
|
||||
},
|
||||
"CreateSecretBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": { "type": "string" },
|
||||
"value": { "type": "string", "pattern": "/^(?!SUPABASE_).*/" }
|
||||
},
|
||||
"required": ["name", "value"]
|
||||
},
|
||||
"PostgrestConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"max_rows": { "type": "integer" },
|
||||
"db_schema": { "type": "string" },
|
||||
"db_extra_search_path": { "type": "string" }
|
||||
},
|
||||
"required": ["max_rows", "db_schema", "db_extra_search_path"]
|
||||
},
|
||||
"UpdatePostgrestConfigBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"max_rows": { "type": "integer", "minimum": 0, "maximum": 1000000 },
|
||||
"db_extra_search_path": { "type": "string" },
|
||||
"db_schema": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"UpdateCustomHostnameResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -1153,21 +1187,6 @@
|
||||
"properties": { "custom_hostname": { "type": "string" } },
|
||||
"required": ["custom_hostname"]
|
||||
},
|
||||
"PgsodiumConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": { "root_key": { "type": "string" } },
|
||||
"required": ["root_key"]
|
||||
},
|
||||
"UpdatePgsodiumConfigBody": {
|
||||
"type": "object",
|
||||
"properties": { "root_key": { "type": "string" } },
|
||||
"required": ["root_key"]
|
||||
},
|
||||
"TypescriptResponse": {
|
||||
"type": "object",
|
||||
"properties": { "types": { "type": "string" } },
|
||||
"required": ["types"]
|
||||
},
|
||||
"NetworkBanResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -1194,6 +1213,69 @@
|
||||
},
|
||||
"required": ["entitlement", "config", "status"]
|
||||
},
|
||||
"PgsodiumConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": { "root_key": { "type": "string" } },
|
||||
"required": ["root_key"]
|
||||
},
|
||||
"UpdatePgsodiumConfigBody": {
|
||||
"type": "object",
|
||||
"properties": { "root_key": { "type": "string" } },
|
||||
"required": ["root_key"]
|
||||
},
|
||||
"PostgrestConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"max_rows": { "type": "integer" },
|
||||
"db_schema": { "type": "string" },
|
||||
"db_extra_search_path": { "type": "string" }
|
||||
},
|
||||
"required": ["max_rows", "db_schema", "db_extra_search_path"]
|
||||
},
|
||||
"UpdatePostgrestConfigBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"max_rows": { "type": "integer", "minimum": 0, "maximum": 1000000 },
|
||||
"db_extra_search_path": { "type": "string" },
|
||||
"db_schema": { "type": "string" }
|
||||
}
|
||||
},
|
||||
"SecretResponse": {
|
||||
"type": "object",
|
||||
"properties": { "name": { "type": "string" }, "value": { "type": "string" } },
|
||||
"required": ["name", "value"]
|
||||
},
|
||||
"CreateSecretBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": { "type": "string" },
|
||||
"value": { "type": "string", "pattern": "/^(?!SUPABASE_).*/" }
|
||||
},
|
||||
"required": ["name", "value"]
|
||||
},
|
||||
"SslEnforcements": {
|
||||
"type": "object",
|
||||
"properties": { "database": { "type": "boolean" } },
|
||||
"required": ["database"]
|
||||
},
|
||||
"SslEnforcementResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"currentConfig": { "$ref": "#/components/schemas/SslEnforcements" },
|
||||
"appliedSuccessfully": { "type": "boolean" }
|
||||
},
|
||||
"required": ["currentConfig", "appliedSuccessfully"]
|
||||
},
|
||||
"SslEnforcementRequest": {
|
||||
"type": "object",
|
||||
"properties": { "requestedConfig": { "$ref": "#/components/schemas/SslEnforcements" } },
|
||||
"required": ["requestedConfig"]
|
||||
},
|
||||
"TypescriptResponse": {
|
||||
"type": "object",
|
||||
"properties": { "types": { "type": "string" } },
|
||||
"required": ["types"]
|
||||
},
|
||||
"VanitySubdomainConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -809,7 +809,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 315,
|
||||
"line": 327,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -821,7 +821,7 @@
|
||||
"kindString": "Call signature",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Listen to messages."
|
||||
"shortText": "Creates an event handler that listens to changes"
|
||||
},
|
||||
"parameters": [
|
||||
{
|
||||
@@ -830,6 +830,9 @@
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Realtime feature (broadcast, presence, or postgres_changes)"
|
||||
},
|
||||
"type": {
|
||||
"type": "literal",
|
||||
"value": "broadcast"
|
||||
@@ -841,6 +844,9 @@
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Pre-defined and custom values specific to the Realtime feature"
|
||||
},
|
||||
"type": {
|
||||
"type": "reflection",
|
||||
"declaration": {
|
||||
@@ -856,10 +862,13 @@
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Event to listen to. If listening to postgres_changes type\nthen this value is one of INSERT, UPDATE, DELETE, *"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 317,
|
||||
"line": 329,
|
||||
"character": 14
|
||||
}
|
||||
],
|
||||
@@ -885,6 +894,9 @@
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Function to be invoked when event handler is triggered\n"
|
||||
},
|
||||
"type": {
|
||||
"type": "reflection",
|
||||
"declaration": {
|
||||
@@ -925,7 +937,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 320,
|
||||
"line": 332,
|
||||
"character": 6
|
||||
}
|
||||
],
|
||||
@@ -943,7 +955,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 319,
|
||||
"line": 331,
|
||||
"character": 6
|
||||
}
|
||||
],
|
||||
@@ -1045,7 +1057,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 326,
|
||||
"line": 338,
|
||||
"character": 14
|
||||
}
|
||||
],
|
||||
@@ -1144,7 +1156,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 331,
|
||||
"line": 343,
|
||||
"character": 14
|
||||
}
|
||||
],
|
||||
@@ -1257,7 +1269,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 336,
|
||||
"line": 348,
|
||||
"character": 14
|
||||
}
|
||||
],
|
||||
@@ -1911,7 +1923,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 367,
|
||||
"line": 379,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -1947,7 +1959,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 368,
|
||||
"line": 380,
|
||||
"character": 15
|
||||
}
|
||||
],
|
||||
@@ -2298,7 +2310,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 407,
|
||||
"line": 419,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -2443,7 +2455,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeChannel.ts",
|
||||
"line": 394,
|
||||
"line": 406,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3246,7 +3258,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 218,
|
||||
"line": 228,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3330,7 +3342,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 198,
|
||||
"line": 208,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3424,7 +3436,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 162,
|
||||
"line": 165,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3435,6 +3447,9 @@
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Returns all created channels"
|
||||
},
|
||||
"type": {
|
||||
"type": "array",
|
||||
"elementType": {
|
||||
@@ -3455,7 +3470,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 214,
|
||||
"line": 224,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3485,7 +3500,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 191,
|
||||
"line": 201,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3553,7 +3568,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 236,
|
||||
"line": 246,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3607,7 +3622,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 177,
|
||||
"line": 187,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3618,6 +3633,9 @@
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Unsubscribes and removes all channels"
|
||||
},
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"typeArguments": [
|
||||
@@ -3646,7 +3664,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 166,
|
||||
"line": 173,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
@@ -3657,6 +3675,9 @@
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "Unsubscribes and removes a single channel"
|
||||
},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 354,
|
||||
@@ -3664,6 +3685,9 @@
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
"flags": {},
|
||||
"comment": {
|
||||
"shortText": "A RealtimeChannel instance\n"
|
||||
},
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 55,
|
||||
@@ -3696,7 +3720,7 @@
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "RealtimeClient.ts",
|
||||
"line": 263,
|
||||
"line": 273,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
|
||||
@@ -3594,7 +3594,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Automatically refreshes the token for logged in users."
|
||||
"shortText": "Automatically refreshes the token for logged-in users. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3617,7 +3617,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks."
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3640,7 +3640,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Whether to persist a logged in session to storage."
|
||||
"shortText": "Whether to persist a logged-in session to storage. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3663,7 +3663,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "A storage provider. Used to store the logged in session."
|
||||
"shortText": "A storage provider. Used to store the logged-in session."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3694,7 +3694,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Optional key name used for storing tokens in local storage"
|
||||
"shortText": "Optional key name used for storing tokens in local storage."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3735,7 +3735,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to 'public'."
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to `public`."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Automatically refreshes the token for logged in users."
|
||||
"shortText": "Automatically refreshes the token for logged-in users. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -306,7 +306,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks."
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -329,7 +329,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Whether to persist a logged in session to storage."
|
||||
"shortText": "Whether to persist a logged-in session to storage. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -352,7 +352,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "A storage provider. Used to store the logged in session."
|
||||
"shortText": "A storage provider. Used to store the logged-in session."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -383,7 +383,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Optional key name used for storing tokens in local storage"
|
||||
"shortText": "Optional key name used for storing tokens in local storage."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -424,7 +424,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to 'public'."
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to `public`."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -2598,7 +2598,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Automatically refreshes the token for logged in users."
|
||||
"shortText": "Automatically refreshes the token for logged-in users. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -2621,7 +2621,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks."
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -2644,7 +2644,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Whether to persist a logged in session to storage."
|
||||
"shortText": "Whether to persist a logged-in session to storage. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -2667,7 +2667,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "A storage provider. Used to store the logged in session."
|
||||
"shortText": "A storage provider. Used to store the logged-in session."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -2698,7 +2698,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Optional key name used for storing tokens in local storage"
|
||||
"shortText": "Optional key name used for storing tokens in local storage."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -2739,7 +2739,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to 'public'."
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to `public`."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3702,7 +3702,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Automatically refreshes the token for logged in users."
|
||||
"shortText": "Automatically refreshes the token for logged-in users. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3725,7 +3725,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks."
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3748,7 +3748,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Whether to persist a logged in session to storage."
|
||||
"shortText": "Whether to persist a logged-in session to storage. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3771,7 +3771,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "A storage provider. Used to store the logged in session."
|
||||
"shortText": "A storage provider. Used to store the logged-in session."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3802,7 +3802,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Optional key name used for storing tokens in local storage"
|
||||
"shortText": "Optional key name used for storing tokens in local storage."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -3843,7 +3843,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to 'public'."
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to `public`."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -4151,7 +4151,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Automatically refreshes the token for logged in users."
|
||||
"shortText": "Automatically refreshes the token for logged-in users. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -4174,7 +4174,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks."
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -4197,7 +4197,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Whether to persist a logged in session to storage."
|
||||
"shortText": "Whether to persist a logged-in session to storage. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -4220,7 +4220,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "A storage provider. Used to store the logged in session."
|
||||
"shortText": "A storage provider. Used to store the logged-in session."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -4251,7 +4251,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Optional key name used for storing tokens in local storage"
|
||||
"shortText": "Optional key name used for storing tokens in local storage."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -4292,7 +4292,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to 'public'."
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to `public`."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -5531,7 +5531,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Automatically refreshes the token for logged in users."
|
||||
"shortText": "Automatically refreshes the token for logged-in users. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -5554,7 +5554,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks."
|
||||
"shortText": "Detect a session from the URL. Used for OAuth login callbacks. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -5577,7 +5577,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Whether to persist a logged in session to storage."
|
||||
"shortText": "Whether to persist a logged-in session to storage. Defaults to true."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -5600,7 +5600,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "A storage provider. Used to store the logged in session."
|
||||
"shortText": "A storage provider. Used to store the logged-in session."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -5631,7 +5631,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Optional key name used for storing tokens in local storage"
|
||||
"shortText": "Optional key name used for storing tokens in local storage."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
@@ -5672,7 +5672,7 @@
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to 'public'."
|
||||
"shortText": "The Postgres schema which your tables belong to. Must be on the list of exposed schemas in Supabase. Defaults to `public`."
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
|
||||
@@ -11,11 +11,9 @@ info:
|
||||
title: 'GoTrue' # {string} A readable name.
|
||||
source: 'https://github.com/supabase/gotrue' # {string} Where developers can find the source code.
|
||||
bugs: 'https://github.com/supabase/gotrue/issues' # {string} Where developers can file bugs.
|
||||
spec: 'https://github.com/supabase/supabase/blob/master/web/spec/cli_config_001.yml' # {string} Where developers can find this spec (to link directly in the docs).
|
||||
spec: 'https://github.com/supabase/supabase/blob/master/spec/gotrue_v1_config.yaml' # {string} Where developers can find this spec (to link directly in the docs).
|
||||
description: |
|
||||
A `config.toml` file is generated after running `supabase init`.
|
||||
|
||||
This file is located in the `supabase` folder under `supabase/config.toml`.
|
||||
A `config.toml` file is generated after running `supabase init`. This file is located in the `supabase` folder under `supabase/config.toml`.
|
||||
tags:
|
||||
- id: general
|
||||
title: General
|
||||
@@ -30,3 +28,52 @@ parameters:
|
||||
# default: '5432'
|
||||
description: |
|
||||
A string used to distinguish different Supabase projects on the same host. Defaults to the working directory name when running `supabase init`.
|
||||
- id: 'GOTRUE_EXTERNAL_GITHUB' # {string} A unique identifier for this param.
|
||||
title: 'auth.external.github' # {string} Any name.
|
||||
tags: ['general'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
# default: '5432'
|
||||
description: |
|
||||
Describes whether the Github provider is enabled or not.
|
||||
- id: 'GOTRUE_SITE_URL' # {string} A unique identifier for this param.
|
||||
title: 'auth.site_url' # {string} Any name.
|
||||
tags: ['general'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
The base URL of your website. Used as an allow-list for redirects and for constructing URLs used in emails.
|
||||
- id: 'GOTRUE_URI_ALLOW_LIST' # {string} A unique identifier for this param.
|
||||
title: 'auth.additional_redirect_urls' # {string} Any name.
|
||||
tags: ['general'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
A list of *exact* URLs that auth providers are permitted to redirect to post authentication.
|
||||
- id: 'GOTRUE_JWT_EXP' # {string} A unique identifier for this param.
|
||||
title: 'auth.jwt_expiry' # {string} Any name.
|
||||
tags: ['general'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one week).
|
||||
- id: 'GOTRUE_DISABLE_SIGNUP' # {string} A unique identifier for this param.
|
||||
title: 'auth.enable_signup' # {string} Any name.
|
||||
tags: ['general'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
Allow/disallow new user signups to your project.
|
||||
- id: 'GOTRUE_EXTERNAL_EMAIL_ENABLED' # {string} A unique identifier for this param.
|
||||
title: 'auth.email.enable_signup' # {string} Any name.
|
||||
tags: ['general', 'email'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
Allow/disallow new user signups via email to your project.
|
||||
- id: 'GOTRUE_MAILER_SECURE_EMAIL_CHANGE_ENABLED' # {string} A unique identifier for this param.
|
||||
title: 'auth.email.double_confirm_changes' # {string} Any name.
|
||||
tags: ['general', 'email'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
If enabled, a user will be required to confirm any email change on both the old, and new email addresses. If disabled, only the new email is required to confirm.
|
||||
- id: 'GOTRUE_MAILER_AUTOCONFIRM' # {string} A unique identifier for this param.
|
||||
title: 'auth.email.enable_confirmations' # {string} Any name.
|
||||
tags: ['general', 'email'] # {string[]} These tags are useful for grouping parameters
|
||||
required: true
|
||||
description: |
|
||||
If enabled, users need to confirm their email address before signing in.
|
||||
@@ -404,7 +404,7 @@ functions:
|
||||
const { data, error } = supabase.auth.setSession({
|
||||
access_token,
|
||||
refresh_token
|
||||
)
|
||||
})
|
||||
```
|
||||
- id: refresh-session
|
||||
title: 'refreshSession()'
|
||||
@@ -643,7 +643,7 @@ functions:
|
||||
- Defaults to return 50 users per page.
|
||||
examples:
|
||||
- id: get-a-full-list-of-users
|
||||
name: Get a full list of users
|
||||
name: Get a page of users
|
||||
isSpotlight: true
|
||||
code: |
|
||||
```js
|
||||
@@ -1062,7 +1062,7 @@ functions:
|
||||
If you're in a situation where your tables are **NOT** directly
|
||||
related, but instead are joined by a _join table_, you can still use
|
||||
the `select()` method to query the related data. The join table needs
|
||||
to have the foreign keys as part of its composite primary key.
|
||||
to have the foreign keys as part of its composite primary key.
|
||||
hideCodeBlock: true
|
||||
- id: query-the-same-foreign-table-multiple-times
|
||||
name: Query the same foreign table multiple times
|
||||
@@ -1564,7 +1564,7 @@ functions:
|
||||
```ts
|
||||
const { data, error } = await supabase
|
||||
.from('users')
|
||||
.upsert({ id: 42, handle: 'saoirse', display_name: 'Saoirse' })
|
||||
.upsert({ id: 42, handle: 'saoirse', display_name: 'Saoirse' }, { onConflict: 'handle' })
|
||||
.select()
|
||||
```
|
||||
data:
|
||||
|
||||