mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 18:05:11 +03:00
Revert "Studio deploy"
This commit is contained in:
1 parent
b0b953fcc8
commit
f2e253df7e
152 files changed
+24698
-31658
No files matched your search
@@ -1,20 +0,0 @@
|
||||
name: reviewdog
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, edited]
|
||||
|
||||
jobs:
|
||||
misspell:
|
||||
name: runner / misspell
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out code.
|
||||
uses: actions/checkout@v1
|
||||
- name: misspell
|
||||
uses: reviewdog/action-misspell@v1
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
locale: "US"
|
||||
reporter: github-pr-review
|
||||
level: error
|
||||
exclude: "*.css"
|
||||
@@ -6,7 +6,6 @@ import { Button, IconCheck, IconCopy } from 'ui'
|
||||
|
||||
import js from 'react-syntax-highlighter/dist/cjs/languages/hljs/javascript'
|
||||
import ts from 'react-syntax-highlighter/dist/cjs/languages/hljs/typescript'
|
||||
import csharp from 'react-syntax-highlighter/dist/cjs/languages/hljs/csharp'
|
||||
import py from 'react-syntax-highlighter/dist/cjs/languages/hljs/python'
|
||||
import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'
|
||||
import bash from 'react-syntax-highlighter/dist/cjs/languages/hljs/bash'
|
||||
@@ -18,7 +17,7 @@ import { useTheme } from 'common/Providers'
|
||||
|
||||
interface Props {
|
||||
title?: string
|
||||
language: 'js' | 'jsx' | 'sql' | 'py' | 'bash' | 'ts' | 'dart' | 'json' | 'csharp'
|
||||
language: 'js' | 'jsx' | 'sql' | 'py' | 'bash' | 'ts' | 'dart' | 'json'
|
||||
linesToHighlight?: number[]
|
||||
hideCopy?: boolean
|
||||
hideLineNumbers?: boolean
|
||||
@@ -63,7 +62,6 @@ const CodeBlock: FC<Props> = ({
|
||||
SyntaxHighlighter.registerLanguage('sql', sql)
|
||||
SyntaxHighlighter.registerLanguage('bash', bash)
|
||||
SyntaxHighlighter.registerLanguage('dart', dart)
|
||||
SyntaxHighlighter.registerLanguage('csharp', csharp)
|
||||
SyntaxHighlighter.registerLanguage('json', json)
|
||||
|
||||
const large = false
|
||||
|
||||
@@ -94,12 +94,6 @@ const home = [
|
||||
href: '/reference/dart/introduction',
|
||||
level: 'reference_dart',
|
||||
},
|
||||
{
|
||||
label: 'C#',
|
||||
icon: '/img/icons/menu/reference-csharp',
|
||||
href: '/reference/csharp/introduction',
|
||||
level: 'reference_csharp',
|
||||
},
|
||||
{
|
||||
label: 'Python',
|
||||
icon: '/img/icons/menu/reference-python',
|
||||
|
||||
@@ -22,12 +22,6 @@ export const REFERENCES: References = {
|
||||
versions: ['v1', 'v0'],
|
||||
icon: '/docs/img/libraries/flutter-icon.svg',
|
||||
},
|
||||
csharp: {
|
||||
name: 'C#',
|
||||
library: 'supabase-csharp',
|
||||
versions: ['v0'],
|
||||
icon: '/docs/img/libraries/c-sharp-icon.svg',
|
||||
},
|
||||
cli: {
|
||||
name: 'CLI',
|
||||
library: undefined,
|
||||
@@ -745,20 +739,6 @@ export const reference = {
|
||||
items: [],
|
||||
icon: '/img/icons/menu/reference-dart',
|
||||
},
|
||||
{
|
||||
name: 'supabase-csharp',
|
||||
url: '/reference/csharp/start',
|
||||
level: 'reference_csharp',
|
||||
items: [],
|
||||
icon: '/img/icons/menu/reference-csharp',
|
||||
},
|
||||
{
|
||||
name: 'supbase-python',
|
||||
url: '/reference/python/start',
|
||||
level: 'reference_python',
|
||||
items: [],
|
||||
icon: 'docs/img/icons/javascript.svg',
|
||||
},
|
||||
// {
|
||||
// name: 'supabase-python',
|
||||
// url: '/reference/python/start',
|
||||
@@ -808,7 +788,6 @@ export const reference_dart_v0 = {
|
||||
url: '/guides/reference/dart',
|
||||
parent: '/reference',
|
||||
}
|
||||
|
||||
export const reference_dart_v1 = {
|
||||
icon: 'reference-dart',
|
||||
title: 'Flutter',
|
||||
@@ -816,14 +795,6 @@ export const reference_dart_v1 = {
|
||||
parent: '/reference',
|
||||
}
|
||||
|
||||
|
||||
export const reference_csharp_v0 = {
|
||||
icon: 'reference-csharp',
|
||||
title: 'c#',
|
||||
url: 'guides/reference/csharp',
|
||||
parent: '/reference',
|
||||
}
|
||||
|
||||
export const reference_python_v2 = {
|
||||
icon: 'reference-python',
|
||||
title: 'Python',
|
||||
@@ -924,13 +895,6 @@ export const references = [
|
||||
icon: '/docs/img/icons/dart-icon.svg',
|
||||
url: '/reference/dart/start',
|
||||
},
|
||||
{
|
||||
label: 'supabase-csharp',
|
||||
versions: ['v0'],
|
||||
description: 'something about the reference',
|
||||
icon: '/docs/img/icons/c-sharp-icon.svg',
|
||||
url: '/reference/csharp/start',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -12,8 +12,6 @@ import spec_dart_v1 from '~/../../spec/supabase_dart_v1.yml' assert { type: 'yml
|
||||
// @ts-expect-error
|
||||
import spec_dart_v0 from '~/../../spec/supabase_dart_v0.yml' assert { type: 'yml' }
|
||||
// @ts-expect-error
|
||||
import spec_csharp_v0 from '~/../../spec/supabase_csharp_v0.yml' assert { type: 'yml' }
|
||||
// @ts-expect-error
|
||||
import spec_python_v2 from '~/../../spec/supabase_py_v2.yml' assert { type: 'yml' }
|
||||
|
||||
// import { gen_v3 } from '~/lib/refGenerator/helpers'
|
||||
@@ -52,7 +50,6 @@ export type RefIdOptions =
|
||||
| 'reference_javascript_v2'
|
||||
| 'reference_dart_v0'
|
||||
| 'reference_dart_v1'
|
||||
| 'reference_csharp_v0'
|
||||
| 'reference_python_v2'
|
||||
| 'reference_cli'
|
||||
| 'reference_api'
|
||||
@@ -63,7 +60,6 @@ export type RefIdOptions =
|
||||
export type RefKeyOptions =
|
||||
| 'javascript'
|
||||
| 'dart'
|
||||
| 'csharp'
|
||||
| 'python'
|
||||
| 'cli'
|
||||
| 'api'
|
||||
@@ -128,10 +124,6 @@ const NavigationMenu = () => {
|
||||
case url.includes(`/docs/reference/dart`) && url:
|
||||
menuState.setMenuLevelId('reference_dart_v1')
|
||||
break
|
||||
// C# v0 (latest)
|
||||
case url.includes(`/docs/reference/csharp`) && url:
|
||||
menuState.setMenuLevelId('reference_csharp_v0')
|
||||
break
|
||||
// puthon v2 (latest)
|
||||
case url.includes(`/docs/reference/python`) && url:
|
||||
menuState.setMenuLevelId('reference_python_v2')
|
||||
@@ -189,7 +181,6 @@ const NavigationMenu = () => {
|
||||
const isReference_Javascript_V2 = 'reference_javascript_v2' === level
|
||||
const isReference_Dart_V0 = 'reference_dart_v0' === level
|
||||
const isReference_Dart_V1 = 'reference_dart_v1' === level
|
||||
const isReference_Csharp_V0 = 'reference_csharp_v0' === level
|
||||
const isReference_Python_V2 = 'reference_python_v2' === level
|
||||
const isReference_Cli = 'reference_cli' === level
|
||||
const isReference_Api = 'reference_api' === level
|
||||
@@ -246,15 +237,6 @@ const NavigationMenu = () => {
|
||||
lib="dart"
|
||||
spec={spec_dart_v1}
|
||||
/>
|
||||
<NavigationMenuRefList
|
||||
key={'reference-csharp-menu-v0'}
|
||||
id={'reference_csharp_v0'}
|
||||
active={isReference_Csharp_V0}
|
||||
commonSections={libCommonSections}
|
||||
lib="csharp"
|
||||
spec={spec_csharp_v0}
|
||||
/>
|
||||
|
||||
<NavigationMenuRefList
|
||||
key={'reference-python-menu-v2'}
|
||||
id={'reference_python_v2'}
|
||||
@@ -262,7 +244,6 @@ const NavigationMenu = () => {
|
||||
commonSections={libCommonSections}
|
||||
lib="python"
|
||||
spec={spec_python_v2}
|
||||
|
||||
/>
|
||||
{/* // Tools */}
|
||||
<NavigationMenuRefList
|
||||
|
||||
@@ -122,8 +122,6 @@ const RefFunctionSection: React.FC<IRefFunctionSection> = (props) => {
|
||||
? 'ts'
|
||||
: example?.code?.startsWith('```dart')
|
||||
? 'dart'
|
||||
: example?.code?.startsWith('```c#')
|
||||
? 'csharp'
|
||||
: 'js'
|
||||
// `
|
||||
// import { createClient } from '@supabase/supabase-js'
|
||||
@@ -156,8 +154,7 @@ const RefFunctionSection: React.FC<IRefFunctionSection> = (props) => {
|
||||
.replace(/```/g, '')
|
||||
.replace('js', '')
|
||||
.replace('ts', '')
|
||||
.replace('dart', '')
|
||||
.replace('c#', ''))}
|
||||
.replace('dart', ''))}
|
||||
</CodeBlock>
|
||||
|
||||
{((tables && tables.length > 0) || sql) && (
|
||||
|
||||
@@ -468,13 +468,6 @@
|
||||
"installed_version": "1.1",
|
||||
"comment": "generate universally unique identifiers (UUIDs)"
|
||||
},
|
||||
{
|
||||
"name": "vector",
|
||||
"schema": "extensions",
|
||||
"default_version": "0.4.0",
|
||||
"installed_version": null,
|
||||
"comment": "vector data type with similarity search"
|
||||
},
|
||||
{
|
||||
"name": "xml2",
|
||||
"schema": null,
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
const Nav = [
|
||||
{
|
||||
label: 'Getting Started',
|
||||
items: [
|
||||
{ name: 'Supabase C# Library', url: '/reference/csharp', items: [] },
|
||||
{ name: 'Installing', url: '/reference/csharp/installing', items: [] },
|
||||
{ name: 'Initializing', url: '/reference/csharp/initializing', items: [] },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Auth',
|
||||
items: [
|
||||
{ name: 'signUp()', url: '/reference/csharp/auth-signup', items: [] },
|
||||
{
|
||||
name: 'signInWithPassword()',
|
||||
url: '/reference/csharp/auth-signinwithpassword',
|
||||
items: [],
|
||||
},
|
||||
{ name: 'signInWithOtp()', url: '/reference/csharp/auth-signinwithotp', items: [] },
|
||||
{ name: 'signInWithOAuth()', url: '/reference/csharp/auth-signinwithoauth', items: [] },
|
||||
{ name: 'signOut()', url: '/reference/csharp/auth-signout', items: [] },
|
||||
{ name: 'verifyOtp()', url: '/reference/csharp/auth-verifyotp', items: [] },
|
||||
{ name: 'currentSession', url: '/reference/csharp/auth-currentsession', items: [] },
|
||||
{ name: 'currentUser', url: '/reference/csharp/auth-currentuser', items: [] },
|
||||
{ name: 'updateUser()', url: '/reference/csharp/auth-updateuser', items: [] },
|
||||
{ name: 'onAuthStateChange()', url: '/reference/csharp/auth-onauthstatechange', items: [] },
|
||||
{
|
||||
name: 'resetPasswordForEmail()',
|
||||
url: '/reference/csharp/auth-resetpasswordforemail',
|
||||
items: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Functions',
|
||||
items: [{ name: 'invoke()', url: '/reference/csharp/invoke', items: [] }],
|
||||
},
|
||||
{
|
||||
label: 'Database',
|
||||
items: [
|
||||
{ name: 'Fetch data: select()', url: '/reference/csharp/select', items: [] },
|
||||
{ name: 'Create data: insert()', url: '/reference/csharp/insert', items: [] },
|
||||
{ name: 'Modify data: update()', url: '/reference/csharp/update', items: [] },
|
||||
{ name: 'Upsert data: upsert()', url: '/reference/csharp/upsert', items: [] },
|
||||
{ name: 'Delete data: delete()', url: '/reference/csharp/delete', items: [] },
|
||||
{ name: 'Stored Procedures: rpc()', url: '/reference/csharp/rpc', items: [] },
|
||||
{
|
||||
name: 'Filters',
|
||||
url: undefined,
|
||||
items: [
|
||||
{ name: 'Using Filters', url: '/reference/csharp/using-filters', items: [] },
|
||||
{ name: 'eq()', url: '/reference/csharp/eq', items: [] },
|
||||
{ name: 'neq()', url: '/reference/csharp/neq', items: [] },
|
||||
{ name: 'gt()', url: '/reference/csharp/gt', items: [] },
|
||||
{ name: 'gte()', url: '/reference/csharp/gte', items: [] },
|
||||
{ name: 'lt()', url: '/reference/csharp/lt', items: [] },
|
||||
{ name: 'lte()', url: '/reference/csharp/lte', items: [] },
|
||||
{ name: 'like()', url: '/reference/csharp/like', items: [] },
|
||||
{ name: 'ilike()', url: '/reference/csharp/ilike', items: [] },
|
||||
{ name: 'is_()', url: '/reference/csharp/is_', items: [] },
|
||||
{ name: 'in_()', url: '/reference/csharp/in_', items: [] },
|
||||
{ name: 'contains()', url: '/reference/csharp/contains', items: [] },
|
||||
{ name: 'containedBy()', url: '/reference/csharp/containedby', items: [] },
|
||||
{ name: 'rangeGt()', url: '/reference/csharp/rangegt', items: [] },
|
||||
{ name: 'rangeGte()', url: '/reference/csharp/rangegte', items: [] },
|
||||
{ name: 'rangeLt()', url: '/reference/csharp/rangelt', items: [] },
|
||||
{ name: 'rangeLte()', url: '/reference/csharp/rangelte', items: [] },
|
||||
{ name: 'rangeAdjacent()', url: '/reference/csharp/rangeadjacent', items: [] },
|
||||
{ name: 'overlaps()', url: '/reference/csharp/overlaps', items: [] },
|
||||
{ name: 'textSearch()', url: '/reference/csharp/textsearch', items: [] },
|
||||
{ name: 'match()', url: '/reference/csharp/match', items: [] },
|
||||
{ name: 'not()', url: '/reference/csharp/not', items: [] },
|
||||
{ name: 'or()', url: '/reference/csharp/or', items: [] },
|
||||
{ name: 'filter()', url: '/reference/csharp/filter', items: [] },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Modifiers',
|
||||
url: undefined,
|
||||
items: [
|
||||
{ name: 'Using Modifiers', url: '/reference/csharp/using-modifiers', items: [] },
|
||||
{ name: 'order()', url: '/reference/csharp/order', items: [] },
|
||||
{ name: 'limit()', url: '/reference/csharp/limit', items: [] },
|
||||
{ name: 'range()', url: '/reference/csharp/range', items: [] },
|
||||
{ name: 'single()', url: '/reference/csharp/single', items: [] },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Realtime',
|
||||
items: [
|
||||
{ name: 'stream()', url: '/reference/csharp/stream', items: [] },
|
||||
{ name: 'on().subscribe()', url: '/reference/csharp/subscribe', items: [] },
|
||||
{ name: 'removeChannel()', url: '/reference/csharp/removechannel', items: [] },
|
||||
{ name: 'removeAllChannels()', url: '/reference/csharp/removeallchannels', items: [] },
|
||||
{ name: 'getChannels()', url: '/reference/csharp/getchannels', items: [] },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Storage',
|
||||
items: [
|
||||
{ name: 'createBucket()', url: '/reference/csharp/storage-createbucket', items: [] },
|
||||
{ name: 'getBucket()', url: '/reference/csharp/storage-getbucket', items: [] },
|
||||
{ name: 'listBuckets()', url: '/reference/csharp/storage-listbuckets', items: [] },
|
||||
{ name: 'updateBucket()', url: '/reference/csharp/storage-updatebucket', items: [] },
|
||||
{ name: 'deleteBucket()', url: '/reference/csharp/storage-deletebucket', items: [] },
|
||||
{ name: 'emptyBucket()', url: '/reference/csharp/storage-emptybucket', items: [] },
|
||||
{ name: 'from.upload()', url: '/reference/csharp/storage-from-upload', items: [] },
|
||||
{ name: 'from.download()', url: '/reference/csharp/storage-from-download', items: [] },
|
||||
{ name: 'from.list()', url: '/reference/csharp/storage-from-list', items: [] },
|
||||
{ name: 'from.update()', url: '/reference/csharp/storage-from-update', items: [] },
|
||||
{ name: 'from.move()', url: '/reference/csharp/storage-from-move', items: [] },
|
||||
{ name: 'from.remove()', url: '/reference/csharp/storage-from-remove', items: [] },
|
||||
{
|
||||
name: 'from.createSignedUrl()',
|
||||
url: '/reference/csharp/storage-from-createsignedurl',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
name: 'from.createSignedUrls()',
|
||||
url: '/reference/csharp/storage-from-createsignedurls',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
name: 'from.getPublicUrl()',
|
||||
url: '/reference/csharp/storage-from-getpublicurl',
|
||||
items: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
export default Nav
|
||||
@@ -13,9 +13,6 @@ const nonGeneratedReferencePages = [
|
||||
'docs/reference/dart/initializing',
|
||||
'docs/reference/dart/v0/upgrade-guide',
|
||||
'docs/reference/dart/v0',
|
||||
'docs/reference/csharp',
|
||||
'docs/reference/csharp/installing',
|
||||
'docs/reference/csharp/initializing',
|
||||
'docs/reference/api',
|
||||
'docs/reference/api/release-notes',
|
||||
'docs/reference/cli',
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
---
|
||||
id: initializing
|
||||
title: 'Initializing'
|
||||
slug: initializing
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
### Initializing a new Client
|
||||
|
||||
<RefSubLayout.EducationRow>
|
||||
<RefSubLayout.Details>
|
||||
|
||||
Initializing a new client is pretty straightforward. Find your project url and public key from the
|
||||
admin panel and pass it into your client initialization function.
|
||||
|
||||
</RefSubLayout.Details>
|
||||
|
||||
<RefSubLayout.Examples>
|
||||
|
||||
<Tabs
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="csharp-init-standard">
|
||||
<TabPanel id="csharp-init-standard" label="Standard">
|
||||
|
||||
```csharp
|
||||
var url = Environment.GetEnvironmentVariable("SUPABASE_URL");
|
||||
var key = Environment.GetEnvironmentVariable("SUPABASE_KEY");
|
||||
|
||||
var options = new Supabase.SupabaseOptions
|
||||
{
|
||||
AutoConnectRealtime = true
|
||||
};
|
||||
|
||||
var supabase = new Supabase.Client(url, key, options);
|
||||
await supabase.InitializeAsync();
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
|
||||
<TabPanel id="csharp-init-maui" label="Dependency Injection (Maui-like)">
|
||||
|
||||
```csharp
|
||||
public static MauiApp CreateMauiApp()
|
||||
{
|
||||
// ...
|
||||
var builder = MauiApp.CreateBuilder();
|
||||
|
||||
var url = Environment.GetEnvironmentVariable("SUPABASE_URL");
|
||||
var key = Environment.GetEnvironmentVariable("SUPABASE_KEY");
|
||||
var options = new SupabaseOptions
|
||||
{
|
||||
AutoRefreshToken = true,
|
||||
AutoConnectRealtime = true,
|
||||
SessionHandler = new SupabaseSessionHandler()
|
||||
};
|
||||
|
||||
// Note the creation as a singleton.
|
||||
builder.Services.AddSingleton(provider => new Supabase.Client(url, key, options));
|
||||
}
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
</RefSubLayout.Examples>
|
||||
</RefSubLayout.EducationRow>
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
id: installing
|
||||
title: 'Installing & Initialization'
|
||||
slug: installing
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
### Install from NuGet
|
||||
|
||||
<RefSubLayout.EducationRow>
|
||||
<RefSubLayout.Details>
|
||||
|
||||
You can install Supabase package from [nuget.org](https://www.nuget.org/packages/supabase-csharp/)
|
||||
|
||||
</RefSubLayout.Details>
|
||||
|
||||
<RefSubLayout.Examples>
|
||||
|
||||
<Tabs
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="csharp">
|
||||
<TabPanel id="csharp" label="Terminal">
|
||||
|
||||
```sh Terminal
|
||||
dotnet add package supabase-csharp
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
</RefSubLayout.Examples>
|
||||
</RefSubLayout.EducationRow>
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
id: introduction
|
||||
title: Introduction
|
||||
hideTitle: true
|
||||
---
|
||||
|
||||
<div className="flex items-start gap-6 not-prose" id="introduction">
|
||||
<img src="/docs/img/icons/menu/reference-csharp.svg" className="w-8 h-8 rounded" />
|
||||
<div className="flex flex-col gap-2">
|
||||
<h1 className="text-3xl text-scale-1200 m-0">C# Client Library</h1>
|
||||
<h2 className="text-base font-mono text-scale-1100">supabase-csharp</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="max-w-xl">
|
||||
This reference documents every object and method available in Supabase's C#
|
||||
library, [supabase-csharp](https://www.nuget.org/packages/supabase-csharp). You can
|
||||
use supabase-csharp to interact with your Postgres database, listen to database changes, invoke
|
||||
Deno Edge Functions, build login and user management functionality, and manage large files.
|
||||
</div>
|
||||
@@ -1,173 +0,0 @@
|
||||
---
|
||||
id: release-notes
|
||||
title: Release Notes
|
||||
---
|
||||
|
||||
## 0.7.0 - 2023-01-16
|
||||
|
||||
- Update dependency: postgrest-csharp@3.1.0
|
||||
- [Minor] Breaking API Change: `PrimaryKey` attribute defaults to `shouldInsert: false` as most uses will have the Database generate the primary key.
|
||||
- Merged [#60](https://github.com/supabase-community/postgrest-csharp/pull/60) which Added linq support for `Select`, `Where`, `OnConflict`, `Columns`, `Order`, `Update`, `Set`, and `Delete`
|
||||
|
||||
## 0.6.2 - 2022-11-22
|
||||
|
||||
- Update dependency: postgrest-csharp@3.0.4
|
||||
- `GetHeaders` is now passed to `ModeledResponse` and `BaseModel` so that the default `Update` and `Delete` methods use the latest credentials
|
||||
- `GetHeaders` is used in `Rpc` calls (re: [#39](https://github.com/supabase-community/supabase-csharp/issues/39))
|
||||
|
||||
## 0.6.1 - 2022-11-12
|
||||
|
||||
- [Hotfix] `GetHeaders` was not passing properly to `SupabaseTable` and `Gotrue.Api`
|
||||
|
||||
## 0.6.0 - 2022-11-12
|
||||
|
||||
[BREAKING CHANGES]
|
||||
|
||||
- `Client` is no longer a singleton, singleton interactions (if desired) are left to the developer to implement.
|
||||
- `Client` supports injection of dependent clients after initialization via property:
|
||||
- `Auth`
|
||||
- `Functions`
|
||||
- `Realtime`
|
||||
- `Postgrest`
|
||||
- `Storage`
|
||||
- `SupabaseModel` contains no logic but remains for backwards compatibility. (Marked `Obsolete`)
|
||||
- `ClientOptions.ShouldInitializeRealtime` was removed (no longer auto initialized)
|
||||
- `ClientOptions` now references an `ISupabaseSessionHandler` which specifies expected functionality for session persistence on Gotrue (replaces `ClientOptions.SessionPersistor`, `ClientOptions.SessionRetriever`, and `ClientOptions.SessionDestroyer`).
|
||||
- `supabase-csharp` and all child libraries now have support `nullity`
|
||||
|
||||
Other Changes:
|
||||
|
||||
- Update dependency: functions-csharp@1.2.1
|
||||
- Update dependency: gotrue-csharp@3.0.2
|
||||
- Update dependency: postgrest-csharp@3.0.2
|
||||
- Update dependency: realtime-csharp@4.0.1
|
||||
- Update dependency: supabase-storage-csharp@1.2.3
|
||||
- Update dependency: supabase-core@0.0.2
|
||||
|
||||
Big thank you to [@veleek](https://github.com/veleek) for his insight into these changes.
|
||||
|
||||
Re: [#35](https://github.com/supabase-community/supabase-csharp/issues/35), [#34](https://github.com/supabase-community/supabase-csharp/issues/34), [#23](https://github.com/supabase-community/supabase-csharp/issues/23), [#36](https://github.com/supabase-community/supabase-csharp/pull/36)
|
||||
|
||||
## 0.5.3 - 2022-10-11
|
||||
|
||||
- Update dependency: postgrest-csharp@2.1.0
|
||||
- [Minor] Breaking API change: Remove `BaseModel.PrimaryKeyValue` and `BaseModel.PrimaryKeyColumn` in favor of a `PrimaryKey` dictionary with support for composite keys.
|
||||
- Re: [#48](https://github.com/supabase-community/postgrest-csharp/issues/48) - Add support for derived models on `ReferenceAttribute`
|
||||
- Re: [#49](https://github.com/supabase-community/postgrest-csharp/issues/49) - Added `Match(T model)`
|
||||
|
||||
## 0.5.2 - 2022-9-13
|
||||
|
||||
- Update dependency: postgrest-csharp@2.0.12
|
||||
- Merged [#47](https://github.com/supabase-community/postgrest-csharp/pull/49) which added cancellation token support to `Table<T>` methods. Thanks [@devpikachu](https://github.com/devpikachu)!
|
||||
|
||||
## 0.5.1 - 2022-8-1
|
||||
|
||||
- Update dependency: postgrest-csharp@2.0.11
|
||||
- Update dependency: supabase-storage-csharp@1.1.1
|
||||
|
||||
## 0.5.0 - 2022-7-17
|
||||
|
||||
- Update dependency: postgrest-csharp@2.0.9
|
||||
- Update dependency: realtime-csharp@3.0.1
|
||||
- Update dependency: supabase-storage-csharp@1.1.0
|
||||
- API Change [Breaking/Minor] Library no longer uses `WebClient` and instead leverages `HttpClient`. Progress events on `Upload` and `Download` are now handled with `EventHandler<float>` instead of `WebClient` EventHandlers.
|
||||
|
||||
## 0.4.4 - 2022-5-24
|
||||
|
||||
- Update dependency: gotrue-csharp@2.4.5
|
||||
- Update dependency: postgrest-csharp@2.0.8
|
||||
|
||||
## 0.4.3 - 2022-5-13
|
||||
|
||||
- Update dependency: gotrue-csharp@2.4.4
|
||||
|
||||
## 0.4.2 - 2022-4-30
|
||||
|
||||
- Update dependency: gotrue-csharp@2.4.3
|
||||
|
||||
## 0.4.1 - 2022-4-23
|
||||
|
||||
- Update dependency: gotrue-csharp@2.4.2
|
||||
|
||||
## 0.4.0 - 2022-4-12
|
||||
|
||||
- Add support for functions-csharp@1.0.1, giving access to invoking Supabase's edge functions.
|
||||
- Update dependency: gotrue-csharp@2.4.1
|
||||
|
||||
## 0.3.5 - 2022-4-11
|
||||
|
||||
- Update dependency: postgres-csharp@2.0.7
|
||||
|
||||
## 0.3.4 - 2022-03-28
|
||||
|
||||
- Update dependency: gotrue-csharp@2.4.0
|
||||
|
||||
## 0.3.3 - 2022-02-27
|
||||
|
||||
- Update dependency: gotrue-csharp@2.3.6
|
||||
- Update dependency: supabase-storage-csharp@1.0.2
|
||||
|
||||
## 0.3.2 - 2022-02-18
|
||||
|
||||
- Update dependency: realtime-csharp@3.0.0
|
||||
- Exchange existing websocket client: [WebSocketSharp](https://github.com/sta/websocket-sharp) for [Marfusios/websocket-client](https://github.com/Marfusios/websocket-client) which adds support for Blazor WASM apps.
|
||||
Ref: [#14](https://github.com/supabase-community/realtime-csharp/pull/14)
|
||||
|
||||
## 0.3.1 - 2022-01-20
|
||||
|
||||
- Update dependency: gotrue-csharp@2.3.5
|
||||
- [#23](https://github.com/supabase-community/gotrue-csharp/pull/23) Added `redirect_url` option for MagicLink sign in (Thanks [@MisterJimson](https://github.com/MisterJimson))
|
||||
- [#21](https://github.com/supabase-community/gotrue-csharp/pull/21) Added SignOut method to Stateless Client (Thanks [@fplaras](https://github.com/fplaras))
|
||||
|
||||
## 0.3.0 - 2021-12-30
|
||||
|
||||
- Update dependency: postgrest-csharp@2.0.6
|
||||
- Add support for `NullValueHandling` to be specified on a `Column` Attribute and for it to be honored on Inserts and Updates. Defaults to: `NullValueHandling.Include`.
|
||||
- Implements [#38](https://github.com/supabase-community/postgrest-csharp/issues/38)
|
||||
- Update dependency: realtime-csharp@2.0.8
|
||||
- Implement Upstream Realtime RLS Error Broadcast Handler
|
||||
- Implements [#12](https://github.com/supabase-community/realtime-csharp/issues/12)
|
||||
- `SocketResponse` now exposes a method: `OldModel`, that hydrates the `OldRecord` property into a model.
|
||||
|
||||
## 0.2.12 - 2021-12-29
|
||||
|
||||
- Update dependency: gotrue-csharp@2.3.3
|
||||
- `SignUp` will return a `Session` with a _populated `User` object_ on an unconfirmed signup.
|
||||
- Fixes [#19](https://github.com/supabase-community/gotrue-csharp/issues/19)
|
||||
- Developers who were using a `null` check on `Session.User` will need to adjust accordingly.
|
||||
- Update dependency: postgrest-csharp@2.0.5
|
||||
- Fix for [#37](https://github.com/supabase-community/postgrest-csharp/issues/37) - Return Type `minimal` would fail to resolve because of incorrect `Accept` headers. Added header and test to verify for future.
|
||||
- Fix for [#36](https://github.com/supabase-community/postgrest-csharp/issues/36) - Inserting/Upserting bulk records would fail while doing an unnecessary generic coercion.
|
||||
|
||||
## 0.2.11 - 2021-12-24
|
||||
|
||||
- Update dependency: gotrue-csharp@2.3.2 (changes CreateUser parameters to conform to `AdminUserAttributes`)
|
||||
- See [#15](https://github.com/supabase-community/supabase-csharp/issues/15)
|
||||
- See [#16](https://github.com/supabase-community/supabase-csharp/issues/16)
|
||||
- Update dependency: realtime-csharp@2.0.7
|
||||
- See [#13](https://github.com/supabase-community/supabase-csharp/issues/13)
|
||||
|
||||
## 0.2.10 - 2021-12-23
|
||||
|
||||
- Update dependency: gotrue-csharp@2.3.0 (adds metadata support for user signup, see [#14](https://github.com/supabase/community/issues/14))
|
||||
|
||||
## 0.2.9 - 2021-12-9
|
||||
|
||||
- Separate Storage client from Supabase repo and into `storage-csharp`, `supabase-csharp` now references new repo.
|
||||
|
||||
## 0.2.8 - 2021-12-4
|
||||
|
||||
- Update gotrue-csharp to 2.2.4
|
||||
- Adds support for `ListUsers` (paginate, sort, filter), `GetUserById`, `CreateUser`, and `UpdateById`
|
||||
|
||||
## 0.2.7 - 2021-12-2
|
||||
|
||||
- Update gotrue-csharp to 2.2.3
|
||||
- Adds support for sending password resets to users.
|
||||
|
||||
## 0.2.6 - 2021-11-29
|
||||
|
||||
- Support for [#12](https://github.com/supabase-community/supabase-csharp/issues/12)
|
||||
- Update realtime-csharp to 2.0.6
|
||||
- Update gotrue-csharp to 2.2.2
|
||||
- Add `StatelessClient` re:[#7](https://github.com/supabase-community/supabase-csharp/issues/7)
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
id: release-notes
|
||||
title: Release Notes
|
||||
---
|
||||
|
||||
## dart v0 this is the release notes file.
|
||||
Whitespace-only changes.
@@ -1,67 +0,0 @@
|
||||
---
|
||||
id: initializing
|
||||
title: 'Initializing'
|
||||
slug: initializing
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
### Initializing a new Client
|
||||
|
||||
<RefSubLayout.EducationRow>
|
||||
<RefSubLayout.Details>
|
||||
|
||||
Initializing a new client is pretty straightforward. Find your project url and public key from the
|
||||
admin panel and pass it into your client initialization function.
|
||||
|
||||
</RefSubLayout.Details>
|
||||
|
||||
<RefSubLayout.Examples>
|
||||
|
||||
<Tabs
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="csharp-init-standard">
|
||||
<TabPanel id="csharp-init-standard" label="Standard">
|
||||
|
||||
```csharp
|
||||
var url = Environment.GetEnvironmentVariable("SUPABASE_URL");
|
||||
var key = Environment.GetEnvironmentVariable("SUPABASE_KEY");
|
||||
|
||||
var options = new Supabase.SupabaseOptions
|
||||
{
|
||||
AutoConnectRealtime = true
|
||||
};
|
||||
|
||||
var supabase = new Supabase.Client(url, key, options);
|
||||
await supabase.InitializeAsync();
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
|
||||
<TabPanel id="csharp-init-maui" label="Dependency Injection (Maui-like)">
|
||||
|
||||
```csharp
|
||||
public static MauiApp CreateMauiApp()
|
||||
{
|
||||
// ...
|
||||
var builder = MauiApp.CreateBuilder();
|
||||
|
||||
var url = Environment.GetEnvironmentVariable("SUPABASE_URL");
|
||||
var key = Environment.GetEnvironmentVariable("SUPABASE_KEY");
|
||||
var options = new SupabaseOptions
|
||||
{
|
||||
AutoRefreshToken = true,
|
||||
AutoConnectRealtime = true,
|
||||
SessionHandler = new SupabaseSessionHandler()
|
||||
};
|
||||
|
||||
// Note the creation as a singleton.
|
||||
builder.Services.AddSingleton(provider => new Supabase.Client(url, key, options));
|
||||
}
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
</RefSubLayout.Examples>
|
||||
</RefSubLayout.EducationRow>
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
id: installing
|
||||
title: 'Installing & Initialization'
|
||||
slug: installing
|
||||
custom_edit_url: https://github.com/supabase/supabase/edit/master/web/spec/supabase.yml
|
||||
---
|
||||
|
||||
### Install from NuGet
|
||||
|
||||
<RefSubLayout.EducationRow>
|
||||
<RefSubLayout.Details>
|
||||
|
||||
You can install Supabase package from [nuget.org](https://www.nuget.org/packages/supabase-csharp/)
|
||||
|
||||
</RefSubLayout.Details>
|
||||
|
||||
<RefSubLayout.Examples>
|
||||
|
||||
<Tabs
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="csharp">
|
||||
<TabPanel id="csharp" label="Terminal">
|
||||
|
||||
```sh Terminal
|
||||
dotnet add package supabase-csharp
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
</RefSubLayout.Examples>
|
||||
</RefSubLayout.EducationRow>
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
id: introduction
|
||||
title: Introduction
|
||||
hideTitle: true
|
||||
---
|
||||
|
||||
<div className="flex items-start gap-6 not-prose" id="introduction">
|
||||
<img src="/docs/img/icons/menu/reference-csharp.svg" className="w-8 h-8 rounded" />
|
||||
<div className="flex flex-col gap-2">
|
||||
<h1 className="text-3xl text-scale-1200 m-0">C# Client Library</h1>
|
||||
<h2 className="text-base font-mono text-scale-1100">supabase-csharp</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="max-w-xl">
|
||||
This reference documents every object and method available in Supabase's C#
|
||||
library, [supabase-csharp](https://www.nuget.org/packages/supabase-csharp). You can
|
||||
use supabase-csharp to interact with your Postgres database, listen to database changes, invoke
|
||||
Deno Edge Functions, build login and user management functionality, and manage large files.
|
||||
</div>
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
id: release-notes
|
||||
title: Release Notes
|
||||
---
|
||||
|
||||
## dart v0 this is the release notes file.
|
||||
@@ -19,7 +19,7 @@ const Layout: FC<Props> = (props: Props) => {
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<title>{props.meta?.title} | Supabase Docs</title>
|
||||
<title>{props.meta?.title} | Supabase</title>
|
||||
<meta name="description" content={props.meta?.description} />
|
||||
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
||||
<link rel="icon" href="/docs/favicon.ico" />
|
||||
|
||||
@@ -29,7 +29,7 @@ const levelsData = {
|
||||
},
|
||||
functions: {
|
||||
icon: '/docs/img/icons/menu/functions',
|
||||
name: 'Edge Functions',
|
||||
name: 'Functions',
|
||||
},
|
||||
realtime: {
|
||||
icon: '/docs/img/icons/menu/realtime',
|
||||
@@ -75,10 +75,6 @@ const levelsData = {
|
||||
icon: '/docs/img/icons/menu/reference-dart',
|
||||
name: 'Dart Reference v0.0',
|
||||
},
|
||||
reference_csharp_v0: {
|
||||
icon: '/docs/img/icons/menu/reference-csharp',
|
||||
name: 'C# Reference v0.0',
|
||||
},
|
||||
reference_python_v2: {
|
||||
icon: '/docs/img/icons/menu/reference-python',
|
||||
name: 'Python Reference v2.0',
|
||||
|
||||
@@ -65,19 +65,12 @@ const Layout: FC<Props> = (props) => {
|
||||
return (
|
||||
<>
|
||||
<NextSeo
|
||||
title={`${props.meta?.title} | Supabase Docs`}
|
||||
title={`${props.meta?.title} | Supabase`}
|
||||
description={props.meta?.description ? props.meta?.description : props.meta?.title}
|
||||
canonical={`https://supabase.com/docs${asPath}`}
|
||||
openGraph={{
|
||||
title: props.meta?.title,
|
||||
description: props.meta?.description,
|
||||
url: `https://supabase.com/docs${asPath}`,
|
||||
type: 'article',
|
||||
article: {
|
||||
publishedTime: new Date().toISOString(),
|
||||
modifiedTime: new Date().toISOString(),
|
||||
authors: ['Supabase'],
|
||||
},
|
||||
images: [
|
||||
{
|
||||
url: `https://obuldanrptloktxcffvn.functions.supabase.co/og-images?site=docs${
|
||||
@@ -89,6 +82,7 @@ const Layout: FC<Props> = (props) => {
|
||||
],
|
||||
}}
|
||||
/>
|
||||
|
||||
<div className={['grid grid-cols-12 relative gap-4'].join(' ')}>
|
||||
<div
|
||||
className={[
|
||||
|
||||
@@ -3,7 +3,7 @@ import type { NextRequest } from 'next/server'
|
||||
import isbot from 'isbot'
|
||||
|
||||
export function middleware(request: NextRequest) {
|
||||
const specs = ['javascript', 'dart', 'csharp']
|
||||
const specs = ['javascript', 'dart']
|
||||
|
||||
let version = ''
|
||||
if (request.url.includes('/v1/')) {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"lint": "next lint",
|
||||
"build:sitemap": "node ./internals/generate-sitemap.mjs",
|
||||
"postbuild": "ts-node ./scripts/build-search.ts && node ./internals/generate-sitemap.mjs",
|
||||
"generate:all": "npm-run-all --parallel gen:api gen:cli gen:gotrue gen:storage gen:supabase-dart:v0 gen:supabase-dart:v1 gen:supabase-csharp:v0 gen:supabase-js:v1 gen:supabase-js:v2 gen:realtime",
|
||||
"generate:all": "npm-run-all --parallel gen:api gen:cli gen:gotrue gen:storage gen:supabase-dart:v0 gen:supabase-dart:v1 gen:supabase-js:v1 gen:supabase-js:v2 gen:realtime",
|
||||
"gen:api": "npm-run-all gen:api:usage",
|
||||
"gen:api:usage": "ts-node ./generator/index.ts gen --type api --url https://api.supabase.com --input ../../spec/transforms/api_v0_openapi_deparsed.json --output ./docs/reference/api/generated/usage.mdx",
|
||||
"gen:cli": "npm-run-all gen:cli:commands gen:cli:config",
|
||||
@@ -25,8 +25,6 @@
|
||||
"gen:supabase-dart:v0:ref": "ts-node ./generator/index.ts gen --type legacy --input ../../spec/supabase_dart_v0.yml --output ./docs/reference/dart/v0/generated",
|
||||
"gen:supabase-dart:v1": "npm-run-all gen:supabase-dart:v1:ref",
|
||||
"gen:supabase-dart:v1:ref": "ts-node ./generator/index.ts gen --type legacy --input ../../spec/supabase_dart_v1.yml --output ./docs/reference/dart/generated",
|
||||
"gen:supabase-csharp:v0": "npm-run-all gen:supabase-csharp:v0:ref",
|
||||
"gen:supabase-csharp:v0:ref": "ts-node ./generator/index.ts gen --type legacy --input ../../spec/supabase_csharp_v0.yml --output ./docs/reference/csharp/generated",
|
||||
"gen:supabase-js:v1": "npm-run-all gen:supabase-js:v1:ref",
|
||||
"gen:supabase-js:v1:ref": "ts-node ./generator/index.ts gen --type legacy --input ../../spec/supabase_js_v1.yml --output ./docs/reference/javascript/v1/generated",
|
||||
"gen:supabase-js:v2": "npm-run-all gen:supabase-js:v2:ref",
|
||||
@@ -44,7 +42,6 @@
|
||||
"@radix-ui/react-accordion": "^1.0.1",
|
||||
"algoliasearch": "^4.14.2",
|
||||
"babel": "^6.23.0",
|
||||
"clsx": "^1.2.1",
|
||||
"common": "*",
|
||||
"config": "*",
|
||||
"gray-matter": "^4.0.3",
|
||||
@@ -66,7 +63,6 @@
|
||||
"react-intersection-observer": "^9.4.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-syntax-highlighter": "^15.3.1",
|
||||
"rehype-slug": "^5.1.0",
|
||||
"remark": "^14.0.2",
|
||||
"remark-admonitions": "^1.2.1",
|
||||
"remark-gfm": "^3.0.1",
|
||||
@@ -76,10 +72,10 @@
|
||||
"valtio": "^1.7.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"dotenv": "^16.0.3",
|
||||
"@types/node": "^17.0.12",
|
||||
"@types/react": "17.0.39",
|
||||
"config": "*",
|
||||
"dotenv": "^16.0.3",
|
||||
"ejs": "^3.1.8",
|
||||
"eslint": "8.9.0",
|
||||
"globby": "^12.0.2",
|
||||
@@ -93,4 +89,4 @@
|
||||
"tsconfig": "*",
|
||||
"typescript": "^4.5.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,6 @@ GraphQL in Supabase works through [pg_graphql](https://supabase.com/blog/pg-grap
|
||||
|
||||
Supabase provides a Realtime API using [Realtime](https://github.com/supabase/realtime). You can use this to listen to database changes over websockets.
|
||||
Realtime leverages PostgreSQL's built-in logical replication. You can manage your Realtime API simply by managing Postgres publications.
|
||||
Go to your project's [Replication section](https://app.supabase.com/project/_/database/replication) to get started.
|
||||
|
||||
## Getting started
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import Layout from '~/layouts/DefaultGuideLayout'
|
||||
|
||||
export const meta = {
|
||||
id: 'index',
|
||||
title: 'Auth Helpers Overview',
|
||||
title: 'Auth Helpers',
|
||||
description: 'A collection of framework-specific Auth utilities for working with Supabase.',
|
||||
sidebar_label: 'Overview',
|
||||
}
|
||||
|
||||
@@ -594,7 +594,7 @@ export const config = {
|
||||
|
||||
To make these helpers more flexible as well as more maintainable and easier to upgrade for new versions of Next.js, we're stripping them down to the most useful part which is managing the cookies and giving you an authenticated supabase-js client in any environment (client, server, middleware/edge).
|
||||
|
||||
Therefore we're marking the `withApiAuth`, `withPageAuth`, and `withMiddlewareAuth` higher order functions as deprecated and they will be removed in the next **minor** release (v0.6.X).
|
||||
Therefore we're marking the `withApiAuth`, `withPageAuth`, and `withMiddlewareAuth` higher order functions as deprectaed and they will be removed in the next **minor** release (v0.6.X).
|
||||
|
||||
Please follow the steps below to update your API routes, pages, and middleware handlers. Thanks!
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ If the trigger fails however, it could block the user sign ups - so make sure th
|
||||
For example:
|
||||
|
||||
```sql
|
||||
-- inserts a row into public.profiles
|
||||
-- inserts a row into public.users
|
||||
create function public.handle_new_user()
|
||||
returns trigger
|
||||
language plpgsql
|
||||
|
||||
@@ -2,7 +2,7 @@ import Layout from '~/layouts/DefaultGuideLayout'
|
||||
|
||||
export const meta = {
|
||||
id: 'extensions',
|
||||
title: 'Postgres Extensions Overview',
|
||||
title: 'Overview',
|
||||
description: 'Using Postgres extensions.',
|
||||
}
|
||||
|
||||
|
||||
@@ -3,16 +3,16 @@ import Layout from '~/layouts/DefaultGuideLayout'
|
||||
export const meta = {
|
||||
id: 'functions-cors',
|
||||
title: 'CORS (Cross-Origin Resource Sharing)',
|
||||
description: 'Add CORS headers to invoke Edge Functions from the browser.',
|
||||
description: 'Add CORS headers to invoke functions from the browser.',
|
||||
}
|
||||
|
||||
To invoke edge functions from the browser, you need to handle [CORS Preflight](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request) requests.
|
||||
To invoke the functions from the browser, you need to handle [CORS Preflight](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request) requests.
|
||||
|
||||
See the [example on GitHub](https://github.com/supabase/supabase/blob/master/examples/edge-functions/supabase/functions/browser-with-cors/index.ts).
|
||||
|
||||
### Recommended setup
|
||||
|
||||
We recommend adding a `cors.ts` file within a [`_shared` folder](/docs/guides/functions/quickstart#organizing-your-edge-functions) which makes it easy to reuse the CORS headers across functions:
|
||||
We recommend adding a `corst.ts` file within a [`_shared` folder](/docs/guides/functions/quickstart#organizing-your-edge-functions) which makes it easy to reuse the CORS headers across functions:
|
||||
|
||||
```ts cors.ts
|
||||
export const corsHeaders = {
|
||||
|
||||
@@ -2,8 +2,8 @@ import Layout from '~/layouts/DefaultGuideLayout'
|
||||
|
||||
export const meta = {
|
||||
id: 'functions-debugging',
|
||||
title: 'Debugging Edge Functions',
|
||||
description: 'Debug Edge Functions in production.',
|
||||
title: 'Debugging Functions',
|
||||
description: 'Debug functions in production.',
|
||||
}
|
||||
|
||||
You can debug your deployed Edge Functions using the ["Functions" section](https://app.supabase.com/project/_/functions) of the Dashboard. There are two debugging tools available:
|
||||
|
||||
@@ -8,7 +8,7 @@ export const meta = {
|
||||
|
||||
<div class="video-container">
|
||||
<iframe
|
||||
src="https://www.youtube-nocookie.com/embed/l2KlzGrhB6w"
|
||||
src="https://www.youtube-nocookie.com/embed/6OMVWiiycLs"
|
||||
frameBorder="1"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
|
||||
@@ -6,15 +6,6 @@ export const meta = {
|
||||
description: 'Using Import Maps.',
|
||||
}
|
||||
|
||||
<div class="video-container">
|
||||
<iframe
|
||||
src="https://www.youtube-nocookie.com/embed/ILr3cneZuFk"
|
||||
frameBorder="1"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
Since [Supabase CLI](https://supabase.com/docs/guides/resources/supabase-cli) version `1.33.0` [import maps](https://deno.land/manual@v1.29.2/node/import_maps) can be used with Supabase Edge Functions.
|
||||
|
||||
[Import maps](https://github.com/WICG/import-maps#the-import-map) is a web-platform standard that allows you to use bare specifiers with Deno without having to install the Node.js package locally.
|
||||
|
||||
@@ -3,7 +3,7 @@ import Layout from '~/layouts/DefaultGuideLayout'
|
||||
export const meta = {
|
||||
id: 'functions-local-development',
|
||||
title: 'Local Development',
|
||||
description: 'Run your Edge Functions locally.',
|
||||
description: 'Run your functions locally.',
|
||||
}
|
||||
|
||||
You can run your Edge Function locally using [`supabase functions serve`](/docs/reference/cli/usage#supabase-functions-serve):
|
||||
@@ -15,9 +15,9 @@ supabase functions serve hello-world # start the Function watcher
|
||||
|
||||
The `functions serve` command has hot-reloading capabilities. It will watch for any changes to your files and restart the Deno server.
|
||||
|
||||
### Invoking Edge Functions locally
|
||||
### Invoking functions locally
|
||||
|
||||
While serving your local Edge Function, you can invoke it using curl:
|
||||
While serving your local Function, you can invoke it using curl:
|
||||
|
||||
```bash
|
||||
curl --request POST 'http://localhost:54321/functions/v1/hello-world' \
|
||||
@@ -44,7 +44,7 @@ const { data, error } = await supabase.functions.invoke('hello-world', {
|
||||
|
||||
You should see the response `{ "message":"Hello Functions!" }`.
|
||||
|
||||
If you execute the function with a different payload the response will change. <br />
|
||||
If you execute Function with a different payload the response will change. <br />
|
||||
Modify the `--data '{"name":"Functions"}'` line to `--data '{"name":"World"}'` and try invoking the command again!
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
@@ -28,7 +28,7 @@ Follow the steps to prepare your Supabase project on your local machine.
|
||||
- Link to your Remote Project using the command `supabase link --project-ref your-project-ref`. [Docs](/docs/reference/cli/usage#supabase-link).
|
||||
- Optional: Setup your environment: Follow [this setup guide](https://deno.land/manual/getting_started/setup_your_environment) to integrate the Deno language server with your editor.
|
||||
|
||||
## Create an Edge Function
|
||||
## Create a function
|
||||
|
||||
Let's create a new Edge Function called `hello-world` inside your project:
|
||||
|
||||
|
||||
@@ -2,17 +2,17 @@ import Layout from '~/layouts/DefaultGuideLayout'
|
||||
|
||||
export const meta = {
|
||||
id: 'schedule-functions',
|
||||
title: 'Schedule Edge Functions',
|
||||
description: 'Schedule Edge Functions with pg_cron.',
|
||||
title: 'Schedule Functions',
|
||||
description: 'Schedule Functions with pg_cron.',
|
||||
}
|
||||
|
||||
The hosted Supabase Platform supports the [`pg_cron` extension](/docs/guides/database/extensions/pgcron), a simple cron-based job scheduler for PostgreSQL that runs inside the database.
|
||||
|
||||
In combination with the [`pg_net` extension](/docs/guides/database/extensions/pgnet), this allows us to invoke Edge Functions periodically on a set schedule.
|
||||
In combination with the [`pg_net` extension](/docs/guides/database/extensions/pgnet), this allows us to invoke functions periodically on a set schedule.
|
||||
|
||||
## Examples
|
||||
|
||||
### Invoke an Edge Function every minute
|
||||
### Invoke Function every minute
|
||||
|
||||
Make a POST request to a Supabase Edge Function every minute:
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ VITE_SUPABASE_URL=YOUR_SUPABASE_URL
|
||||
VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY
|
||||
```
|
||||
|
||||
With the API credentials in place, create an `src/supabase.js` helper file to initialize the Supabase client. These variables are exposed
|
||||
Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed
|
||||
on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database.
|
||||
|
||||
```js title=src/supabase.js
|
||||
@@ -66,7 +66,7 @@ Optionally, update [src/style.css](https://raw.githubusercontent.com/supabase/su
|
||||
|
||||
### Set up a Login component
|
||||
|
||||
Set up an `src/components/Auth.vue` component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords.
|
||||
Let's set up a Vue component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords.
|
||||
|
||||
```html title=/src/components/Auth.vue
|
||||
<script setup>
|
||||
@@ -118,7 +118,7 @@ Set up an `src/components/Auth.vue` component to manage logins and sign ups. We'
|
||||
### Account page
|
||||
|
||||
After a user is signed in we can allow them to edit their profile details and manage their account.
|
||||
Create a new `src/components/Account.vue` component to handle this.
|
||||
Let's create a new component for that called `Account.vue`.
|
||||
|
||||
```html title=src/components/Account.vue
|
||||
<script setup>
|
||||
@@ -277,7 +277,7 @@ Every Supabase project is configured with [Storage](/docs/guides/storage) for ma
|
||||
|
||||
### Create an upload widget
|
||||
|
||||
Create a new `src/components/Avatar.vue` component that allows users to upload profile photos:
|
||||
Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component:
|
||||
|
||||
```html title=src/components/Avatar.vue
|
||||
<script setup>
|
||||
@@ -361,7 +361,7 @@ Create a new `src/components/Avatar.vue` component that allows users to upload p
|
||||
|
||||
### Add the new widget
|
||||
|
||||
And then we can add the widget to the Account page in `src/components/Account.vue`:
|
||||
And then we can add the widget to the Account page:
|
||||
|
||||
```html title=src/components/Account.vue
|
||||
<script>
|
||||
|
||||
@@ -19,11 +19,15 @@ This value is also reported in the [database settings page](https://app.supabase
|
||||
|
||||
## Database storage management
|
||||
|
||||
Supabase uses network-attached storage to balance performance with scalability. For Pro and Enterprise projects, database storage expands ~1.5x automatically (e.g., 8GB -> 12GB) when you reach 90% of the database storage quota. Automatic database storage expansion can only occur once every six hours. Pro projects can store up to 1024TB.
|
||||
Your project will be changed to read-only mode once it reaches 95% of your subscription quota, preventing further writes to your project.
|
||||
In read-only mode, clients will encounter errors such as `cannot execute INSERT in a read-only transaction`.
|
||||
|
||||
All projects enter read-only mode when you reach 95% of the database storage quota. In read-only mode, clients will encounter errors such as `cannot execute INSERT in a read-only transaction`. Regular operation (read-write mode) is automatically re-enabled once usage is below 95% of the database storage quota.
|
||||
Regular operation (read-write mode) is automatically re-enabled once database storage usage falls under 95%.
|
||||
|
||||
If you need more than 1024TB of database storage or require multiple storage expansions in a short period of time, [contact us](https://app.supabase.com/support/new) to learn more about the Enterprise plan.
|
||||
If you are on Pro or Enterprise, database storage expands automatically, however you may also encounter this error if fill the database faster than it can expand.
|
||||
|
||||
Supabase uses network-attached storage, which balances performance with scalability. Pro projects can store up to 1024TB.
|
||||
If you intend to grow beyond this, reach out to our team to learn more about our Enterprise tier.
|
||||
|
||||
### Increasing available database storage
|
||||
|
||||
|
||||
@@ -38,7 +38,8 @@ export default function Config() {
|
||||
<div className="mt-8">
|
||||
<div>
|
||||
<Heading tag="h2" parseAnchors={false} customAnchor={parameter.id}>
|
||||
<code>{parameter.title}</code>
|
||||
<span className="mr-2">$</span>
|
||||
{parameter.title}
|
||||
</Heading>
|
||||
<div className="grid">
|
||||
<div className="border-b pb-8" key={parameter.id}>
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
import clientLibsCommonSections from '~/../../spec/common-client-libs-sections.json'
|
||||
// @ts-expect-error
|
||||
import spec from '~/../../spec/supabase_csharp_v0.yml' assert { type: 'yml' }
|
||||
import RefSectionHandler from '~/components/reference/RefSectionHandler'
|
||||
import { flattenSections } from '~/lib/helpers'
|
||||
import handleRefGetStaticPaths from '~/lib/mdx/handleRefStaticPaths'
|
||||
import handleRefStaticProps from '~/lib/mdx/handleRefStaticProps'
|
||||
|
||||
const sections = flattenSections(clientLibsCommonSections)
|
||||
|
||||
export default function JSReference(props) {
|
||||
return <RefSectionHandler sections={sections} spec={spec} pageProps={props} type="client-lib" />
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return handleRefStaticProps(sections, '/csharp')
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return handleRefGetStaticPaths()
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
import clientLibsCommonSections from '~/../../spec/common-client-libs-sections.json'
|
||||
import typeSpec from '~/../../spec/enrichments/tsdoc_v2/combined.json'
|
||||
// @ts-expect-error
|
||||
import spec from '~/../../spec/supabase_csharp_v0.yml' assert { type: 'yml' }
|
||||
import RefSectionHandler from '~/components/reference/RefSectionHandler'
|
||||
import { flattenSections } from '~/lib/helpers'
|
||||
import handleRefGetStaticPaths from '~/lib/mdx/handleRefStaticPaths'
|
||||
import handleRefStaticProps from '~/lib/mdx/handleRefStaticProps'
|
||||
import { useRouter } from 'next/router'
|
||||
import RefSEO from '~/components/reference/RefSEO'
|
||||
|
||||
const sections = flattenSections(clientLibsCommonSections)
|
||||
|
||||
export default function JSReference(props) {
|
||||
const router = useRouter()
|
||||
const slug = router.query.slug[0]
|
||||
const filteredSection = sections.filter((section) => section.id === slug)
|
||||
|
||||
const pageTitle = filteredSection[0]?.title
|
||||
? `${filteredSection[0]?.title} | Supabase`
|
||||
: 'Supabase'
|
||||
|
||||
return (
|
||||
<>
|
||||
<RefSEO title={pageTitle} />
|
||||
|
||||
<RefSectionHandler
|
||||
sections={filteredSection}
|
||||
spec={spec}
|
||||
typeSpec={typeSpec}
|
||||
pageProps={props}
|
||||
type="client-lib"
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return handleRefStaticProps(sections, '/csharp')
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return handleRefGetStaticPaths()
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
import clientLibsCommonSections from '~/../../spec/common-client-libs-sections.json'
|
||||
// @ts-expect-error
|
||||
import spec from '~/../../spec/supabase_csharp_v0.yml' assert { type: 'yml' }
|
||||
import RefSectionHandler from '~/components/reference/RefSectionHandler'
|
||||
import { flattenSections } from '~/lib/helpers'
|
||||
import handleRefGetStaticPaths from '~/lib/mdx/handleRefStaticPaths'
|
||||
import handleRefStaticProps from '~/lib/mdx/handleRefStaticProps'
|
||||
|
||||
const sections = flattenSections(clientLibsCommonSections)
|
||||
|
||||
export default function JSReference(props) {
|
||||
return <RefSectionHandler sections={sections} spec={spec} pageProps={props} type="client-lib" />
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return handleRefStaticProps(sections, '/csharp/v0')
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return handleRefGetStaticPaths()
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
import clientLibsCommonSections from '~/../../spec/common-client-libs-sections.json'
|
||||
import typeSpec from '~/../../spec/enrichments/tsdoc_v2/combined.json'
|
||||
// @ts-expect-error
|
||||
import spec from '~/../../spec/supabase_csharp_v0.yml' assert { type: 'yml' }
|
||||
import RefSectionHandler from '~/components/reference/RefSectionHandler'
|
||||
import { flattenSections } from '~/lib/helpers'
|
||||
import handleRefGetStaticPaths from '~/lib/mdx/handleRefStaticPaths'
|
||||
import handleRefStaticProps from '~/lib/mdx/handleRefStaticProps'
|
||||
import { useRouter } from 'next/router'
|
||||
import RefSEO from '~/components/reference/RefSEO'
|
||||
|
||||
const sections = flattenSections(clientLibsCommonSections)
|
||||
|
||||
export default function JSReference(props) {
|
||||
const router = useRouter()
|
||||
const slug = router.query.slug[0]
|
||||
const filteredSection = sections.filter((section) => section.id === slug)
|
||||
|
||||
const pageTitle = filteredSection[0]?.title
|
||||
? `${filteredSection[0]?.title} | Supabase`
|
||||
: 'Supabase'
|
||||
return (
|
||||
<>
|
||||
<RefSEO title={pageTitle} />
|
||||
|
||||
<RefSectionHandler
|
||||
sections={filteredSection}
|
||||
spec={spec}
|
||||
typeSpec={typeSpec}
|
||||
pageProps={props}
|
||||
type="client-lib"
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return handleRefStaticProps(sections, '/csharp/v0')
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return handleRefGetStaticPaths()
|
||||
}
|
||||
@@ -14,7 +14,7 @@ const sections = flattenSections(clientLibsCommonSections)
|
||||
export default function JSReference(props) {
|
||||
const router = useRouter()
|
||||
const slug = router.query.slug[0]
|
||||
const filteredSection = sections.filter((section) => section.slug === slug)
|
||||
const filteredSection = sections.filter((section) => section.id === slug)
|
||||
|
||||
const pageTitle = filteredSection[0]?.title
|
||||
? `${filteredSection[0]?.title} | Supabase`
|
||||
|
||||
@@ -14,7 +14,7 @@ const sections = flattenSections(clientLibsCommonSections)
|
||||
export default function JSReference(props) {
|
||||
const router = useRouter()
|
||||
const slug = router.query.slug[0]
|
||||
const filteredSection = sections.filter((section) => section.slug === slug)
|
||||
const filteredSection = sections.filter((section) => section.id === slug)
|
||||
|
||||
const pageTitle = filteredSection[0]?.title
|
||||
? `${filteredSection[0]?.title} | Supabase`
|
||||
|
||||
@@ -14,7 +14,7 @@ const sections = flattenSections(clientLibsCommonSections)
|
||||
export default function JSReference(props) {
|
||||
const router = useRouter()
|
||||
const slug = router.query.slug[0]
|
||||
const filteredSection = sections.filter((section) => section.slug === slug)
|
||||
const filteredSection = sections.filter((section) => section.id === slug)
|
||||
|
||||
const pageTitle = filteredSection[0]?.title
|
||||
? `${filteredSection[0]?.title} | Supabase`
|
||||
|
||||
@@ -13,7 +13,7 @@ const sections = flattenSections(clientLibsCommonSections)
|
||||
export default function JSReference(props) {
|
||||
const router = useRouter()
|
||||
const slug = router.query.slug[0]
|
||||
const filteredSection = sections.filter((section) => section.slug === slug)
|
||||
const filteredSection = sections.filter((section) => section.id === slug)
|
||||
|
||||
const pageTitle = filteredSection[0]?.title
|
||||
? `${filteredSection[0]?.title} | Supabase`
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 2500 2500" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M174.672,1866.26L173.916,1866.7C191.548,1898.57 218.67,1925.69 254.607,1946.71C428.869,2047.74 1012.68,2382.03 1129.3,2451.19C1135.77,2454.98 1142.22,2458.47 1148.65,2461.66C1221.03,2498 1291.94,2496.48 1364.59,2453.9C1657.51,2284.39 1951.11,2116.23 2244.04,1947.39C2280.65,1926.37 2307.1,1899.92 2324.72,1867.38C2341.57,1836.39 2350.38,1800.72 2350.49,1760.36C2350.49,1759.87 2350.49,1759.38 2350.49,1758.89L2350.49,739.086C2350.49,697.725 2341.68,660.432 2323.37,629.239L2323.37,629.241L2323.37,629.239C2305.74,598.05 2279.29,572.284 2244.04,551.942C1951.11,383.104 1657.51,214.269 1364.59,45.431C1285.26,0 1209.32,1.357 1130.66,47.464C1014.03,115.95 429.546,450.91 255.963,551.942C184.087,593.303 149.507,657.042 149.507,739.765L149.507,1759.57C149.507,1799.77 158.113,1835.33 174.672,1866.26Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
<path d="M1566.65,1427.32C1504.27,1537.84 1385.61,1613.11 1249.32,1613.11C1113.71,1613.11 995.729,1539.2 933.347,1429.35C902.834,1375.79 885.203,1314.76 885.203,1248.99C885.203,1047.6 1047.94,884.869 1249.32,884.869C1383.58,884.869 1500.88,958.099 1563.94,1066.59L1881.95,883.512C1755.16,665.179 1519.19,518.039 1248.64,518.039C844.519,518.039 517.696,845.542 517.696,1248.99C517.696,1381.21 552.953,1505.97 614.658,1613.11C740.776,1832.12 978.098,1979.94 1249.32,1979.94C1521.23,1979.94 1758.55,1831.44 1884.66,1611.07L1566.65,1427.32ZM1968.74,1076.08L1896.19,1076.08L1896.19,1426.64L1968.74,1426.64L1968.74,1076.08ZM2129.44,1076.08L2056.89,1076.08L2056.89,1426.64L2129.44,1426.64L2129.44,1076.08Z" style="fill-rule:nonzero;"/>
|
||||
<g>
|
||||
<path d="M2188.43,1135.07L1837.88,1135.07L1837.88,1207.63L2188.43,1207.63L2188.43,1135.07ZM2188.43,1295.1L1837.88,1295.1L1837.88,1367.65L2188.43,1367.65L2188.43,1295.1Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="2202" height="2476"><defs><linearGradient id="b" x1="22.367%" x2="87.411%" y1="78.665%" y2="25.105%"><stop offset="0%" stop-color="#ADADAD" stop-opacity=".5"/><stop offset="100%" stop-opacity=".5"/></linearGradient><path id="a" d="M981.153 35.355c78.66-46.107 154.6-47.464 233.93-2.033 292.92 168.838 586.52 337.673 879.45 506.511 35.25 20.342 61.7 46.108 79.33 77.297l.546.938c17.94 31.001 26.574 67.962 26.574 108.909v1021.274c-.11 40.36-8.92 76.03-25.77 107.02-17.62 32.54-44.07 58.99-80.68 80.01-292.93 168.84-586.53 337-879.45 506.51-72.65 42.58-143.56 44.1-215.94 7.76-6.43-3.19-12.88-6.68-19.35-10.47-116.62-69.16-700.431-403.45-874.693-504.48-35.937-21.02-63.059-48.14-80.691-80.01l.756-.44C8.606 1823.221 0 1787.661 0 1747.461V727.656c0-82.723 34.58-146.462 106.456-187.823C280.039 438.801 864.523 103.841 981.153 35.355Zm117.98 470.575c-404.121 0-730.944 327.503-730.944 730.951 0 132.22 35.257 256.98 96.962 364.12 126.118 219.01 363.44 366.83 634.662 366.83 271.91 0 509.23-148.5 635.34-368.87l-318.01-183.75c-62.38 110.52-181.04 185.79-317.33 185.79-135.61 0-253.591-73.91-315.973-183.76-30.513-53.56-48.144-114.59-48.144-180.36 0-201.39 162.737-364.121 364.117-364.121 134.26 0 251.56 73.23 314.62 181.721l318.01-183.078c-126.79-218.333-362.76-365.473-633.31-365.473Zm720.1 558.041h-72.55v58.99h-58.31v72.56h58.31v87.47h-58.31v72.55h58.31v58.99h72.55l-.001-58.99h88.15l.001 58.99h72.55v-58.99h58.99v-72.55h-58.99v-87.47h58.99v-72.56h-58.99v-58.99h-72.55l-.001 58.99h-88.15l.001-58.99Zm88.149 131.55v87.47h-88.15v-87.47h88.15Z"/></defs><g fill="none" fill-rule="nonzero" transform="translate(.507 .109)"><use xlink:href="#a" fill="#4C4C4C"/><use xlink:href="#a" fill="url(#b)"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 2500 2500" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M174.672,1866.26L173.916,1866.7C191.548,1898.57 218.67,1925.69 254.607,1946.71C428.869,2047.74 1012.68,2382.03 1129.3,2451.19C1135.77,2454.98 1142.22,2458.47 1148.65,2461.66C1221.03,2498 1291.94,2496.48 1364.59,2453.9C1657.51,2284.39 1951.11,2116.23 2244.04,1947.39C2280.65,1926.37 2307.1,1899.92 2324.72,1867.38C2341.57,1836.39 2350.38,1800.72 2350.49,1760.36C2350.49,1759.87 2350.49,1759.38 2350.49,1758.89L2350.49,739.086C2350.49,697.725 2341.68,660.432 2323.37,629.239L2323.37,629.241L2323.37,629.239C2305.74,598.05 2279.29,572.284 2244.04,551.942C1951.11,383.104 1657.51,214.269 1364.59,45.431C1285.26,0 1209.32,1.357 1130.66,47.464C1014.03,115.95 429.546,450.91 255.963,551.942C184.087,593.303 149.507,657.042 149.507,739.765L149.507,1759.57C149.507,1799.77 158.113,1835.33 174.672,1866.26Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
<path d="M1566.65,1427.32C1504.27,1537.84 1385.61,1613.11 1249.32,1613.11C1113.71,1613.11 995.729,1539.2 933.347,1429.35C902.834,1375.79 885.203,1314.76 885.203,1248.99C885.203,1047.6 1047.94,884.869 1249.32,884.869C1383.58,884.869 1500.88,958.099 1563.94,1066.59L1881.95,883.512C1755.16,665.179 1519.19,518.039 1248.64,518.039C844.519,518.039 517.696,845.542 517.696,1248.99C517.696,1381.21 552.953,1505.97 614.658,1613.11C740.776,1832.12 978.098,1979.94 1249.32,1979.94C1521.23,1979.94 1758.55,1831.44 1884.66,1611.07L1566.65,1427.32ZM1968.74,1076.08L1896.19,1076.08L1896.19,1426.64L1968.74,1426.64L1968.74,1076.08ZM2129.44,1076.08L2056.89,1076.08L2056.89,1426.64L2129.44,1426.64L2129.44,1076.08Z" style="fill-rule:nonzero;"/>
|
||||
<g>
|
||||
<path d="M2188.43,1135.07L1837.88,1135.07L1837.88,1207.63L2188.43,1207.63L2188.43,1135.07ZM2188.43,1295.1L1837.88,1295.1L1837.88,1367.65L2188.43,1367.65L2188.43,1295.1Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -6,8 +6,6 @@ image: launch-week-6/crdt/og-pg-crdt.png
|
||||
thumb: launch-week-6/crdt/og-pg-crdt.png
|
||||
tags:
|
||||
- launch-week
|
||||
- postgres
|
||||
- planetpg
|
||||
date: '2022-12-10'
|
||||
toc_depth: 2
|
||||
---
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"next-seo": "^4.20.0",
|
||||
"next-transpile-modules": "^9.0.0",
|
||||
"nodemailer": "^6.7.3",
|
||||
"octokit": "^2.0.14",
|
||||
"octokit": "^2.0.10",
|
||||
"parse-numeric-range": "^1.3.0",
|
||||
"react": "^17.0.2",
|
||||
"react-copy-to-clipboard": "^5.0.2",
|
||||
|
||||
@@ -100,7 +100,6 @@ function Blog(props: any) {
|
||||
]}
|
||||
/>
|
||||
<DefaultLayout>
|
||||
<h1 className="sr-only">Supabase blog</h1>
|
||||
<div className="overflow-hidden py-12">
|
||||
<div className="container mx-auto mt-16 px-8 sm:px-16 xl:px-20">
|
||||
<div className="mx-auto ">
|
||||
|
||||
@@ -37,11 +37,11 @@ function TagBlogsPage(props: Props) {
|
||||
<DefaultLayout>
|
||||
<div className="container mx-auto px-8 py-16 sm:px-16 xl:px-20">
|
||||
<div className="text-scale-1000 flex space-x-1">
|
||||
<h1 className="cursor-pointer">
|
||||
<p className="cursor-pointer">
|
||||
<Link href="/blog">Blog</Link>
|
||||
<span className="px-2">/</span>
|
||||
<span>{`${tag}`}</span>
|
||||
</h1>
|
||||
</p>
|
||||
<p>/</p>
|
||||
<p>{`${tag}`}</p>
|
||||
</div>
|
||||
<ol className="grid grid-cols-12 gap-8 py-16 lg:gap-16">
|
||||
{blogs.map((blog: PostTypes, idx: number) => (
|
||||
|
||||
@@ -101,11 +101,9 @@ const CareerPage: NextPage = ({ jobs, contributors }: any) => {
|
||||
<DefaultLayout>
|
||||
<div className="text-scale-1200">
|
||||
<div className="container relative mx-auto px-6 py-10 lg:pt-12 lg:px-16 xl:px-20 text-center space-y-4">
|
||||
<h1 className="text-sm text-brand-900 md:text-base">
|
||||
<span className="sr-only">Supabase </span>Careers
|
||||
</h1>
|
||||
<span className="text-sm text-brand-900 md:text-base">Careers</span>
|
||||
<h2 className="text-3xl md:text-4xl xl:text-5xl lg:max-w-2xl xl:max-w-3xl lg:mx-auto tracking-[-1.5px]">
|
||||
We're on a mission to build the best developer platform
|
||||
We’re on a mission to build the best developer platform
|
||||
</h2>
|
||||
<p className="text-sm md:text-base text-scale-1000 max-w-sm sm:max-w-md md:max-w-lg mx-auto">
|
||||
Explore remote possibilities and join our team to help us achieve it.
|
||||
@@ -323,7 +321,7 @@ const CareerPage: NextPage = ({ jobs, contributors }: any) => {
|
||||
<div
|
||||
className={`${
|
||||
Styles[`contributors-${i}`]
|
||||
} absolute w-12 h-12 md:w-14 md:h-14 lg:w-16 lg:h-16 rounded-full border-[1.5px] border-scale-600 z-10
|
||||
} absolute w-12 h-12 md:w-14 md:h-14 lg:w-16 lg:h-16 rounded-full border-[1.5px] border-scale-600 z-10
|
||||
transition-all hover:scale-105 drop-shadow-sm hover:drop-shadow-md
|
||||
`}
|
||||
key={i}
|
||||
|
||||
@@ -124,13 +124,13 @@ In addition to internal security reviews, we use various tools to scan our code
|
||||
<div className="container mx-auto pb-24 pt-1 px-8 sm:px-16 xl:px-20">
|
||||
<div className="max-w-xl">
|
||||
|
||||
<h3 className="text-3xl">Request for our SOC2 documents</h3>
|
||||
<h3 className="text-3xl">Security Portal</h3>
|
||||
|
||||
As a database company, being SOC2 compliant is important when handling sensitive customer data. Access more of Supabase’s security information by requesting for our latest SOC2 documents below.
|
||||
Access more of Supabase’s security information on our Security Portal, such as penetration testing and audit reports.
|
||||
|
||||
<Link passHref href="https://security.supabase.com">
|
||||
<Button type="default" size="medium" as="a" className="no-underline" target="_blank">
|
||||
Get SOC2 documents
|
||||
Security Portal
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -5,16 +5,9 @@
|
||||
<link>https://supabase.com/blog</link>
|
||||
<description>Latest Postgres news from Paul Copplestone at Supabase</description>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Fri, 09 Dec 2022 03:03:30 +0000</lastBuildDate>
|
||||
<lastBuildDate>Mon, 27 Jun 2022 02:02:30 +0000</lastBuildDate>
|
||||
<atom:link href="https://supabase.com/planetpg-paul_copplestone-rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-crdt</guid>
|
||||
<title>pg_crdt - an experimental CRDT extension for Postgres</title>
|
||||
<link>https://supabase.com/blog/postgres-crdt</link>
|
||||
<description>Embedding Yjs and Automerge into Postgres for collaborative applications.</description>
|
||||
<pubDate>Fri, 09 Dec 2022 03:03: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>
|
||||
|
||||
@@ -9,7 +9,7 @@ version: "3.8"
|
||||
services:
|
||||
studio:
|
||||
container_name: supabase-studio
|
||||
image: supabase/studio:20230127-6bfd87b
|
||||
image: supabase/studio:20221214-4eecc99
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: [ "CMD", "node", "-e", "require('http').get('http://localhost:3000/api/profile', (r) => {if (r.statusCode !== 200) throw new Error(r.statusCode)})" ]
|
||||
@@ -22,11 +22,13 @@ services:
|
||||
STUDIO_PG_META_URL: http://meta:8080
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
|
||||
DEFAULT_ORGANIZATION_NAME: ${STUDIO_DEFAULT_ORGANIZATION}
|
||||
DEFAULT_PROJECT_NAME: ${STUDIO_DEFAULT_PROJECT}
|
||||
DEFAULT_ORGANIZATION: ${STUDIO_DEFAULT_ORGANIZATION}
|
||||
DEFAULT_PROJECT: ${STUDIO_DEFAULT_PROJECT}
|
||||
|
||||
SUPABASE_URL: http://kong:8000
|
||||
SUPABASE_PUBLIC_URL: ${SUPABASE_PUBLIC_URL}
|
||||
# Kept for backwards compatibility with studio:0.22.08
|
||||
SUPABASE_REST_URL: ${API_EXTERNAL_URL}/rest/v1/
|
||||
SUPABASE_ANON_KEY: ${ANON_KEY}
|
||||
SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ router
|
||||
.get('/oak-server', (context) => {
|
||||
context.response.body = 'This is an example Oak server running on Edge Functions!'
|
||||
})
|
||||
.post('/oak-server/greet', async (context) => {
|
||||
.post('/oak-server/greet', (context) => {
|
||||
// Note: request body will be streamed to the function as chunks, set limit to 0 to fully read it.
|
||||
const result = context.request.body({ type: 'json', limit: 0 })
|
||||
const body = await result.value
|
||||
|
||||
Generated
+301
-1782
File diff suppressed because it is too large.
Load diff
@@ -62,8 +62,5 @@
|
||||
"mdx-mermaid": "^1.3.2",
|
||||
"mermaid": "^9.2.2",
|
||||
"mini-svg-data-uri": "^1.4.4"
|
||||
},
|
||||
"overrides": {
|
||||
"pgsql-parser": "13.4.0"
|
||||
}
|
||||
}
|
||||
@@ -1151,7 +1151,8 @@
|
||||
"created_at": { "type": "number" },
|
||||
"updated_at": { "type": "number" },
|
||||
"verify_jwt": { "type": "boolean" },
|
||||
"import_map": { "type": "boolean" }
|
||||
"import_map": { "type": "boolean" },
|
||||
"body": { "type": "string" }
|
||||
},
|
||||
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
|
||||
},
|
||||
|
||||
@@ -346,6 +346,7 @@ parameters:
|
||||
title: 'functions.<function_name>.import_map'
|
||||
tags: ['edge-functions']
|
||||
required: false
|
||||
default: 'true'
|
||||
description: |
|
||||
Specify the Deno import map file to use for the Function.
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
"title": "Initializing",
|
||||
"id": "initializing",
|
||||
"slug": "initializing",
|
||||
"type": "markdown",
|
||||
"libs": ["csharp"]
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"title": "Typescript Support",
|
||||
@@ -40,6 +39,7 @@
|
||||
},
|
||||
{
|
||||
"title": "Database",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "select",
|
||||
@@ -90,6 +90,7 @@
|
||||
"slug": "using-filters",
|
||||
"product": "database",
|
||||
"type": "function",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "eq",
|
||||
@@ -285,6 +286,7 @@
|
||||
"product": "database",
|
||||
"parent": "modifiers",
|
||||
"type": "function",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "db-modifiers-select",
|
||||
@@ -356,6 +358,7 @@
|
||||
},
|
||||
{
|
||||
"title": "Auth",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "auth-api",
|
||||
@@ -650,6 +653,7 @@
|
||||
},
|
||||
{
|
||||
"title": "Functions",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "invoke",
|
||||
@@ -662,6 +666,7 @@
|
||||
},
|
||||
{
|
||||
"title": "Realtime",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "stream",
|
||||
@@ -724,6 +729,7 @@
|
||||
},
|
||||
{
|
||||
"title": "Storage",
|
||||
|
||||
"items": [
|
||||
{
|
||||
"id": "create-bucket",
|
||||
|
||||
+10264
-11495
File diff suppressed because it is too large.
Load diff
+1982
-2186
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
+1373
-1622
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -13,14 +13,14 @@
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 403,
|
||||
"id": 402,
|
||||
"name": "StorageApiError",
|
||||
"kind": 128,
|
||||
"kindString": "Class",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 404,
|
||||
"id": 403,
|
||||
"name": "constructor",
|
||||
"kind": 512,
|
||||
"kindString": "Constructor",
|
||||
@@ -34,14 +34,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 405,
|
||||
"id": 404,
|
||||
"name": "new StorageApiError",
|
||||
"kind": 16384,
|
||||
"kindString": "Constructor signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 406,
|
||||
"id": 405,
|
||||
"name": "message",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -52,7 +52,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 407,
|
||||
"id": 406,
|
||||
"name": "status",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -65,24 +65,24 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 403,
|
||||
"id": 402,
|
||||
"name": "StorageApiError"
|
||||
},
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 400,
|
||||
"id": 399,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
}
|
||||
],
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 399,
|
||||
"id": 398,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 408,
|
||||
"id": 407,
|
||||
"name": "status",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -100,7 +100,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 409,
|
||||
"id": 408,
|
||||
"name": "toJSON",
|
||||
"kind": 2048,
|
||||
"kindString": "Method",
|
||||
@@ -114,7 +114,7 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 410,
|
||||
"id": 409,
|
||||
"name": "toJSON",
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
@@ -122,14 +122,14 @@
|
||||
"type": {
|
||||
"type": "reflection",
|
||||
"declaration": {
|
||||
"id": 411,
|
||||
"id": 410,
|
||||
"name": "__type",
|
||||
"kind": 65536,
|
||||
"kindString": "Type literal",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 413,
|
||||
"id": 412,
|
||||
"name": "message",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -148,7 +148,7 @@
|
||||
"defaultValue": "..."
|
||||
},
|
||||
{
|
||||
"id": 412,
|
||||
"id": 411,
|
||||
"name": "name",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -167,7 +167,7 @@
|
||||
"defaultValue": "..."
|
||||
},
|
||||
{
|
||||
"id": 414,
|
||||
"id": 413,
|
||||
"name": "status",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -190,7 +190,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [413, 412, 414]
|
||||
"children": [412, 411, 413]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -203,17 +203,17 @@
|
||||
{
|
||||
"title": "Constructors",
|
||||
"kind": 512,
|
||||
"children": [404]
|
||||
"children": [403]
|
||||
},
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [408]
|
||||
"children": [407]
|
||||
},
|
||||
{
|
||||
"title": "Methods",
|
||||
"kind": 2048,
|
||||
"children": [409]
|
||||
"children": [408]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -226,7 +226,7 @@
|
||||
"extendedTypes": [
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
]
|
||||
@@ -606,7 +606,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -815,7 +815,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1024,7 +1024,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1248,7 +1248,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1412,7 +1412,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1668,7 +1668,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1731,14 +1731,14 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError",
|
||||
"kind": 128,
|
||||
"kindString": "Class",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 399,
|
||||
"id": 398,
|
||||
"name": "constructor",
|
||||
"kind": 512,
|
||||
"kindString": "Constructor",
|
||||
@@ -1752,14 +1752,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 400,
|
||||
"id": 399,
|
||||
"name": "new StorageError",
|
||||
"kind": 16384,
|
||||
"kindString": "Constructor signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 401,
|
||||
"id": 400,
|
||||
"name": "message",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -1772,7 +1772,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
},
|
||||
"overwrites": {
|
||||
@@ -1791,7 +1791,7 @@
|
||||
{
|
||||
"title": "Constructors",
|
||||
"kind": 512,
|
||||
"children": [399]
|
||||
"children": [398]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -1812,25 +1812,25 @@
|
||||
"extendedBy": [
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 403,
|
||||
"id": 402,
|
||||
"name": "StorageApiError"
|
||||
},
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 416,
|
||||
"id": 415,
|
||||
"name": "StorageUnknownError"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 416,
|
||||
"id": 415,
|
||||
"name": "StorageUnknownError",
|
||||
"kind": 128,
|
||||
"kindString": "Class",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 417,
|
||||
"id": 416,
|
||||
"name": "constructor",
|
||||
"kind": 512,
|
||||
"kindString": "Constructor",
|
||||
@@ -1844,14 +1844,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 418,
|
||||
"id": 417,
|
||||
"name": "new StorageUnknownError",
|
||||
"kind": 16384,
|
||||
"kindString": "Constructor signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 419,
|
||||
"id": 418,
|
||||
"name": "message",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -1862,7 +1862,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 420,
|
||||
"id": 419,
|
||||
"name": "originalError",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -1875,24 +1875,24 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 416,
|
||||
"id": 415,
|
||||
"name": "StorageUnknownError"
|
||||
},
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 400,
|
||||
"id": 399,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
}
|
||||
],
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 399,
|
||||
"id": 398,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 421,
|
||||
"id": 420,
|
||||
"name": "originalError",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -1914,12 +1914,12 @@
|
||||
{
|
||||
"title": "Constructors",
|
||||
"kind": 512,
|
||||
"children": [417]
|
||||
"children": [416]
|
||||
},
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [421]
|
||||
"children": [420]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -1932,7 +1932,7 @@
|
||||
"extendedTypes": [
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
]
|
||||
@@ -2633,30 +2633,6 @@
|
||||
"kindString": "Interface",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 394,
|
||||
"name": "format",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
"flags": {
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Specify the format of the image requested.",
|
||||
"text": "When using 'origin' we force the format to be the same as the original image,\nbypassing automatic browser optimisation such as webp conversion\n"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"type": "literal",
|
||||
"value": "origin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 392,
|
||||
"name": "height",
|
||||
@@ -2744,7 +2720,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [394, 392, 393, 391]
|
||||
"children": [392, 393, 391]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -2756,7 +2732,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 395,
|
||||
"id": 394,
|
||||
"name": "isStorageError",
|
||||
"kind": 64,
|
||||
"kindString": "Function",
|
||||
@@ -2770,14 +2746,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 396,
|
||||
"id": 395,
|
||||
"name": "isStorageError",
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 397,
|
||||
"id": 396,
|
||||
"name": "error",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -2794,7 +2770,7 @@
|
||||
"asserts": false,
|
||||
"targetType": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -2806,7 +2782,7 @@
|
||||
{
|
||||
"title": "Classes",
|
||||
"kind": 128,
|
||||
"children": [403, 266, 398, 416]
|
||||
"children": [402, 266, 397, 415]
|
||||
},
|
||||
{
|
||||
"title": "Interfaces",
|
||||
@@ -2816,7 +2792,7 @@
|
||||
{
|
||||
"title": "Functions",
|
||||
"kind": 64,
|
||||
"children": [395]
|
||||
"children": [394]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -3199,7 +3175,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3398,7 +3374,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3597,7 +3573,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3764,7 +3740,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3918,7 +3894,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4164,7 +4140,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4602,7 +4578,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4899,7 +4875,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -5230,7 +5206,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -5450,7 +5426,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -5846,7 +5822,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -6059,7 +6035,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -6232,7 +6208,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -6526,7 +6502,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -6820,7 +6796,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 403,
|
||||
"id": 402,
|
||||
"name": "StorageApiError",
|
||||
"kind": 128,
|
||||
"kindString": "Class",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 404,
|
||||
"id": 403,
|
||||
"name": "constructor",
|
||||
"kind": 512,
|
||||
"kindString": "Constructor",
|
||||
@@ -34,14 +34,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 405,
|
||||
"id": 404,
|
||||
"name": "new StorageApiError",
|
||||
"kind": 16384,
|
||||
"kindString": "Constructor signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 406,
|
||||
"id": 405,
|
||||
"name": "message",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -52,7 +52,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 407,
|
||||
"id": 406,
|
||||
"name": "status",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -65,24 +65,24 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 403,
|
||||
"id": 402,
|
||||
"name": "StorageApiError"
|
||||
},
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 400,
|
||||
"id": 399,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
}
|
||||
],
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 399,
|
||||
"id": 398,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 408,
|
||||
"id": 407,
|
||||
"name": "status",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -100,7 +100,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 409,
|
||||
"id": 408,
|
||||
"name": "toJSON",
|
||||
"kind": 2048,
|
||||
"kindString": "Method",
|
||||
@@ -114,7 +114,7 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 410,
|
||||
"id": 409,
|
||||
"name": "toJSON",
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
@@ -122,14 +122,14 @@
|
||||
"type": {
|
||||
"type": "reflection",
|
||||
"declaration": {
|
||||
"id": 411,
|
||||
"id": 410,
|
||||
"name": "__type",
|
||||
"kind": 65536,
|
||||
"kindString": "Type literal",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 413,
|
||||
"id": 412,
|
||||
"name": "message",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -148,7 +148,7 @@
|
||||
"defaultValue": "..."
|
||||
},
|
||||
{
|
||||
"id": 412,
|
||||
"id": 411,
|
||||
"name": "name",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -167,7 +167,7 @@
|
||||
"defaultValue": "..."
|
||||
},
|
||||
{
|
||||
"id": 414,
|
||||
"id": 413,
|
||||
"name": "status",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -190,7 +190,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [413, 412, 414]
|
||||
"children": [412, 411, 413]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -203,17 +203,17 @@
|
||||
{
|
||||
"title": "Constructors",
|
||||
"kind": 512,
|
||||
"children": [404]
|
||||
"children": [403]
|
||||
},
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [408]
|
||||
"children": [407]
|
||||
},
|
||||
{
|
||||
"title": "Methods",
|
||||
"kind": 2048,
|
||||
"children": [409]
|
||||
"children": [408]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -226,7 +226,7 @@
|
||||
"extendedTypes": [
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
]
|
||||
@@ -606,7 +606,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -815,7 +815,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1024,7 +1024,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1248,7 +1248,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1412,7 +1412,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1668,7 +1668,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -1731,14 +1731,14 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError",
|
||||
"kind": 128,
|
||||
"kindString": "Class",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 399,
|
||||
"id": 398,
|
||||
"name": "constructor",
|
||||
"kind": 512,
|
||||
"kindString": "Constructor",
|
||||
@@ -1752,14 +1752,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 400,
|
||||
"id": 399,
|
||||
"name": "new StorageError",
|
||||
"kind": 16384,
|
||||
"kindString": "Constructor signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 401,
|
||||
"id": 400,
|
||||
"name": "message",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -1772,7 +1772,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
},
|
||||
"overwrites": {
|
||||
@@ -1791,7 +1791,7 @@
|
||||
{
|
||||
"title": "Constructors",
|
||||
"kind": 512,
|
||||
"children": [399]
|
||||
"children": [398]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -1812,25 +1812,25 @@
|
||||
"extendedBy": [
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 403,
|
||||
"id": 402,
|
||||
"name": "StorageApiError"
|
||||
},
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 416,
|
||||
"id": 415,
|
||||
"name": "StorageUnknownError"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 416,
|
||||
"id": 415,
|
||||
"name": "StorageUnknownError",
|
||||
"kind": 128,
|
||||
"kindString": "Class",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 417,
|
||||
"id": 416,
|
||||
"name": "constructor",
|
||||
"kind": 512,
|
||||
"kindString": "Constructor",
|
||||
@@ -1844,14 +1844,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 418,
|
||||
"id": 417,
|
||||
"name": "new StorageUnknownError",
|
||||
"kind": 16384,
|
||||
"kindString": "Constructor signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 419,
|
||||
"id": 418,
|
||||
"name": "message",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -1862,7 +1862,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 420,
|
||||
"id": 419,
|
||||
"name": "originalError",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -1875,24 +1875,24 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 416,
|
||||
"id": 415,
|
||||
"name": "StorageUnknownError"
|
||||
},
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 400,
|
||||
"id": 399,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
}
|
||||
],
|
||||
"overwrites": {
|
||||
"type": "reference",
|
||||
"id": 399,
|
||||
"id": 398,
|
||||
"name": "StorageError.constructor"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 421,
|
||||
"id": 420,
|
||||
"name": "originalError",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
@@ -1914,12 +1914,12 @@
|
||||
{
|
||||
"title": "Constructors",
|
||||
"kind": 512,
|
||||
"children": [417]
|
||||
"children": [416]
|
||||
},
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [421]
|
||||
"children": [420]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -1932,7 +1932,7 @@
|
||||
"extendedTypes": [
|
||||
{
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
]
|
||||
@@ -2827,30 +2827,6 @@
|
||||
"kindString": "Interface",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 394,
|
||||
"name": "format",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
"flags": {
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Specify the format of the image requested.",
|
||||
"text": "When using 'origin' we force the format to be the same as the original image,\nbypassing automatic browser optimisation such as webp conversion\n"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"type": "literal",
|
||||
"value": "origin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 392,
|
||||
"name": "height",
|
||||
@@ -2938,7 +2914,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [394, 392, 393, 391]
|
||||
"children": [392, 393, 391]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -2950,7 +2926,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 395,
|
||||
"id": 394,
|
||||
"name": "isStorageError",
|
||||
"kind": 64,
|
||||
"kindString": "Function",
|
||||
@@ -2964,14 +2940,14 @@
|
||||
],
|
||||
"signatures": [
|
||||
{
|
||||
"id": 396,
|
||||
"id": 395,
|
||||
"name": "isStorageError",
|
||||
"kind": 4096,
|
||||
"kindString": "Call signature",
|
||||
"flags": {},
|
||||
"parameters": [
|
||||
{
|
||||
"id": 397,
|
||||
"id": 396,
|
||||
"name": "error",
|
||||
"kind": 32768,
|
||||
"kindString": "Parameter",
|
||||
@@ -2988,7 +2964,7 @@
|
||||
"asserts": false,
|
||||
"targetType": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3000,7 +2976,7 @@
|
||||
{
|
||||
"title": "Classes",
|
||||
"kind": 128,
|
||||
"children": [403, 266, 398, 416]
|
||||
"children": [402, 266, 397, 415]
|
||||
},
|
||||
{
|
||||
"title": "Interfaces",
|
||||
@@ -3010,7 +2986,7 @@
|
||||
{
|
||||
"title": "Functions",
|
||||
"kind": 64,
|
||||
"children": [395]
|
||||
"children": [394]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -3393,7 +3369,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3592,7 +3568,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3791,7 +3767,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -3958,7 +3934,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4112,7 +4088,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4358,7 +4334,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4796,7 +4772,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -4950,30 +4926,6 @@
|
||||
"kindString": "Interface",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 394,
|
||||
"name": "format",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
"flags": {
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Specify the format of the image requested.",
|
||||
"text": "When using 'origin' we force the format to be the same as the original image,\nbypassing automatic browser optimisation such as webp conversion\n"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"type": "literal",
|
||||
"value": "origin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 392,
|
||||
"name": "height",
|
||||
@@ -5061,7 +5013,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [394, 392, 393, 391]
|
||||
"children": [392, 393, 391]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -5222,7 +5174,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -5553,7 +5505,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -5661,30 +5613,6 @@
|
||||
"kindString": "Interface",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 394,
|
||||
"name": "format",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
"flags": {
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Specify the format of the image requested.",
|
||||
"text": "When using 'origin' we force the format to be the same as the original image,\nbypassing automatic browser optimisation such as webp conversion\n"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"type": "literal",
|
||||
"value": "origin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 392,
|
||||
"name": "height",
|
||||
@@ -5772,7 +5700,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [394, 392, 393, 391]
|
||||
"children": [392, 393, 391]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -5902,7 +5830,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -6042,30 +5970,6 @@
|
||||
"kindString": "Interface",
|
||||
"flags": {},
|
||||
"children": [
|
||||
{
|
||||
"id": 394,
|
||||
"name": "format",
|
||||
"kind": 1024,
|
||||
"kindString": "Property",
|
||||
"flags": {
|
||||
"isOptional": true
|
||||
},
|
||||
"comment": {
|
||||
"shortText": "Specify the format of the image requested.",
|
||||
"text": "When using 'origin' we force the format to be the same as the original image,\nbypassing automatic browser optimisation such as webp conversion\n"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"fileName": "src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 2
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"type": "literal",
|
||||
"value": "origin"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": 392,
|
||||
"name": "height",
|
||||
@@ -6153,7 +6057,7 @@
|
||||
{
|
||||
"title": "Properties",
|
||||
"kind": 1024,
|
||||
"children": [394, 392, 393, 391]
|
||||
"children": [392, 393, 391]
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
@@ -6654,7 +6558,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -6867,7 +6771,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -7040,7 +6944,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -7426,7 +7330,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
@@ -7812,7 +7716,7 @@
|
||||
],
|
||||
"type": {
|
||||
"type": "reference",
|
||||
"id": 398,
|
||||
"id": 397,
|
||||
"name": "StorageError"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -724,9 +724,7 @@
|
||||
"properties": {
|
||||
"height": { "type": "integer", "minimum": 0, "example": 100 },
|
||||
"width": { "type": "integer", "minimum": 0, "example": 100 },
|
||||
"resize": { "type": "string", "enum": ["cover", "contain", "fill"] },
|
||||
"format": { "type": "string", "enum": ["origin", "avif"] },
|
||||
"quality": { "type": "integer", "minimum": 20, "maximum": 100 }
|
||||
"resize": { "type": "string", "enum": ["cover", "contain", "fill"] }
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -176,7 +176,7 @@ functions:
|
||||
```
|
||||
- id: sign-up-with-redirect
|
||||
name: Sign up with a redirect URL
|
||||
description: |
|
||||
description: |
|
||||
- See [redirect URLs and wildcards](/docs/guides/auth/overview#redirect-urls-and-wildcards) to add additional redirect URLs to your project.
|
||||
code: |
|
||||
```js
|
||||
@@ -3991,10 +3991,11 @@ functions:
|
||||
title: on().subscribe()
|
||||
$ref: '@supabase/realtime-js.RealtimeChannel.on'
|
||||
notes: |
|
||||
- By default, Broadcast and Presence are enabled for all projects.
|
||||
- By default, listening to database changes is disabled for new projects due to database performance and security concerns. You can turn it on by managing Realtime's [replication](/docs/guides/api#realtime-api-overview).
|
||||
- You can receive the "previous" data for updates and deletes by setting the table's `REPLICA IDENTITY` to `FULL` (e.g., `ALTER TABLE your_table REPLICA IDENTITY FULL;`).
|
||||
- Row level security is not applied to delete statements. When RLS is enabled and replica identity is set to full, only the primary key is sent to clients.
|
||||
- Realtime is disabled by default for new Projects for better database performance and security. You can turn it on by [managing replication](/docs/guides/api#managing-realtime).
|
||||
- Row level security is not applied to delete statements.
|
||||
- If you want to receive the "previous" data for updates and deletes, you will need to set `REPLICA IDENTITY` to `FULL`, like this: `ALTER TABLE your_table REPLICA IDENTITY FULL;`
|
||||
- When a delete occurs, the contents of old_record will be broadcast to all subscribers to that table so ensure that each table's replica identity only contains information that is safe to expose publicly.
|
||||
- The channel name must exactly match the schema/table/filter you want to listen to separated by colons. See below examples for additional context.
|
||||
examples:
|
||||
- id: listen-to-broadcast
|
||||
name: Listen to broadcast messages
|
||||
|
||||
@@ -570,6 +570,9 @@
|
||||
},
|
||||
"import_map": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"body": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -2481,6 +2484,9 @@
|
||||
},
|
||||
"import_map": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"body": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["id", "slug", "name", "status", "version", "created_at", "updated_at"]
|
||||
|
||||
@@ -1128,15 +1128,6 @@
|
||||
"resize": {
|
||||
"type": "string",
|
||||
"enum": ["cover", "contain", "fill"]
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"enum": ["origin", "avif"]
|
||||
},
|
||||
"quality": {
|
||||
"type": "integer",
|
||||
"minimum": 20,
|
||||
"maximum": 100
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -6,11 +6,13 @@ DEFAULT_PROJECT_NAME=Default Project
|
||||
|
||||
SUPABASE_URL=http://localhost:8000
|
||||
SUPABASE_PUBLIC_URL=http://localhost:8000
|
||||
NEXT_PUBLIC_SUPABASE_URL=$SUPABASE_URL
|
||||
NEXT_PUBLIC_SUPABASE_PUBLIC_URL=$SUPABASE_PUBLIC_URL
|
||||
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
|
||||
SUPABASE_SERVICE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
|
||||
|
||||
# TODO: evaluate these variables at runtime instead
|
||||
# https://nextjs.org/docs/basic-features/environment-variables#loading-environment-variables
|
||||
NEXT_PUBLIC_SITE_URL=http://localhost:3000
|
||||
NEXT_PUBLIC_GOTRUE_URL=$SUPABASE_PUBLIC_URL/auth/v1
|
||||
NEXT_PUBLIC_GOTRUE_URL=$NEXT_PUBLIC_SUPABASE_PUBLIC_URL/auth/v1
|
||||
NEXT_PUBLIC_HCAPTCHA_SITE_KEY=10000000-ffff-ffff-ffff-000000000001
|
||||
@@ -5,7 +5,7 @@ import { useRouter } from 'next/router'
|
||||
import { observer } from 'mobx-react-lite'
|
||||
import { useParams, useStore } from 'hooks'
|
||||
import { PolicyEditorModal, PolicyTableRow } from 'components/interfaces/Auth/Policies'
|
||||
import type { PostgresRole, PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PostgresRole, PostgresTable } from '@supabase/postgres-meta'
|
||||
|
||||
import ConfirmModal from 'components/ui/Dialogs/ConfirmDialog'
|
||||
import NoSearchResults from 'components/to-be-cleaned/NoSearchResults'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { PostgresPolicy } from '@supabase/postgres-meta'
|
||||
import { PostgresPolicy } from '@supabase/postgres-meta'
|
||||
import { has, isEmpty, isEqual } from 'lodash'
|
||||
import {
|
||||
PolicyFormField,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { FC } from 'react'
|
||||
import type { PostgresRole } from '@supabase/postgres-meta'
|
||||
import { PostgresRole } from '@supabase/postgres-meta'
|
||||
|
||||
import MultiSelect from 'components/ui/MultiSelect'
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import PolicyDefinition from './PolicyDefinition'
|
||||
import PolicyAllowedOperation from './PolicyAllowedOperation'
|
||||
import PolicyRoles from './PolicyRoles'
|
||||
import PolicyEditorFooter from './PolicyEditorFooter'
|
||||
import type { PostgresRole } from '@supabase/postgres-meta'
|
||||
import { PostgresRole } from '@supabase/postgres-meta'
|
||||
|
||||
// Exposed for StoragePoliciesEditor.js
|
||||
export { PolicyName, PolicyRoles }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Modal } from 'ui'
|
||||
import { FC, useState, useEffect } from 'react'
|
||||
import { isEmpty } from 'lodash'
|
||||
import type { PostgresRole } from '@supabase/postgres-meta'
|
||||
import { PostgresRole } from '@supabase/postgres-meta'
|
||||
|
||||
import { useStore } from 'hooks'
|
||||
import PolicyEditorModalTitle from './PolicyEditorModalTitle'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { FC } from 'react'
|
||||
import * as Tooltip from '@radix-ui/react-tooltip'
|
||||
import { Button, Dropdown, IconEdit, IconTrash, IconMoreVertical } from 'ui'
|
||||
import type { PostgresPolicy } from '@supabase/postgres-meta'
|
||||
import { PostgresPolicy } from '@supabase/postgres-meta'
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
|
||||
import { checkPermissions } from 'hooks'
|
||||
|
||||
@@ -3,7 +3,7 @@ import { FC } from 'react'
|
||||
import { useRouter } from 'next/router'
|
||||
import * as Tooltip from '@radix-ui/react-tooltip'
|
||||
import { Badge, Button } from 'ui'
|
||||
import type { PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
import { checkPermissions } from 'hooks'
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { FC } from 'react'
|
||||
import type { PostgresTable, PostgresPolicy } from '@supabase/postgres-meta'
|
||||
import { PostgresTable, PostgresPolicy } from '@supabase/postgres-meta'
|
||||
import { observer } from 'mobx-react-lite'
|
||||
import { useStore } from 'hooks'
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { FC, useEffect, useState } from 'react'
|
||||
import { Button, Input, Form, Modal, Listbox, IconPlus, IconDatabase } from 'ui'
|
||||
import type { PostgresExtension, PostgresSchema } from '@supabase/postgres-meta'
|
||||
import { PostgresExtension, PostgresSchema } from '@supabase/postgres-meta'
|
||||
|
||||
import { useStore } from 'hooks'
|
||||
import ShimmeringLoader from 'components/ui/ShimmeringLoader'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { FC, useState } from 'react'
|
||||
import { observer } from 'mobx-react-lite'
|
||||
import { Badge, Toggle } from 'ui'
|
||||
import type { PostgresPublication, PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PostgresPublication, PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
|
||||
import { checkPermissions, useStore } from 'hooks'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { FC, useState } from 'react'
|
||||
import { observer } from 'mobx-react-lite'
|
||||
import { Button, Input, IconChevronLeft, IconSearch, IconAlertCircle } from 'ui'
|
||||
import type { PostgresPublication } from '@supabase/postgres-meta'
|
||||
import { PostgresPublication } from '@supabase/postgres-meta'
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
|
||||
import { checkPermissions, useStore } from 'hooks'
|
||||
|
||||
@@ -5,7 +5,7 @@ import { Input, Button, IconSearch, IconPlus, IconChevronLeft, IconEdit3, IconTr
|
||||
import { useStore } from 'hooks'
|
||||
import Table from 'components/to-be-cleaned/Table'
|
||||
import NoSearchResults from 'components/to-be-cleaned/NoSearchResults'
|
||||
import type { PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PostgresTable } from '@supabase/postgres-meta'
|
||||
|
||||
interface Props {
|
||||
selectedTable: PostgresTable
|
||||
@@ -25,11 +25,11 @@ const ColumnList: FC<Props> = ({
|
||||
const { meta } = useStore()
|
||||
const [filterString, setFilterString] = useState<string>('')
|
||||
const columns =
|
||||
(filterString.length === 0
|
||||
filterString.length === 0
|
||||
? selectedTable.columns
|
||||
: selectedTable.columns?.filter((column: any) => column.name.includes(filterString))) ?? []
|
||||
: selectedTable.columns.filter((column: any) => column.name.includes(filterString))
|
||||
|
||||
const isLocked = meta.excludedSchemas.includes(selectedTable.schema ?? '')
|
||||
const isLocked = meta.excludedSchemas.includes(selectedTable?.schema ?? '')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -18,7 +18,7 @@ import { partition } from 'lodash'
|
||||
import { useStore } from 'hooks'
|
||||
import Table from 'components/to-be-cleaned/Table'
|
||||
import NoSearchResults from 'components/to-be-cleaned/NoSearchResults'
|
||||
import type { PostgresTable, PostgresSchema } from '@supabase/postgres-meta'
|
||||
import { PostgresTable, PostgresSchema } from '@supabase/postgres-meta'
|
||||
|
||||
interface Props {
|
||||
selectedSchema: string
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useRouter } from 'next/router'
|
||||
import { Button, IconTerminal, IconMaximize2, IconMinimize2, IconBookOpen, IconCode } from 'ui'
|
||||
import { useProjectSettingsQuery } from 'data/config/project-settings-query'
|
||||
import { useProjectSettings } from 'hooks'
|
||||
import { useAccessTokens } from 'hooks/queries/useAccessTokens'
|
||||
import { Commands } from './Functions.types'
|
||||
import CommandRender from 'components/interfaces/Functions/CommandRender'
|
||||
@@ -18,17 +18,17 @@ const TerminalInstructions: FC<Props> = ({ closable = false }) => {
|
||||
const { ui } = useStore()
|
||||
|
||||
const { tokens } = useAccessTokens()
|
||||
const { data: settings } = useProjectSettingsQuery({ projectRef: ref as string })
|
||||
const { services } = useProjectSettings(ref as string | undefined)
|
||||
|
||||
const [showInstructions, setShowInstructions] = useState(!closable)
|
||||
|
||||
// Get the API service
|
||||
const apiService = settings?.autoApiService
|
||||
const anonKey = apiService?.service_api_keys.find((x: any) => x.name === 'anon key')
|
||||
? apiService.defaultApiKey
|
||||
: undefined
|
||||
const API_SERVICE_ID = 1
|
||||
const apiService = (services ?? []).find((x: any) => x.app.id == API_SERVICE_ID)
|
||||
const apiKeys = apiService?.service_api_keys ?? []
|
||||
const anonKey = apiKeys.find((x: any) => x.name === 'anon key')?.api_key
|
||||
|
||||
const endpoint = apiService?.endpoint ?? ''
|
||||
const endpoint = apiService?.app_config.endpoint ?? ''
|
||||
const endpointSections = endpoint.split('.')
|
||||
const functionsEndpoint = [
|
||||
...endpointSections.slice(0, 1),
|
||||
|
||||
@@ -5,8 +5,9 @@ import { Input, IconLoader, IconAlertCircle } from 'ui'
|
||||
import { JwtSecretUpdateStatus } from '@supabase/shared-types/out/events'
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
|
||||
import { useProjectSettingsQuery } from 'data/config/project-settings-query'
|
||||
import { checkPermissions, useJwtSecretUpdateStatus } from 'hooks'
|
||||
import { checkPermissions, useJwtSecretUpdateStatus, useProjectSettings } from 'hooks'
|
||||
import { DEFAULT_PROJECT_API_SERVICE_ID, IS_PLATFORM } from 'lib/constants'
|
||||
import { PROJECT_ENDPOINT_PROTOCOL } from 'pages/api/constants'
|
||||
import Snippets from 'components/to-be-cleaned/Docs/Snippets'
|
||||
import Panel from 'components/ui/Panel'
|
||||
import SimpleCodeBlock from 'components/to-be-cleaned/SimpleCodeBlock'
|
||||
@@ -22,10 +23,10 @@ const APIKeys = () => {
|
||||
const [selectedLanguage, setSelectedLanguage] = useState(availableLanguages[0])
|
||||
|
||||
const {
|
||||
data: settings,
|
||||
services,
|
||||
isError: isProjectSettingsError,
|
||||
isLoading: isProjectSettingsLoading,
|
||||
} = useProjectSettingsQuery({ projectRef: ref as string })
|
||||
} = useProjectSettings(ref as string | undefined)
|
||||
|
||||
const {
|
||||
jwtSecretUpdateStatus,
|
||||
@@ -36,7 +37,8 @@ const APIKeys = () => {
|
||||
const canReadAPIKeys = checkPermissions(PermissionAction.READ, 'service_api_keys')
|
||||
|
||||
// Get the API service
|
||||
const apiService = settings?.autoApiService
|
||||
const apiService = (services ?? []).find((x: any) => x.app.id == DEFAULT_PROJECT_API_SERVICE_ID)
|
||||
const apiConfig = apiService?.app_config ?? {}
|
||||
const apiKeys = apiService?.service_api_keys ?? []
|
||||
|
||||
// API keys should not be empty. However it can be populated with a delay on project creation
|
||||
@@ -44,7 +46,7 @@ const APIKeys = () => {
|
||||
const isNotUpdatingJwtSecret =
|
||||
jwtSecretUpdateStatus === undefined || jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updated
|
||||
|
||||
const apiUrl = `${apiService?.protocol ?? 'https'}://${apiService?.endpoint ?? '-'}`
|
||||
const apiUrl = `${IS_PLATFORM ? 'https' : PROJECT_ENDPOINT_PROTOCOL}://${apiConfig.endpoint}`
|
||||
const anonKey = apiKeys.find((key: any) => key.tags === 'anon')
|
||||
|
||||
const clientInitSnippet: any = Snippets.init(apiUrl)
|
||||
@@ -109,7 +111,7 @@ const APIKeys = () => {
|
||||
<div className="space-y-2">
|
||||
<p className="text-sm">API Key</p>
|
||||
<div className="flex items-center space-x-1 -ml-1">
|
||||
{anonKey?.tags?.split(',').map((x: any, i: number) => (
|
||||
{anonKey.tags?.split(',').map((x: any, i: number) => (
|
||||
<code key={`${x}${i}`} className="text-xs">
|
||||
{x}
|
||||
</code>
|
||||
@@ -119,7 +121,7 @@ const APIKeys = () => {
|
||||
</div>
|
||||
}
|
||||
copy={canReadAPIKeys && isNotUpdatingJwtSecret}
|
||||
reveal={anonKey?.tags !== 'anon' && canReadAPIKeys && isNotUpdatingJwtSecret}
|
||||
reveal={anonKey.tags !== 'anon' && canReadAPIKeys && isNotUpdatingJwtSecret}
|
||||
value={
|
||||
!canReadAPIKeys
|
||||
? 'You need additional permissions to view API keys'
|
||||
@@ -127,7 +129,7 @@ const APIKeys = () => {
|
||||
? 'JWT secret update failed, new API key may have issues'
|
||||
: jwtSecretUpdateStatus === JwtSecretUpdateStatus.Updating
|
||||
? 'Updating JWT secret...'
|
||||
: apiService?.defaultApiKey
|
||||
: anonKey.api_key
|
||||
}
|
||||
onChange={() => {}}
|
||||
descriptionText={
|
||||
|
||||
@@ -3,15 +3,18 @@ import { useRouter } from 'next/router'
|
||||
import { JwtSecretUpdateError, JwtSecretUpdateStatus } from '@supabase/shared-types/out/events'
|
||||
import { IconAlertCircle, Input } from 'ui'
|
||||
|
||||
import { configKeys } from 'data/config/keys'
|
||||
import { useQueryClient } from '@tanstack/react-query'
|
||||
import { useProjectSettingsQuery } from 'data/config/project-settings-query'
|
||||
import { useStore, useProjectPostgrestConfig, useJwtSecretUpdateStatus } from 'hooks'
|
||||
import {
|
||||
useStore,
|
||||
useProjectSettings,
|
||||
useProjectPostgrestConfig,
|
||||
useJwtSecretUpdateStatus,
|
||||
} from 'hooks'
|
||||
|
||||
import Panel from 'components/ui/Panel'
|
||||
import PostgrestConfig from './PostgrestConfig'
|
||||
import { DisplayApiSettings } from 'components/ui/ProjectSettings'
|
||||
import { JWT_SECRET_UPDATE_ERROR_MESSAGES } from './API.constants'
|
||||
import { PROJECT_ENDPOINT_PROTOCOL } from 'pages/api/constants'
|
||||
import { IS_PLATFORM } from 'lib/constants'
|
||||
import JWTSettings from './JWTSettings'
|
||||
|
||||
@@ -23,9 +26,8 @@ const ServiceList: FC<Props> = ({ projectRef }) => {
|
||||
const { ui } = useStore()
|
||||
const router = useRouter()
|
||||
const { ref } = router.query
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
const { data: settings, isError } = useProjectSettingsQuery({ projectRef: ref as string })
|
||||
const { services, isError, mutateSettings } = useProjectSettings(ref as string | undefined)
|
||||
const { mutateConfig } = useProjectPostgrestConfig(ref as string | undefined)
|
||||
const { jwtSecretUpdateError, jwtSecretUpdateStatus }: any = useJwtSecretUpdateStatus(ref)
|
||||
|
||||
@@ -39,7 +41,7 @@ const ServiceList: FC<Props> = ({ projectRef }) => {
|
||||
switch (jwtSecretUpdateStatus) {
|
||||
case Updated:
|
||||
mutateConfig()
|
||||
queryClient.invalidateQueries({ queryKey: configKeys.settings(projectRef) })
|
||||
mutateSettings()
|
||||
ui.setNotification({ category: 'success', message: 'Successfully updated JWT secret' })
|
||||
break
|
||||
case Failed:
|
||||
@@ -55,8 +57,9 @@ const ServiceList: FC<Props> = ({ projectRef }) => {
|
||||
}, [jwtSecretUpdateStatus])
|
||||
|
||||
// Get the API service
|
||||
const apiService = settings?.autoApiService
|
||||
const apiUrl = `${apiService?.protocol ?? 'https'}://${apiService?.endpoint ?? '-'}`
|
||||
const API_SERVICE_ID = 1
|
||||
const apiService = services ? services.find((x: any) => x.app.id == API_SERVICE_ID) : {}
|
||||
const apiConfig = apiService?.app_config
|
||||
|
||||
return (
|
||||
<div>
|
||||
@@ -76,7 +79,9 @@ const ServiceList: FC<Props> = ({ projectRef }) => {
|
||||
readOnly
|
||||
disabled
|
||||
className="input-mono"
|
||||
value={apiUrl}
|
||||
value={`${IS_PLATFORM ? 'https' : PROJECT_ENDPOINT_PROTOCOL}://${
|
||||
apiConfig?.endpoint ?? '-'
|
||||
}`}
|
||||
descriptionText="A RESTful endpoint for querying and managing your database."
|
||||
layout="horizontal"
|
||||
/>
|
||||
|
||||
+1
-1
@@ -134,7 +134,7 @@ const CustomDomainVerify = ({ projectRef, customDomain, settings }: CustomDomain
|
||||
<DNSRecord
|
||||
type="CNAME"
|
||||
name={customDomain.hostname}
|
||||
value={settings?.autoApiService.endpoint ?? 'Loading...'}
|
||||
value={settings?.autoApiService.app_config.endpoint ?? 'Loading...'}
|
||||
/>
|
||||
)}
|
||||
|
||||
|
||||
+2
-2
@@ -26,7 +26,7 @@ const CustomDomainsConfigureHostname = () => {
|
||||
const { data: settings } = useProjectSettingsQuery({ projectRef: ref })
|
||||
|
||||
const FORM_ID = 'custom-domains-form'
|
||||
const endpoint = settings?.autoApiService.endpoint
|
||||
const endpoint = settings?.autoApiService.app_config.endpoint ?? undefined
|
||||
const canConfigureCustomDomain = checkPermissions(PermissionAction.UPDATE, 'projects')
|
||||
|
||||
const verifyCNAME = async (domain: string): Promise<boolean> => {
|
||||
@@ -123,7 +123,7 @@ const CustomDomainsConfigureHostname = () => {
|
||||
'your custom domain'
|
||||
)}
|
||||
, resolving to{' '}
|
||||
{endpoint ? (
|
||||
{endpoint !== undefined ? (
|
||||
<code className="text-xs">{endpoint}</code>
|
||||
) : (
|
||||
"your project's API URL"
|
||||
|
||||
@@ -257,7 +257,7 @@ export const SQL_FILTER_TEMPLATES: any = {
|
||||
"severity.error": `REGEXP_CONTAINS(event_message, "level.{3}error|level.{3}fatal")`,
|
||||
"severity.warning": `REGEXP_CONTAINS(event_message, "level.{3}warning")`,
|
||||
"severity.info": `REGEXP_CONTAINS(event_message, "level.{3}info")`,
|
||||
"status_code.server_error": `REGEXP_CONTAINS(event_message, "status.{3}5[0-9]{2}")`,
|
||||
"status_code.server_error": `REGEXP_CONTAINS(event_message, "status.{3}5[0-9]{2}`,
|
||||
"status_code.client_error": `REGEXP_CONTAINS(event_message, "status.{3}4[0-9]{2}")`,
|
||||
"status_code.redirection": `REGEXP_CONTAINS(event_message, "status.{3}3[0-9]{2}")`,
|
||||
"status_code.success": `REGEXP_CONTAINS(event_message, "status.{3}2[0-9]{2}")`,
|
||||
|
||||
@@ -12,11 +12,10 @@ import {
|
||||
IconLoader,
|
||||
IconAlertCircle,
|
||||
IconExternalLink,
|
||||
Checkbox,
|
||||
} from 'ui'
|
||||
import { CLIENT_LIBRARIES } from 'common/constants'
|
||||
|
||||
import { Organization, Project } from 'types'
|
||||
import { Project } from 'types'
|
||||
import { useStore, useFlag } from 'hooks'
|
||||
import { post, get } from 'lib/common/fetch'
|
||||
import { API_URL, PRICING_TIER_PRODUCT_IDS } from 'lib/constants'
|
||||
@@ -51,9 +50,8 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
const sortedOrganizations = app.organizations.list()
|
||||
const sortedProjects = app.projects.list()
|
||||
|
||||
const isInitialized = app.projects.isInitialized
|
||||
const projectDefaults: Partial<Project>[] = [{ ref: 'no-project', name: 'No specific project' }]
|
||||
|
||||
const isInitialized = app.projects.isInitialized
|
||||
const projects = [...sortedProjects, ...projectDefaults]
|
||||
|
||||
const planNames = {
|
||||
@@ -86,29 +84,18 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
const selectedCategory = CATEGORY_OPTIONS.find((option) => {
|
||||
if (option.value.toLowerCase() === ((category as string) ?? '').toLowerCase()) return option
|
||||
})
|
||||
|
||||
const initialProjectRef =
|
||||
selectedProject !== undefined
|
||||
? selectedProject.ref
|
||||
: sortedProjects.length > 0
|
||||
? sortedProjects[0].ref
|
||||
: 'no-project'
|
||||
const initialOrganizationSlug =
|
||||
initialProjectRef !== 'no-project'
|
||||
? sortedOrganizations.find((org) => {
|
||||
const project = sortedProjects.find((project) => project.ref === initialProjectRef)
|
||||
return org.id === project?.organization_id
|
||||
})?.slug
|
||||
: sortedOrganizations[0]?.slug
|
||||
const initialValues = {
|
||||
category: selectedCategory !== undefined ? selectedCategory.value : CATEGORY_OPTIONS[0].value,
|
||||
severity: 'Low',
|
||||
projectRef: initialProjectRef,
|
||||
organizationSlug: initialOrganizationSlug,
|
||||
projectRef:
|
||||
selectedProject !== undefined
|
||||
? selectedProject.ref
|
||||
: sortedProjects.length > 0
|
||||
? sortedProjects[0].ref
|
||||
: 'no-project',
|
||||
library: 'no-library',
|
||||
subject: subject ?? '',
|
||||
message: '',
|
||||
allowSupportAccess: false,
|
||||
}
|
||||
|
||||
const onFilesUpload = async (event: ChangeEvent<HTMLInputElement>) => {
|
||||
@@ -191,10 +178,11 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
|
||||
return (
|
||||
<Form id="support-form" initialValues={initialValues} validate={onValidate} onSubmit={onSubmit}>
|
||||
{({ isSubmitting, resetForm, values }: any) => {
|
||||
{({ isSubmitting, values }: any) => {
|
||||
const selectedCategory = CATEGORY_OPTIONS.find(
|
||||
(category) => category.value === values.category
|
||||
)
|
||||
|
||||
const selectedLibrary = CLIENT_LIBRARIES.find(
|
||||
(library) => library.language === values.library
|
||||
)
|
||||
@@ -212,20 +200,8 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
['Performance', 'Problem'].includes(values.category)
|
||||
|
||||
useEffect(() => {
|
||||
if (values.projectRef === 'no-project') {
|
||||
const updatedValues = { ...values, organizationSlug: sortedOrganizations[0]?.slug }
|
||||
resetForm({ values: updatedValues, initialValues: updatedValues })
|
||||
} else if (selectedProject) {
|
||||
if (!selectedProject.subscription_tier) {
|
||||
app.projects.fetchSubscriptionTier(selectedProject as Project)
|
||||
}
|
||||
const organization = sortedOrganizations.find(
|
||||
(org) => org.id === selectedProject.organization_id
|
||||
)
|
||||
if (organization) {
|
||||
const updatedValues = { ...values, organizationSlug: organization.slug }
|
||||
resetForm({ values: updatedValues, initialValues: updatedValues })
|
||||
}
|
||||
if (selectedProject && !selectedProject.subscription_tier) {
|
||||
app.projects.fetchSubscriptionTier(selectedProject as Project)
|
||||
}
|
||||
}, [values.projectRef])
|
||||
|
||||
@@ -308,28 +284,6 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
)}
|
||||
</div>
|
||||
|
||||
{values.projectRef === 'no-project' && sortedOrganizations.length > 0 && (
|
||||
<div className="px-6">
|
||||
<Listbox
|
||||
id="organizationSlug"
|
||||
layout="vertical"
|
||||
label="Which organization is affected?"
|
||||
>
|
||||
{sortedOrganizations.map((option) => {
|
||||
return (
|
||||
<Listbox.Option
|
||||
key={`option-${option.slug}`}
|
||||
label={option.name || ''}
|
||||
value={option.slug}
|
||||
>
|
||||
<span>{option.name}</span>
|
||||
</Listbox.Option>
|
||||
)
|
||||
})}
|
||||
</Listbox>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{selectedProject?.subscription_tier === PRICING_TIER_PRODUCT_IDS.FREE && (
|
||||
<div className="px-6">
|
||||
<InformationBox
|
||||
@@ -374,105 +328,71 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
|
||||
{!isDisabled ? (
|
||||
<>
|
||||
{['Performance'].includes(values.category) ? (
|
||||
<DisabledStateForFreeTier
|
||||
category={selectedCategory?.label ?? ''}
|
||||
projectRef={values.projectRef}
|
||||
<div className="px-6">
|
||||
<Input
|
||||
id="subject"
|
||||
label="Subject"
|
||||
placeholder="Summary of the problem you have"
|
||||
/>
|
||||
) : (
|
||||
<>
|
||||
<div className="px-6">
|
||||
<Input
|
||||
id="subject"
|
||||
label="Subject"
|
||||
placeholder="Summary of the problem you have"
|
||||
/>
|
||||
</div>
|
||||
{values.category === 'Problem' && (
|
||||
<div className="px-6">
|
||||
<Listbox
|
||||
id="library"
|
||||
layout="vertical"
|
||||
label="Which library are you having issues with?"
|
||||
>
|
||||
</div>
|
||||
{values.category === 'Problem' && (
|
||||
<div className="px-6">
|
||||
<Listbox
|
||||
id="library"
|
||||
layout="vertical"
|
||||
label="Which library are you having issues with?"
|
||||
>
|
||||
<Listbox.Option
|
||||
disabled
|
||||
label="Please select a library"
|
||||
value="no-library"
|
||||
className="min-w-[500px]"
|
||||
>
|
||||
<span>Please select a library</span>
|
||||
</Listbox.Option>
|
||||
{CLIENT_LIBRARIES.map((option, i) => {
|
||||
return (
|
||||
<Listbox.Option
|
||||
disabled
|
||||
label="Please select a library"
|
||||
value="no-library"
|
||||
key={`option-${option.key}`}
|
||||
label={option.language}
|
||||
value={option.language}
|
||||
className="min-w-[500px]"
|
||||
>
|
||||
<span>Please select a library</span>
|
||||
<span>{option.language}</span>
|
||||
</Listbox.Option>
|
||||
{CLIENT_LIBRARIES.map((option, i) => {
|
||||
return (
|
||||
<Listbox.Option
|
||||
key={`option-${option.key}`}
|
||||
label={option.language}
|
||||
value={option.language}
|
||||
className="min-w-[500px]"
|
||||
>
|
||||
<span>{option.language}</span>
|
||||
</Listbox.Option>
|
||||
)
|
||||
})}
|
||||
</Listbox>
|
||||
</div>
|
||||
)}
|
||||
)
|
||||
})}
|
||||
</Listbox>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{selectedLibrary !== undefined && (
|
||||
<div className="px-6 space-y-4 !mt-4">
|
||||
<div className="space-y-2">
|
||||
<p className="text-sm text-scale-1100">
|
||||
Found an issue or a bug? Try searching our Github issues or submit a new
|
||||
one.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center space-x-4 overflow-x-auto">
|
||||
{selectedClientLibraries?.map((library) => {
|
||||
const libraryLanguage =
|
||||
values.library === 'Dart (Flutter)'
|
||||
? library.name.split('-')[1]
|
||||
: values.library
|
||||
return (
|
||||
<div
|
||||
key={library.name}
|
||||
className="w-[230px] min-w-[230px] min-h-[128px] rounded border border-scale-600 bg-scale-300 space-y-3 px-4 py-3"
|
||||
>
|
||||
<div className="space-y-1">
|
||||
<p className="text-sm">{library.name}</p>
|
||||
<p className="text-sm text-scale-1100">
|
||||
For issues regarding the {libraryLanguage} client library
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<Link href={library.url}>
|
||||
<a target="_blank">
|
||||
<Button
|
||||
type="default"
|
||||
icon={<IconExternalLink size={14} strokeWidth={1.5} />}
|
||||
>
|
||||
View Github issues
|
||||
</Button>
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
{selectedLibrary !== undefined && (
|
||||
<div className="px-6 space-y-4 !mt-4">
|
||||
<div className="space-y-2">
|
||||
<p className="text-sm text-scale-1100">
|
||||
Found an issue or a bug? Try searching our Github issues or submit a new
|
||||
one.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center space-x-4 overflow-x-auto">
|
||||
{selectedClientLibraries?.map((library) => {
|
||||
const libraryLanguage =
|
||||
values.library === 'Dart (Flutter)'
|
||||
? library.name.split('-')[1]
|
||||
: values.library
|
||||
return (
|
||||
<div
|
||||
className={[
|
||||
'px-4 py-3 rounded border border-scale-600 bg-scale-300',
|
||||
'w-[230px] min-w-[230px] min-h-[128px] flex flex-col justify-between space-y-3',
|
||||
].join(' ')}
|
||||
key={library.name}
|
||||
className="w-[230px] min-w-[230px] min-h-[128px] rounded border border-scale-600 bg-scale-300 space-y-3 px-4 py-3"
|
||||
>
|
||||
<div className="space-y-1">
|
||||
<p className="text-sm">supabase</p>
|
||||
<p className="text-sm">{library.name}</p>
|
||||
<p className="text-sm text-scale-1100">
|
||||
For any issues about our API
|
||||
For issues regarding the {libraryLanguage} client library
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<Link href="https://github.com/supabase/supabase">
|
||||
<Link href={library.url}>
|
||||
<a target="_blank">
|
||||
<Button
|
||||
type="default"
|
||||
@@ -484,108 +404,125 @@ const SupportForm: FC<Props> = ({ setSentCategory }) => {
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
<div
|
||||
className={[
|
||||
'px-4 py-3 rounded border border-scale-600 bg-scale-300',
|
||||
'w-[230px] min-w-[230px] min-h-[128px] flex flex-col justify-between space-y-3',
|
||||
].join(' ')}
|
||||
>
|
||||
<div className="space-y-1">
|
||||
<p className="text-sm">supabase</p>
|
||||
<p className="text-sm text-scale-1100">For any issues about our API</p>
|
||||
</div>
|
||||
<div>
|
||||
<Link href="https://github.com/supabase/supabase">
|
||||
<a target="_blank">
|
||||
<Button
|
||||
type="default"
|
||||
icon={<IconExternalLink size={14} strokeWidth={1.5} />}
|
||||
>
|
||||
View Github issues
|
||||
</Button>
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="px-6 space-y-2">
|
||||
<p className="text-sm text-scale-1100">Which services are affected?</p>
|
||||
<MultiSelect
|
||||
options={SERVICE_OPTIONS}
|
||||
value={selectedServices}
|
||||
placeholder="No particular service"
|
||||
searchPlaceholder="Search for a service"
|
||||
onChange={setSelectedServices}
|
||||
/>
|
||||
</div>
|
||||
<div className="text-area-text-sm px-6">
|
||||
<Input.TextArea
|
||||
id="message"
|
||||
label="Message"
|
||||
placeholder="Describe the issue you're facing, along with any relevant information. Please be as detailed and specific as possible."
|
||||
limit={5000}
|
||||
labelOptional="5000 character limit"
|
||||
/>
|
||||
</div>
|
||||
{['Problem', 'Database_unresponsive', 'Performance'].includes(
|
||||
values.category
|
||||
) && (
|
||||
<div className="px-6">
|
||||
<Checkbox
|
||||
name="allowSupportAccess"
|
||||
label="Allow Supabase Support to access your project temporarily"
|
||||
description="In some cases, we may require temporary access to your project to complete troubleshooting, or to answer questions related specifically to your project"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<div className="space-y-4 px-6">
|
||||
<div className="space-y-1">
|
||||
<p className="block text-sm text-scale-1100">Attachments</p>
|
||||
<p className="block text-sm text-scale-1000">
|
||||
Upload up to {MAX_ATTACHMENTS} screenshots that might be relevant to the
|
||||
issue that you're facing
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<input
|
||||
multiple
|
||||
type="file"
|
||||
// @ts-ignore
|
||||
ref={uploadButtonRef}
|
||||
className="hidden"
|
||||
accept="image/png, image/jpeg"
|
||||
onChange={onFilesUpload}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
{uploadedDataUrls.map((x: any, idx: number) => (
|
||||
<div
|
||||
key={idx}
|
||||
style={{ backgroundImage: `url("${x}")` }}
|
||||
className="relative h-14 w-14 rounded bg-cover bg-center bg-no-repeat"
|
||||
>
|
||||
<div
|
||||
className={[
|
||||
'flex h-4 w-4 items-center justify-center rounded-full bg-red-900',
|
||||
'absolute -top-1 -right-1 cursor-pointer',
|
||||
].join(' ')}
|
||||
onClick={() => removeUploadedFile(idx)}
|
||||
>
|
||||
<IconX size={12} strokeWidth={2} />
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
{uploadedFiles.length < MAX_ATTACHMENTS && (
|
||||
<div
|
||||
className={[
|
||||
'border border-scale-800 opacity-50 transition hover:opacity-100',
|
||||
'group flex h-14 w-14 cursor-pointer items-center justify-center rounded',
|
||||
].join(' ')}
|
||||
onClick={() => {
|
||||
if (uploadButtonRef.current) (uploadButtonRef.current as any).click()
|
||||
}}
|
||||
>
|
||||
<IconPlus strokeWidth={2} size={20} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="px-6">
|
||||
<div className="flex justify-end">
|
||||
<Button
|
||||
htmlType="submit"
|
||||
size="small"
|
||||
icon={<IconMail />}
|
||||
disabled={isSubmitting}
|
||||
loading={isSubmitting}
|
||||
>
|
||||
Send support request
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="px-6 space-y-2">
|
||||
<p className="text-sm text-scale-1100">Which services are affected?</p>
|
||||
<MultiSelect
|
||||
options={SERVICE_OPTIONS}
|
||||
value={selectedServices}
|
||||
placeholder="No particular service"
|
||||
searchPlaceholder="Search for a service"
|
||||
onChange={setSelectedServices}
|
||||
/>
|
||||
</div>
|
||||
<div className="text-area-text-sm px-6">
|
||||
<Input.TextArea
|
||||
id="message"
|
||||
label="Message"
|
||||
placeholder="Describe the issue you're facing, along with any relevant information. Please be as detailed and specific as possible."
|
||||
limit={5000}
|
||||
labelOptional="5000 character limit"
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-4 px-6">
|
||||
<div className="space-y-1">
|
||||
<p className="block text-sm text-scale-1100">Attachments</p>
|
||||
<p className="block text-sm text-scale-1000">
|
||||
Upload up to {MAX_ATTACHMENTS} screenshots that might be relevant to the issue
|
||||
that you're facing
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<input
|
||||
multiple
|
||||
type="file"
|
||||
// @ts-ignore
|
||||
ref={uploadButtonRef}
|
||||
className="hidden"
|
||||
accept="image/png, image/jpeg"
|
||||
onChange={onFilesUpload}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
{uploadedDataUrls.map((x: any, idx: number) => (
|
||||
<div
|
||||
key={idx}
|
||||
style={{ backgroundImage: `url("${x}")` }}
|
||||
className="relative h-14 w-14 rounded bg-cover bg-center bg-no-repeat"
|
||||
>
|
||||
<div
|
||||
className={[
|
||||
'flex h-4 w-4 items-center justify-center rounded-full bg-red-900',
|
||||
'absolute -top-1 -right-1 cursor-pointer',
|
||||
].join(' ')}
|
||||
onClick={() => removeUploadedFile(idx)}
|
||||
>
|
||||
<IconX size={12} strokeWidth={2} />
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
{uploadedFiles.length < MAX_ATTACHMENTS && (
|
||||
<div
|
||||
className={[
|
||||
'border border-scale-800 opacity-50 transition hover:opacity-100',
|
||||
'group flex h-14 w-14 cursor-pointer items-center justify-center rounded',
|
||||
].join(' ')}
|
||||
onClick={() => {
|
||||
if (uploadButtonRef.current) (uploadButtonRef.current as any).click()
|
||||
}}
|
||||
>
|
||||
<IconPlus strokeWidth={2} size={20} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="px-6">
|
||||
<div className="flex justify-end">
|
||||
<Button
|
||||
htmlType="submit"
|
||||
size="small"
|
||||
icon={<IconMail />}
|
||||
disabled={isSubmitting}
|
||||
loading={isSubmitting}
|
||||
>
|
||||
Send support request
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
) : ['Problem', 'Performance'].includes(values.category) ? (
|
||||
<DisabledStateForFreeTier
|
||||
category={selectedCategory?.label ?? ''}
|
||||
projectRef={values.projectRef}
|
||||
/>
|
||||
) : (
|
||||
<></>
|
||||
)}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { FC } from 'react'
|
||||
import { observer } from 'mobx-react-lite'
|
||||
import type { PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PostgresTable } from '@supabase/postgres-meta'
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
import { checkPermissions, useStore } from 'hooks'
|
||||
import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState'
|
||||
|
||||
Loaded 100 of 152 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user