Merge branch 'master' into docs/presence-overview
No files matched your search
@@ -10,7 +10,7 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
|
||||
@@ -124,6 +124,12 @@ jobs:
|
||||
docker buildx imagetools create -t supabase/studio:latest \
|
||||
supabase/studio@${{ needs.release_x86.outputs.image_digest }} \
|
||||
supabase/studio@${{ needs.release_arm.outputs.image_digest }}
|
||||
echo "Published Registry Images" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Image | Link |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "|-------|------|" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| \`supabase/studio:${{ needs.settings.outputs.image_version }}\` | [View on Docker Hub](https://hub.docker.com/r/supabase/studio/tags?name=${{ needs.settings.outputs.image_version }}) |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| \`supabase/studio:latest\` | [View on Docker Hub](https://hub.docker.com/r/supabase/studio/tags?name=latest) |" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
publish:
|
||||
needs:
|
||||
|
||||
@@ -17,8 +17,9 @@ jobs:
|
||||
test:
|
||||
timeout-minutes: 60
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
# Require approval only for pull requests from forks
|
||||
environment: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork && 'Studio E2E Tests' || '' }}
|
||||
|
||||
env:
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||
|
||||
@@ -85,6 +85,11 @@ export const docsConfig: DocsConfig = {
|
||||
href: '/docs/fragments/assistant-chat',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
title: 'EmptyStatePresentational',
|
||||
href: '/docs/fragments/empty-state-presentational',
|
||||
items: [],
|
||||
},
|
||||
{
|
||||
title: 'Modal',
|
||||
href: '/docs/fragments/modal',
|
||||
|
||||
@@ -21,18 +21,31 @@ About to push some code? At a minimum, check your work against this list:
|
||||
|
||||
## Focus management
|
||||
|
||||
All interactive page elements should be reachable by keyboard. They should also provide visual feedback upon selection via a `focus-visible` state. We use consistent focus styles such as `inset-focus` so users recognize this state instantly.
|
||||
All interactive page elements should be reachable by keyboard. Given the below inconsistency between devices and browsers, add `tabIndex={0}` to all buttons, links, and non-text inputs, ideally at the component level. Consider tying the state of `tabIndex` to the `disabled` state of a component, if applicable.
|
||||
|
||||
```jsx
|
||||
<TableCell>
|
||||
<p>{name}</p>
|
||||
<button
|
||||
className={cn('absolute inset-0', 'inset-focus')}
|
||||
onClick={(event) => handleBucketNavigation(name, event)}
|
||||
>
|
||||
<span className="sr-only">Go to bucket details</span>
|
||||
</button>
|
||||
</TableCell>
|
||||
Chromium-based browsers and Firefox handle this automatically via the Tab key. Safari, by default, requires the Option key to also be held down. Enabling _Keyboard navigation_ on macOS Settings [removes this requirement](https://mayank.co/blog/safari-focus/#keyboard-navigation) but makes links non-tabbable as a result.
|
||||
|
||||
Interactive page elements should also provide visual feedback upon selection via a `focus-visible` state. We use consistent focus styles such as `inset-focus` so users recognize this state instantly.
|
||||
|
||||
[Button](../components/button) has all of the above built-in. Bespoke interactive elements however, such as the below clickable [TableRow](../components/table), require these props to be added manually:
|
||||
|
||||
```tsx showLineNumbers {3, 5-11}
|
||||
<TableRow
|
||||
key={id}
|
||||
className="relative cursor-pointer h-16 inset-focus"
|
||||
onClick={(event) => handleBucketNavigation(name, event)}
|
||||
onKeyDown={(event) => {
|
||||
if (event.key === 'Enter' || event.key === ' ') {
|
||||
event.preventDefault()
|
||||
handleBucketNavigation(name, event)
|
||||
}
|
||||
}}
|
||||
tabIndex={0}
|
||||
>
|
||||
<TableCell>
|
||||
<p>{name}</p>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
```
|
||||
|
||||
Consider also affordances like `ctrl` and `meta` key support for opening in a new tab. Anything that you can do with a mouse input should be replicable by keyboard.
|
||||
@@ -51,13 +64,45 @@ Some keyboard-navigable content may be contain hundreds or thousands of items. H
|
||||
- Pagination or virtualization
|
||||
- “Jump to” shortcuts to skip ahead
|
||||
|
||||
## Screen reader support
|
||||
## Screen readers
|
||||
|
||||
Textual elements are supported out-of-the-box by screen readers. Imagery of course should be described by `alt` tags.
|
||||
Textual elements are supported out-of-the-box by screen readers.
|
||||
|
||||
Less obvious however are scaffolding elements that only makes sense visually, when paired with other content. For example: a table column for actions may not have a visual _Actions_ label because its purpose is obvious to a sighted person. For everyone else’s sake, this column should be titled with `sr-only` text:
|
||||
### Imagery
|
||||
|
||||
```jsx
|
||||
Images should have their contents described with an `alt` attribute. Write an objective description of the content rather than its context. For example:
|
||||
|
||||
```tsx showLineNumbers {2}
|
||||
// Correct: painting a picture with words
|
||||
<img src="beagle.png" alt="A tricolor beagle galloping through a grassy field, ears in the air" />
|
||||
|
||||
// Incorrect: Unhelpful context
|
||||
<img src="beagle.png" alt="Our logo" />
|
||||
```
|
||||
|
||||
Icons and other visual elements that aren’t strictly images should use the `aria-label` attribute. For example:
|
||||
|
||||
```tsx showLineNumbers {2}
|
||||
<BucketTableCell>
|
||||
<BucketIcon aria-label="bucket icon" size={16} />
|
||||
</BucketTableCell>
|
||||
```
|
||||
|
||||
Visual elements that are _purely_ visual aids may be removed from the accessibility tree via the `aria-hidden` attribute. For example:
|
||||
|
||||
```tsx showLineNumbers {2}
|
||||
<BucketTableCell>
|
||||
<ChevronRight aria-hidden={true} size={14} />
|
||||
</BucketTableCell>
|
||||
```
|
||||
|
||||
Never use `aria-hidden={true}` on focusable elements, since these are critical pieces of functionality.
|
||||
|
||||
### Scaffolding
|
||||
|
||||
Some scaffolding elements only make sense visually, in the context of surrounding visual content. For example: a table column for actions may not have a visual _Actions_ label because its purpose is obvious (by nearby contents) to a sighted person. For everyone else’s sake, this column should be titled with `sr-only` text:
|
||||
|
||||
```tsx showLineNumbers {2}
|
||||
<TableHead>
|
||||
<span className="sr-only">Actions</span>
|
||||
</TableHead>
|
||||
|
||||
@@ -122,3 +122,13 @@ Displaying only an Icon in a button.
|
||||
Supports slot behavior with `asChild` prop.
|
||||
|
||||
<ComponentPreview name="button-as-child" />
|
||||
|
||||
## Accessibility
|
||||
|
||||
[Keyboard focus](../accessibility#focus-management) is automatically handled:
|
||||
|
||||
- Enabled buttons default to `tabIndex={0}` (keyboard accessible)
|
||||
- Disabled buttons default to `tabIndex={-1}` (removed from tab order)
|
||||
- You can still override with an explicit `tabIndex` prop when needed
|
||||
|
||||
You therefore don't need to manually set `tabIndex`, as Button handles it automatically based on its `disabled` state.
|
||||
@@ -0,0 +1,12 @@
|
||||
---
|
||||
title: EmptyStatePresentational
|
||||
description: An initial state with value propositions and actions.
|
||||
component: true
|
||||
fragment: true
|
||||
---
|
||||
|
||||
<ComponentPreview name="empty-state-initial-state-presentational" peekCode />
|
||||
|
||||
Supports both Lucide icons and custom icon components from the `icons` package. Expects a title, description, and optional action buttons or other children.
|
||||
|
||||
See also [Empty States](../ui-patterns/empty-states).
|
||||
@@ -42,7 +42,7 @@ Perhaps the user has not yet created any data. The presentation of this empty st
|
||||
|
||||
#### Presentational
|
||||
|
||||
The user may be learning about a feature for the first time, and this experience benefits from user education or onboarding. In cases like these, the empty state should put more focus on the feature’s value proposition and an action the user can take.
|
||||
The user may be learning about a feature for the first time, and could benefit from lightweight feature education or onboarding. Use the dedicated [EmptyStatePresentational](../fragments/empty-state-presentational) component in this case, putting emphasis on an action the user can take.
|
||||
|
||||
<ComponentPreview name="empty-state-initial-state-presentational" peekCode wide />
|
||||
|
||||
@@ -56,7 +56,9 @@ Keep in mind that empty states will likely appear after a visual loading state.
|
||||
|
||||
## Components
|
||||
|
||||
There is not yet a shared empty state UI component. The context and needs for each placement differ enough to warrant custom components for each placement.
|
||||
For presentational empty states (initial states with value propositions and actions), use the [EmptyStatePresentational](../fragments/empty-state-presentational) component from `ui-patterns`. This component provides a consistent structure with support for icons, titles, descriptions, and action buttons.
|
||||
|
||||
For other empty state scenarios (zero results, missing routes, etc), custom components may still be appropriate as the context and needs for each placement can differ significantly.
|
||||
|
||||
## External references
|
||||
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
import { BucketPlus } from 'icons'
|
||||
import { Plus } from 'lucide-react'
|
||||
import { Button } from 'ui'
|
||||
import { EmptyStatePresentational } from 'ui-patterns'
|
||||
|
||||
export default function EmptyStateInitialStatePresentational() {
|
||||
return (
|
||||
<aside className="border border-dashed w-full bg-surface-100 rounded-lg px-4 py-10 flex flex-col gap-y-4 items-center text-center gap-1 text-balance">
|
||||
<div className="flex flex-col gap-3 items-center text-center">
|
||||
<BucketPlus size={24} strokeWidth={1.5} className="text-foreground-muted" />
|
||||
<div className="flex flex-col gap-1">
|
||||
<h3>Create a vector bucket</h3>
|
||||
<p className="text-foreground-light text-sm">
|
||||
Store, index, and query your vector embeddings at scale.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<Button size="tiny" type="primary" className="w-fit" icon={<Plus size={14} />}>
|
||||
<EmptyStatePresentational
|
||||
icon={BucketPlus}
|
||||
title="Create a vector bucket"
|
||||
description="Store, index, and query your vector embeddings at scale."
|
||||
>
|
||||
<Button size="tiny" type="primary" icon={<Plus size={14} />}>
|
||||
Create bucket
|
||||
</Button>
|
||||
</aside>
|
||||
</EmptyStatePresentational>
|
||||
)
|
||||
}
|
||||
@@ -17,7 +17,7 @@ export default function EmptyStateMissingRoute() {
|
||||
<Link
|
||||
href="/"
|
||||
onClick={(e) => {
|
||||
e.preventDefault()
|
||||
e.preventDefault() // Just for demo purposes
|
||||
}}
|
||||
>
|
||||
Head back
|
||||
|
||||
@@ -71,7 +71,7 @@ export default function PageLayoutList(): React.JSX.Element {
|
||||
<Input
|
||||
placeholder="Search for a function"
|
||||
size="tiny"
|
||||
icon={<Search size={14} />}
|
||||
icon={<Search />}
|
||||
className="w-full lg:w-52"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -7,6 +7,12 @@ export const fragments: Registry = [
|
||||
files: ['/Dialogs/ConfirmationModal.tsx'],
|
||||
optionalPath: '/Dialogs',
|
||||
},
|
||||
{
|
||||
name: 'EmptyStatePresentational',
|
||||
type: 'components:fragment',
|
||||
files: ['/EmptyStatePresentational/index.tsx'],
|
||||
optionalPath: '/EmptyStatePresentational',
|
||||
},
|
||||
{
|
||||
name: 'TextConfirmModal',
|
||||
type: 'components:fragment',
|
||||
|
||||
@@ -800,6 +800,16 @@ export const auth: NavMenuConstant = {
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'OAuth 2.1 Server',
|
||||
items: [
|
||||
{ name: 'Overview', url: '/guides/auth/oauth-server' },
|
||||
{ name: 'Getting Started', url: '/guides/auth/oauth-server/getting-started' },
|
||||
{ name: 'OAuth Flows', url: '/guides/auth/oauth-server/oauth-flows' },
|
||||
{ name: 'MCP Authentication', url: '/guides/auth/oauth-server/mcp-authentication' },
|
||||
{ name: 'Token Security & RLS', url: '/guides/auth/oauth-server/token-security' },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Third-party auth',
|
||||
enabled: allAuthProvidersEnabled,
|
||||
@@ -1154,14 +1164,6 @@ export const database: NavMenuConstant = {
|
||||
name: 'Setting up',
|
||||
url: '/guides/database/replication/replication-setup' as `/${string}`,
|
||||
},
|
||||
{
|
||||
name: 'Destinations',
|
||||
url: '/guides/database/replication/replication-destinations' as `/${string}`,
|
||||
items: [
|
||||
{ name: 'BigQuery', url: '/guides/database/replication/replication-bigquery' },
|
||||
{ name: 'Iceberg', url: '/guides/database/replication/replication-iceberg' },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Monitoring',
|
||||
url: '/guides/database/replication/replication-monitoring' as `/${string}`,
|
||||
@@ -1170,7 +1172,7 @@ export const database: NavMenuConstant = {
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Manual Replication',
|
||||
name: 'Manual replication',
|
||||
url: '/guides/database/replication/manual-replication-setup' as `/${string}`,
|
||||
items: [
|
||||
{
|
||||
@@ -2407,6 +2409,7 @@ export const security: NavMenuConstant = {
|
||||
{ name: 'Platform configuration', url: '/guides/security/platform-security' },
|
||||
{ name: 'Product configuration', url: '/guides/security/product-security' },
|
||||
{ name: 'Security testing', url: '/guides/security/security-testing' },
|
||||
{ name: 'Platform Audit Logs', url: '/guides/security/platform-audit-logs' },
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
## Rate limits
|
||||
|
||||
Rate limits are applied to prevent abuse and ensure fair usage of the Management API. Rate limits are based on a per-user, per-scope model, meaning each user gets independent rate limits for each project and organization they interact with.
|
||||
|
||||
### Standard rate limit
|
||||
|
||||
| Limit | Duration | Scope |
|
||||
| ------------ | -------- | ---------------------------------- |
|
||||
| 120 requests | 1 minute | Per user, per project/organization |
|
||||
|
||||
When you exceed this rate limit, all subsequent API calls will return a `429 Too Many Requests` response for the remainder of the minute. Once the time window expires, your request quota resets and you can make requests again.
|
||||
|
||||
### Rate limit scope
|
||||
|
||||
Rate limits are applied with per-user + per-scope isolation:
|
||||
|
||||
- **Project scope**: Rate limits apply independently to each project. Requests to one project do not count toward the limit of another project.
|
||||
- **Organization scope**: Rate limits apply independently to each organization. Requests to one organization do not count toward the limit of another organization.
|
||||
|
||||
This means you can make 120 requests to Project A and 120 requests to Project B within the same minute without hitting rate limits, as they are tracked separately.
|
||||
|
||||
### Rate limit response headers
|
||||
|
||||
Every API response includes rate limit information in the following headers:
|
||||
|
||||
- `X-RateLimit-Limit` - The maximum number of requests allowed in the current time window
|
||||
- `X-RateLimit-Remaining` - The number of requests remaining before you hit the rate limit
|
||||
- `X-RateLimit-Reset` - The number of milliseconds remaining until your rate limit resets
|
||||
|
||||
You can use these headers to monitor your usage and implement proactive rate limit handling before receiving a 429 response.
|
||||
|
||||
### How rate limits are tracked
|
||||
|
||||
Your requests are identified and tracked using one of the following identifiers, in this order of priority:
|
||||
|
||||
1. **OAuth App ID** - If your request is authenticated via an OAuth application
|
||||
2. **User ID** - If your request is authenticated with a personal access token
|
||||
3. **IP Address** - If your request is unauthenticated (extracted from request headers)
|
||||
|
||||
Each identifier is combined with the scope (project or organization) to create a unique tracking key. This ensures that rate limits are isolated per user and per scope, preventing one project or organization from affecting another.
|
||||
|
||||
### Endpoint exceptions
|
||||
|
||||
Some endpoints have stricter rate limits than the standard 120 requests per minute to prevent abuse of resource-intensive operations:
|
||||
|
||||
| Endpoint | Limit | Duration | Reason |
|
||||
| ---------------------------------------------------------- | ----------- | -------- | --------------------------------------------------- |
|
||||
| `GET /v1/projects/:ref/endpoints/logs.all` | 30 requests | 1 minute | Analytics log queries are computationally expensive |
|
||||
| `GET /v1/projects/:ref/endpoints/usage.api-counts` | 30 requests | 1 minute | Analytics aggregation is computationally expensive |
|
||||
| `GET /v1/projects/:ref/endpoints/usage.api-requests-count` | 30 requests | 1 minute | Analytics aggregation is computationally expensive |
|
||||
| `GET /v1/projects/:ref/database/context` | 10 requests | 1 minute | Database context operations are resource-intensive |
|
||||
| `GET /v1/projects/:ref/database/context` | 1 request | 1 second | Burst limit to prevent rapid successive requests |
|
||||
| `POST /v1/projects/:ref/config/custom-hostname/initialize` | 10 requests | 1 minute | These operations are expensive |
|
||||
| `POST /v1/projects/:ref/config/custom-hostname/reverify` | 10 requests | 1 minute | These operations are expensive |
|
||||
| `DELETE /v1/projects/:ref/config/custom-hostname` | 10 requests | 1 minute | These operations are expensive |
|
||||
| `GET /v1/projects/:ref/config/vanity-subdomain` | 10 requests | 1 minute | These operations are expensive |
|
||||
|
||||
**Note:** The `GET /v1/projects/:ref/database/context` endpoint has dual rate limiting. You can make up to 10 requests per minute, but also no more than 1 request per second to prevent burst traffic.
|
||||
|
||||
### Best practices
|
||||
|
||||
- **Monitor rate limit headers** - Check the `X-RateLimit-Remaining` header to see how many requests you have left. When it approaches 0, slow down your requests to avoid hitting the limit.
|
||||
- **Implement exponential backoff** - When you receive a 429 response, wait before retrying. You can use the `X-RateLimit-Reset` header (milliseconds) to determine exactly how long to wait.
|
||||
- **Batch operations** - Where possible, combine multiple operations into fewer API calls to reduce your request count.
|
||||
- **Be mindful of expensive endpoints** - Analytics, database context, and domain endpoints have stricter limits, so use them judiciously.
|
||||
@@ -16,11 +16,11 @@ Optional Claims: `jti`, `nbf`, `app_metadata`, `user_metadata`, `amr`,
|
||||
|
||||
**Inputs**
|
||||
|
||||
| Field | Type | Description |
|
||||
| ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `user_id` | `string` | Unique identifier for the user attempting to sign in. |
|
||||
| `claims` | `object` | Claims which are included in the access token. |
|
||||
| `authentication_method` | `string` | The authentication method used to request the access token. Possible values include: `oauth`, `password`, `otp`, `totp`, `recovery`, `invite`, `sso/saml`, `magiclink`, `email/signup`, `email_change`, `token_refresh`, `anonymous`. |
|
||||
| Field | Type | Description |
|
||||
| ----------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `user_id` | `string` | Unique identifier for the user attempting to sign in. |
|
||||
| `claims` | `object` | Claims which are included in the access token. |
|
||||
| `authentication_method` | `string` | The authentication method used to request the access token. Possible values include: `oauth`, `password`, `otp`, `totp`, `recovery`, `invite`, `sso/saml`, `magiclink`, `email/signup`, `email_change`, `token_refresh`, `oauth_provider/authorization_code`, `anonymous`. |
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
@@ -45,7 +45,8 @@ Optional Claims: `jti`, `nbf`, `app_metadata`, `user_metadata`, `amr`,
|
||||
"aal": "aal1",
|
||||
"amr": [ { "method": "anonymous", "timestamp": 1715686621 } ],
|
||||
"session_id": "4b938a09-5372-4177-a314-cfa292099ea2",
|
||||
"is_anonymous": true
|
||||
"is_anonymous": true,
|
||||
"client_id": "oauth-client-id-if-oauth-flow"
|
||||
},
|
||||
"authentication_method": "anonymous"
|
||||
}
|
||||
@@ -143,6 +144,10 @@ Optional Claims: `jti`, `nbf`, `app_metadata`, `user_metadata`, `amr`,
|
||||
"is_anonymous": {
|
||||
"type": "boolean",
|
||||
"x-faker": "random.boolean"
|
||||
},
|
||||
"client_id": {
|
||||
"type": "string",
|
||||
"x-faker": "random.uuid"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -175,6 +180,7 @@ Optional Claims: `jti`, `nbf`, `app_metadata`, `user_metadata`, `amr`,
|
||||
"email/signup",
|
||||
"email_change",
|
||||
"token_refresh",
|
||||
"oauth_provider/authorization_code",
|
||||
"anonymous"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
title: 'OAuth 2.1 Server'
|
||||
description: 'Turn your Supabase project into an OAuth 2.1 and OpenID Connect identity provider'
|
||||
---
|
||||
|
||||
Supabase Auth can act as an OAuth 2.1 and OpenID Connect (OIDC) identity provider. This allows other applications and services to use your Supabase project as their authentication provider, just like "Sign in with Google" or "Sign in with GitHub".
|
||||
|
||||
You can use this to build "Sign in with [Your App]" experiences, authenticate AI agents through the Model Context Protocol (MCP), power developer platforms with third-party integrations, or implement standards-compliant enterprise SSO.
|
||||
|
||||
## Use cases
|
||||
|
||||
There are several reasons why you might want to enable OAuth 2.1 Server in your Supabase project:
|
||||
|
||||
- **Developer platforms and marketplaces**: Allow third-party developers to build integrations and apps for your platform. Partners can offer "Sign in with [Your App]" to their users, with your control over data access through Row Level Security policies.
|
||||
|
||||
- **AI agents and automation**: Authenticate AI agents, LLM tools, and MCP servers that need to access user data. The Model Context Protocol provides automatic OAuth discovery and client registration for AI applications.
|
||||
|
||||
- **Mobile and desktop apps**: Issue OAuth tokens to your own mobile apps, desktop applications, or other first-party clients. All tokens respect your existing Row Level Security policies and work with Custom Access Token Hooks.
|
||||
|
||||
- **Enterprise SSO**: Provide OpenID Connect (OIDC) authentication for enterprise customers who need standards-compliant identity federation across multiple services.
|
||||
|
||||
## Overview
|
||||
|
||||
Supabase Auth implements the OAuth 2.1 authorization code flow with PKCE (Proof Key for Code Exchange). When a third-party application wants to access user data:
|
||||
|
||||
1. The application redirects the user to your authorization endpoint
|
||||
2. Supabase Auth validates the request and redirects to your custom authorization UI
|
||||
3. The user authenticates (using any of your enabled auth methods) and approves access
|
||||
4. Supabase Auth issues an authorization code
|
||||
5. The application exchanges the code for access and refresh tokens
|
||||
6. The application uses the access token to make authenticated API requests
|
||||
|
||||
Access tokens are standard Supabase JWTs that include `user_id`, `role`, and `client_id` claims. Your existing Row Level Security policies automatically apply to OAuth tokens, giving you fine-grained control over what each client can access.
|
||||
|
||||
### Supported standards
|
||||
|
||||
- **OAuth 2.1**: Latest OAuth specification with mandatory PKCE
|
||||
- **OpenID Connect**: ID tokens (with `openid` scope), UserInfo endpoint, and OIDC discovery
|
||||
- **Standard scopes**: `openid`, `email`, `profile`, and `phone` scopes for controlling data access
|
||||
- **Dynamic client registration**: Automatic registration for MCP-compatible clients
|
||||
- **JWKS endpoint**: Public keys for third parties to validate tokens
|
||||
|
||||
### Integration with existing auth
|
||||
|
||||
OAuth 2.1 Server works seamlessly with your existing Supabase Auth configuration:
|
||||
|
||||
- Users can authenticate using any enabled method (password, magic link, social providers, MFA, phone)
|
||||
- [Custom Access Token Hooks](/guides/auth/auth-hooks/access-token-hook) apply to OAuth tokens, allowing you to customize claims like `audience` or add client-specific permissions
|
||||
- Row Level Security policies control data access using the `client_id` claim in tokens
|
||||
- All standard Supabase features (email templates, hooks, rate limiting) continue to work
|
||||
|
||||
## Set up OAuth 2.1 server
|
||||
|
||||
To enable OAuth 2.1 Server in your project, follow these guides:
|
||||
|
||||
<div className="grid md:grid-cols-12 gap-4 not-prose">
|
||||
{[
|
||||
{
|
||||
name: 'Getting Started',
|
||||
description:
|
||||
'Enable OAuth 2.1, configure your authorization endpoint, and register your first client.',
|
||||
href: '/guides/auth/oauth-server/getting-started',
|
||||
},
|
||||
{
|
||||
name: 'OAuth Flows',
|
||||
description: 'Detailed walkthrough of authorization code and refresh token flows.',
|
||||
href: '/guides/auth/oauth-server/oauth-flows',
|
||||
},
|
||||
{
|
||||
name: 'MCP Authentication',
|
||||
description: 'Authenticate AI agents and LLM tools using Model Context Protocol.',
|
||||
href: '/guides/auth/oauth-server/mcp-authentication',
|
||||
},
|
||||
{
|
||||
name: 'Token Security & RLS',
|
||||
description: 'Control data access with Row Level Security policies for OAuth clients.',
|
||||
href: '/guides/auth/oauth-server/token-security',
|
||||
},
|
||||
].map((x) => (
|
||||
<div className="col-span-6" key={x.href}>
|
||||
<Link href={x.href} passHref>
|
||||
<GlassPanel title={x.name}>{x.description}</GlassPanel>
|
||||
</Link>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
## Resources
|
||||
|
||||
- [GitHub Discussion](https://github.com/orgs/supabase/discussions/38022) - Share your use cases and help shape the roadmap
|
||||
- [Discord Community](https://discord.supabase.com/) - Get help and share what you're building
|
||||
@@ -0,0 +1,614 @@
|
||||
---
|
||||
id: 'oauth-server-getting-started'
|
||||
title: 'Getting Started with OAuth 2.1 Server'
|
||||
description: 'Learn how to enable OAuth 2.1 and register client applications in your Supabase project'
|
||||
---
|
||||
|
||||
This guide will walk you through setting up your Supabase project as an OAuth 2.1 identity provider, from enabling the feature to registering your first client application.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before you begin, make sure you have:
|
||||
|
||||
- A Supabase project (create one at [supabase.com](https://supabase.com))
|
||||
- Admin access to your project
|
||||
- (Optional) [Supabase CLI](/docs/guides/cli) v2.54.11 or higher for local development
|
||||
|
||||
## Overview
|
||||
|
||||
Setting up OAuth 2.1 in your Supabase project involves these steps:
|
||||
|
||||
1. Enable OAuth 2.1 server capabilities in your project
|
||||
2. Configure your authorization path
|
||||
3. Build your authorization UI (frontend)
|
||||
4. Register OAuth client applications
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Testing OAuth flows is often easier on a Supabase project since it's already accessible on the web, no tunnel or additional configuration needed.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Enable OAuth 2.1 server
|
||||
|
||||
OAuth 2.1 server is currently in beta and free to use during the beta period on all Supabase plans.
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="dashboard"
|
||||
queryGroup="oauth-setup"
|
||||
>
|
||||
<TabPanel id="dashboard" label="Cloud">
|
||||
|
||||
1. Go to your project dashboard
|
||||
2. Navigate to **Authentication** > **OAuth Server** in the sidebar
|
||||
3. Enable OAuth 2.1 server capabilities
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="cli" label="CLI">
|
||||
|
||||
Edit your `supabase/config.toml` file and add the OAuth server configuration:
|
||||
|
||||
```toml
|
||||
[auth.oauth_server]
|
||||
enabled = true
|
||||
authorization_url_path = "/oauth/consent"
|
||||
allow_dynamic_registration = false # Optional: enable dynamic client registration
|
||||
```
|
||||
|
||||
Start or restart your local Supabase instance:
|
||||
|
||||
```bash
|
||||
supabase start
|
||||
# or if already running:
|
||||
supabase stop && supabase start
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
Once enabled, your project will expose the necessary OAuth endpoints:
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="dashboard"
|
||||
queryGroup="oauth-setup"
|
||||
>
|
||||
<TabPanel id="dashboard" label="Cloud">
|
||||
|
||||
| Endpoint | URL |
|
||||
| -------------------------- | ---------------------------------------------------------------------------------- |
|
||||
| **Authorization endpoint** | `https://<project-ref>.supabase.co/auth/v1/oauth/authorize` |
|
||||
| **Token endpoint** | `https://<project-ref>.supabase.co/auth/v1/oauth/token` |
|
||||
| **JWKS endpoint** | `https://<project-ref>.supabase.co/auth/v1/.well-known/jwks.json` |
|
||||
| **Discovery endpoint** | `https://<project-ref>.supabase.co/.well-known/oauth-authorization-server/auth/v1` |
|
||||
| **OIDC discovery** | `https://<project-ref>.supabase.co/auth/v1/.well-known/openid-configuration` |
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="cli" label="CLI">
|
||||
|
||||
| Endpoint | URL |
|
||||
| -------------------------- | ----------------------------------------------------------------------- |
|
||||
| **Authorization endpoint** | `http://localhost:54321/auth/v1/oauth/authorize` |
|
||||
| **Token endpoint** | `http://localhost:54321/auth/v1/oauth/token` |
|
||||
| **JWKS endpoint** | `http://localhost:54321/auth/v1/.well-known/jwks.json` |
|
||||
| **Discovery endpoint** | `http://localhost:54321/.well-known/oauth-authorization-server/auth/v1` |
|
||||
| **OIDC discovery** | `http://localhost:54321/auth/v1/.well-known/openid-configuration` |
|
||||
|
||||
### Expose local instance to the world
|
||||
|
||||
To test OAuth flows with external applications, you can expose your local Supabase instance using a tunnel solution (such as [ngrok](https://ngrok.com/) or [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/)).
|
||||
|
||||
When using a tunnel, configure the `jwt_issuer` field in your `supabase/config.toml` to match your tunnel URL:
|
||||
|
||||
```toml
|
||||
[auth]
|
||||
jwt_issuer = "https://my-tunnel.url/auth/v1"
|
||||
```
|
||||
|
||||
This ensures that JWTs issued by your local instance use the correct issuer claim for token validation, and serves the discovery endpoint at the correct location with accurate discovery information.
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
**Use asymmetric JWT signing keys for better security**
|
||||
|
||||
By default, Supabase uses HS256 (symmetric) for signing JWTs. For OAuth use cases, we recommend migrating to asymmetric algorithms like RS256 or ES256. Asymmetric keys are more scalable and secure because:
|
||||
|
||||
- OAuth clients can validate JWTs using the public key from your JWKS endpoint
|
||||
- No need to share your JWT secret with third-party applications
|
||||
- More resilient architecture for distributed systems
|
||||
|
||||
Learn more about [configuring JWT signing keys](/docs/guides/auth/signing-keys).
|
||||
|
||||
**Note:** If you plan to use OpenID Connect ID tokens (by requesting the `openid` scope), asymmetric signing algorithms are **required**. ID token generation will fail with HS256.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Configure your authorization path
|
||||
|
||||
Before registering clients, you need to configure where your authorization UI will live.
|
||||
|
||||
1. In your project dashboard, navigate to **Authentication** > **OAuth Server**
|
||||
2. Set the **Authorization Path** (e.g., `/oauth/consent`)
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
The authorization path is combined with your Site URL (configured in **Authentication** > **URL Configuration**) to create the full authorization endpoint URL.
|
||||
|
||||
</Admonition>
|
||||
|
||||
Your authorization UI will be at the combined Site URL + Authorization Path. For example:
|
||||
|
||||
- Site URL: `https://example.com` (from **Authentication** > **URL Configuration**)
|
||||
- Authorization Path: `/oauth/consent` (from **OAuth Server** settings)
|
||||
- Your authorization UI: `https://example.com/oauth/consent`
|
||||
|
||||
When OAuth clients initiate the authorization flow, Supabase Auth will redirect users to this URL with an `authorization_id` query parameter. You'll use [Supabase JavaScript library OAuth methods](https://github.com/supabase/supabase-js/blob/master/packages/core/auth-js/src/GoTrueClient.ts#L2159-L2163) to handle the authorization:
|
||||
|
||||
- `supabase.auth.oauth.getAuthorizationDetails(authorization_id)` - Retrieve client and authorization details
|
||||
- `supabase.auth.oauth.approveAuthorization(authorization_id)` - Approve the authorization request
|
||||
- `supabase.auth.oauth.denyAuthorization(authorization_id)` - Deny the authorization request
|
||||
|
||||
## Build your authorization UI
|
||||
|
||||
This is where you build the **frontend** for your authorization flow. When third-party apps initiate OAuth, users will be redirected to your authorization path (configured in the previous step) with an `authorization_id` query parameter.
|
||||
|
||||
Your authorization UI should:
|
||||
|
||||
1. **Extract authorization_id** - Get the `authorization_id` from the URL query parameters
|
||||
2. **Authenticate the user** - If not already logged in, redirect to your login page (preserving the authorization_id)
|
||||
3. **Retrieve authorization details** - Use `supabase.auth.oauth.getAuthorizationDetails(authorization_id)` to get client information including requested scopes
|
||||
4. **Display consent screen** - Show the user what app is requesting access and what scopes/permissions are being requested
|
||||
5. **Handle user decision** - Call either `approveAuthorization(authorization_id)` or `denyAuthorization(authorization_id)` based on user choice
|
||||
|
||||
The authorization details include a `scopes` field that contains the scopes requested by the client (e.g., `["openid", "email", "profile"]`). You should display these scopes to the user so they understand what information will be shared.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
This is a **frontend implementation**. You're building the UI that displays the consent screen and handles user interactions. The actual OAuth token generation is handled by Supabase Auth after you call the approve/deny methods.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Example authorization UI
|
||||
|
||||
Here's how to build a minimal authorization page at your configured path (e.g., `/oauth/consent`):
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="nextjs"
|
||||
queryGroup="framework"
|
||||
>
|
||||
<TabPanel id="nextjs" label="Next.js">
|
||||
|
||||
```tsx
|
||||
// app/oauth/consent/page.tsx
|
||||
import { createServerClient } from '@supabase/ssr'
|
||||
import { cookies } from 'next/headers'
|
||||
import { redirect } from 'next/navigation'
|
||||
|
||||
export default async function ConsentPage({
|
||||
searchParams,
|
||||
}: {
|
||||
searchParams: { authorization_id?: string }
|
||||
}) {
|
||||
const authorizationId = searchParams.authorization_id
|
||||
|
||||
if (!authorizationId) {
|
||||
return <div>Error: Missing authorization_id</div>
|
||||
}
|
||||
|
||||
const supabase = createServerClient(
|
||||
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
||||
{
|
||||
cookies: {
|
||||
getAll: async () => (await cookies()).getAll(),
|
||||
setAll: async (cookiesToSet) => {
|
||||
const cookieStore = await cookies()
|
||||
cookiesToSet.forEach(({ name, value, options }) => cookieStore.set(name, value, options))
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
// Check if user is authenticated
|
||||
const {
|
||||
data: { user },
|
||||
} = await supabase.auth.getUser()
|
||||
|
||||
if (!user) {
|
||||
// Redirect to login, preserving authorization_id
|
||||
redirect(`/login?redirect=/oauth/consent?authorization_id=${authorizationId}`)
|
||||
}
|
||||
|
||||
// Get authorization details using the authorization_id
|
||||
const { data: authDetails, error } =
|
||||
await supabase.auth.oauth.getAuthorizationDetails(authorizationId)
|
||||
|
||||
if (error || !authDetails) {
|
||||
return <div>Error: {error?.message || 'Invalid authorization request'}</div>
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Authorize {authDetails.client.name}</h1>
|
||||
<p>This application wants to access your account.</p>
|
||||
|
||||
<div>
|
||||
<p>
|
||||
<strong>Client:</strong> {authDetails.client.name}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Redirect URI:</strong> {authDetails.redirect_uri}
|
||||
</p>
|
||||
{authDetails.scopes && authDetails.scopes.length > 0 && (
|
||||
<div>
|
||||
<strong>Requested permissions:</strong>
|
||||
<ul>
|
||||
{authDetails.scopes.map((scope) => (
|
||||
<li key={scope}>{scope}</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<form action="/api/oauth/decision" method="POST">
|
||||
<input type="hidden" name="authorization_id" value={authorizationId} />
|
||||
<button type="submit" name="decision" value="approve">
|
||||
Approve
|
||||
</button>
|
||||
<button type="submit" name="decision" value="deny">
|
||||
Deny
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
```typescript
|
||||
// app/api/oauth/decision/route.ts
|
||||
import { createServerClient } from '@supabase/ssr'
|
||||
import { cookies } from 'next/headers'
|
||||
import { NextResponse } from 'next/server'
|
||||
|
||||
export async function POST(request: Request) {
|
||||
const formData = await request.formData()
|
||||
const decision = formData.get('decision')
|
||||
const authorizationId = formData.get('authorization_id') as string
|
||||
|
||||
if (!authorizationId) {
|
||||
return NextResponse.json({ error: 'Missing authorization_id' }, { status: 400 })
|
||||
}
|
||||
|
||||
const supabase = createServerClient(
|
||||
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
||||
{
|
||||
cookies: {
|
||||
getAll: async () => (await cookies()).getAll(),
|
||||
setAll: async (cookiesToSet) => {
|
||||
const cookieStore = await cookies()
|
||||
cookiesToSet.forEach(({ name, value, options }) => cookieStore.set(name, value, options))
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
if (decision === 'approve') {
|
||||
const { data, error } = await supabase.auth.oauth.approveAuthorization(authorizationId)
|
||||
|
||||
if (error) {
|
||||
return NextResponse.json({ error: error.message }, { status: 400 })
|
||||
}
|
||||
|
||||
// Redirect back to the client with authorization code
|
||||
return NextResponse.redirect(data.redirect_to)
|
||||
} else {
|
||||
const { data, error } = await supabase.auth.oauth.denyAuthorization(authorizationId)
|
||||
|
||||
if (error) {
|
||||
return NextResponse.json({ error: error.message }, { status: 400 })
|
||||
}
|
||||
|
||||
// Redirect back to the client with error
|
||||
return NextResponse.redirect(data.redirect_to)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="react" label="React (SPA)">
|
||||
|
||||
```tsx
|
||||
// src/pages/OAuthConsent.tsx
|
||||
import { useEffect, useState } from 'react'
|
||||
import { useNavigate, useSearchParams } from 'react-router-dom'
|
||||
import { supabase } from './supabaseClient'
|
||||
|
||||
export function OAuthConsent() {
|
||||
const navigate = useNavigate()
|
||||
const [searchParams] = useSearchParams()
|
||||
const authorizationId = searchParams.get('authorization_id')
|
||||
|
||||
const [authDetails, setAuthDetails] = useState<any>(null)
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
async function loadAuthDetails() {
|
||||
if (!authorizationId) {
|
||||
setError('Missing authorization_id')
|
||||
setLoading(false)
|
||||
return
|
||||
}
|
||||
|
||||
// Check if user is authenticated
|
||||
const {
|
||||
data: { user },
|
||||
} = await supabase.auth.getUser()
|
||||
|
||||
if (!user) {
|
||||
navigate(`/login?redirect=/oauth/consent?authorization_id=${authorizationId}`)
|
||||
return
|
||||
}
|
||||
|
||||
// Get authorization details using the authorization_id
|
||||
const { data, error } = await supabase.auth.oauth.getAuthorizationDetails(authorizationId)
|
||||
|
||||
if (error) {
|
||||
setError(error.message)
|
||||
} else {
|
||||
setAuthDetails(data)
|
||||
}
|
||||
|
||||
setLoading(false)
|
||||
}
|
||||
|
||||
loadAuthDetails()
|
||||
}, [authorizationId, navigate])
|
||||
|
||||
async function handleApprove() {
|
||||
if (!authorizationId) return
|
||||
|
||||
const { data, error } = await supabase.auth.oauth.approveAuthorization(authorizationId)
|
||||
|
||||
if (error) {
|
||||
setError(error.message)
|
||||
} else {
|
||||
// Redirect to client app
|
||||
window.location.href = data.redirect_to
|
||||
}
|
||||
}
|
||||
|
||||
async function handleDeny() {
|
||||
if (!authorizationId) return
|
||||
|
||||
const { data, error } = await supabase.auth.oauth.denyAuthorization(authorizationId)
|
||||
|
||||
if (error) {
|
||||
setError(error.message)
|
||||
} else {
|
||||
// Redirect to client app with error
|
||||
window.location.href = data.redirect_to
|
||||
}
|
||||
}
|
||||
|
||||
if (loading) return <div>Loading...</div>
|
||||
if (error) return <div>Error: {error}</div>
|
||||
if (!authDetails) return <div>No authorization request found</div>
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Authorize {authDetails.client.name}</h1>
|
||||
<p>This application wants to access your account.</p>
|
||||
|
||||
<div>
|
||||
<p>
|
||||
<strong>Client:</strong> {authDetails.client.name}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Redirect URI:</strong> {authDetails.redirect_uri}
|
||||
</p>
|
||||
{authDetails.scopes && authDetails.scopes.length > 0 && (
|
||||
<div>
|
||||
<strong>Requested permissions:</strong>
|
||||
<ul>
|
||||
{authDetails.scopes.map((scope) => (
|
||||
<li key={scope}>{scope}</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button onClick={handleApprove}>Approve</button>
|
||||
<button onClick={handleDeny}>Deny</button>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
### How it works
|
||||
|
||||
1. **User navigates to your authorization path** - When a third-party app initiates OAuth, Supabase Auth redirects the user to your configured authorization path (e.g., `https://example.com/oauth/consent?authorization_id=<id>`)
|
||||
2. **Extract authorization_id** - Your page extracts the `authorization_id` from the URL query parameters
|
||||
3. **Check authentication** - Your page checks if the user is logged in, redirecting to login if not (preserving the authorization_id)
|
||||
4. **Retrieve details** - Call `supabase.auth.oauth.getAuthorizationDetails(authorization_id)` to get information about the requesting client
|
||||
5. **Show consent screen** - Display a UI asking the user to approve or deny access
|
||||
6. **Handle decision** - When the user clicks approve/deny:
|
||||
- Call `supabase.auth.oauth.approveAuthorization(authorization_id)` or `denyAuthorization(authorization_id)`
|
||||
- These methods handle all OAuth logic internally (generating authorization codes, etc.)
|
||||
- They return a `redirect_to` URL
|
||||
7. **Redirect back** - Redirect the user to the `redirect_to` URL, which sends them back to the third-party app with either an authorization code (approved) or error (denied)
|
||||
|
||||
## Register an OAuth client
|
||||
|
||||
Before third-party applications can use your project as an identity provider, you need to register them as OAuth clients.
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="dashboard"
|
||||
queryGroup="oauth-setup"
|
||||
>
|
||||
<TabPanel id="dashboard" label="Dashboard">
|
||||
|
||||
1. Go to **Authentication** > **OAuth Apps** (under the **Manage** section)
|
||||
2. Click **Add a new client**
|
||||
3. Enter the client details:
|
||||
- **Client name**: A friendly name for your application
|
||||
- **Redirect URIs**: One or more URLs where users will be redirected after authorization
|
||||
- **Client type**: Choose between:
|
||||
- **Public** - For mobile and single-page apps (no client secret)
|
||||
- **Confidential** - For server-side apps (includes client secret)
|
||||
4. Click **Create**
|
||||
|
||||
You'll receive:
|
||||
|
||||
- **Client ID**: A unique identifier for the client
|
||||
- **Client Secret** (for confidential clients): A secret key for authenticating the client
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
Store the client secret securely. It will only be shown once. If you lose it, you can regenerate a new one from the **OAuth Apps** page.
|
||||
|
||||
</Admonition>
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="programmatically" label="Programmatically">
|
||||
|
||||
You can register clients programmatically by calling your project's auth server admin endpoint with a secret key:
|
||||
|
||||
**Production:**
|
||||
|
||||
```bash
|
||||
curl -X POST 'https://<project-ref>.supabase.co/auth/v1/admin/oauth/clients' \
|
||||
-H "Authorization: Bearer ${SUPABASE_SECRET_KEY}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "My Third-Party App",
|
||||
"redirect_uris": [
|
||||
"https://my-app.com/auth/callback",
|
||||
"https://my-app.com/auth/silent-callback"
|
||||
],
|
||||
"client_type": "confidential"
|
||||
}'
|
||||
```
|
||||
|
||||
**Local development:**
|
||||
|
||||
```bash
|
||||
curl -X POST 'http://localhost:54321/auth/v1/admin/oauth/clients' \
|
||||
-H "Authorization: Bearer ${SUPABASE_SECRET_KEY}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "Local Dev App",
|
||||
"redirect_uris": ["http://localhost:3000/auth/callback"],
|
||||
"client_type": "confidential"
|
||||
}'
|
||||
```
|
||||
|
||||
Response:
|
||||
|
||||
```json
|
||||
{
|
||||
"client_id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
|
||||
"client_secret": "verysecret-1234567890abcdef...",
|
||||
"name": "My Third-Party App",
|
||||
"redirect_uris": ["https://my-app.com/auth/callback", "https://my-app.com/auth/silent-callback"],
|
||||
"client_type": "confidential",
|
||||
"created_at": "2025-01-15T10:30:00.000Z"
|
||||
}
|
||||
```
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
For complete API documentation, see the [OAuth Admin API reference](/todo).
|
||||
|
||||
</Admonition>
|
||||
|
||||
### List OAuth clients
|
||||
|
||||
To view all registered OAuth clients:
|
||||
|
||||
**Production:**
|
||||
|
||||
```bash
|
||||
curl 'https://<project-ref>.supabase.co/auth/v1/admin/oauth/clients' \
|
||||
-H "Authorization: Bearer ${SUPABASE_SECRET_KEY}"
|
||||
```
|
||||
|
||||
**Local development:**
|
||||
|
||||
```bash
|
||||
curl 'http://localhost:54321/auth/v1/admin/oauth/clients' \
|
||||
-H "Authorization: Bearer ${SUPABASE_SECRET_KEY}"
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
## Customizing tokens (optional)
|
||||
|
||||
By default, OAuth access tokens include standard claims like `user_id`, `role`, and `client_id`. If you need to customize tokens—for example, to set a specific `audience` claim for third-party validation or add client-specific metadata—use [Custom Access Token Hooks](/docs/guides/auth/auth-hooks/access-token-hook).
|
||||
|
||||
Custom Access Token Hooks are triggered for all token issuance, including OAuth flows. You can use the `client_id` parameter to customize tokens based on which OAuth client is requesting them.
|
||||
|
||||
### Common use cases
|
||||
|
||||
- **Customize `audience` claim**: Set the `aud` claim to the third-party API endpoint for proper JWT validation
|
||||
- **Add client-specific permissions**: Include custom claims based on which OAuth client is requesting access
|
||||
- **Implement dynamic scopes**: Add metadata that RLS policies can use for fine-grained access control
|
||||
|
||||
For more examples, see [Token Security & RLS](/docs/guides/auth/oauth-server/token-security#custom-access-token-hooks).
|
||||
|
||||
## Redirect URI configuration
|
||||
|
||||
Redirect URIs are critical for OAuth security. Supabase Auth will only redirect to URIs that are explicitly registered with the client.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
**Not to be confused with general redirect URLs**
|
||||
|
||||
This section is about **OAuth client redirect URIs** - where to send users after they authorize third-party apps to access your Supabase project. This is different from the general [Redirect URLs](/docs/guides/auth/redirect-urls) setting, which controls where to send users after they sign in TO your app using social providers.
|
||||
|
||||
</Admonition>
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
**Exact matches only - No wildcards or patterns**
|
||||
|
||||
OAuth client redirect URIs require exact, complete URL matches. Unlike general redirect URLs (which support wildcards), OAuth client redirect URIs do NOT support wildcards, patterns, or partial URLs. You must register the full, exact callback URL.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Best practices
|
||||
|
||||
- **Use HTTPS in production** - Always use HTTPS for redirect URIs in production
|
||||
- **Register exact, complete URLs** - Each redirect URI must be the full URL including protocol, domain, path, and port if needed
|
||||
- **Use separate OAuth clients per environment** - Create separate OAuth clients for development, staging, and production. This provides better security isolation, allows independent secret rotation, and improves auditability. If you need to use the same client across environments, you can register multiple redirect URIs, but separate clients are recommended.
|
||||
|
||||
## Next steps
|
||||
|
||||
Now that you've registered your first OAuth client, you're ready to:
|
||||
|
||||
- [Understand OAuth flows](/docs/guides/auth/oauth-server/oauth-flows) - Learn how the authorization code and refresh token flows work
|
||||
- [Implement MCP authentication](/docs/guides/auth/oauth-server/mcp-authentication) - Enable AI agent authentication
|
||||
- [Secure with RLS](/docs/guides/auth/oauth-server/token-security) - Control data access for OAuth clients
|
||||
@@ -0,0 +1,156 @@
|
||||
---
|
||||
id: 'oauth-server-mcp'
|
||||
title: 'Model Context Protocol (MCP) Authentication'
|
||||
description: 'Integrate Supabase Auth with MCP servers to authenticate AI agents using your existing user base'
|
||||
---
|
||||
|
||||
The Model Context Protocol (MCP) is an open standard for connecting AI agents and LLM tools to data sources and services. While Supabase doesn't provide MCP server functionality, you can build your own MCP servers that connect to your Supabase project and leverage Supabase Auth's OAuth 2.1 capabilities to authenticate AI agents using your existing user base.
|
||||
|
||||
## Why use Supabase Auth for MCP?
|
||||
|
||||
When building MCP servers that connect to your Supabase project, you can leverage your existing Supabase Auth infrastructure to authenticate AI agents:
|
||||
|
||||
- **Use your existing user base** - No need to create separate authentication systems; AI agents authenticate as your existing users
|
||||
- **Standards-compliant OAuth 2.1** - Full implementation with PKCE that MCP clients expect
|
||||
- **Automatic discovery** - MCP clients auto-configure using Supabase's discovery endpoints
|
||||
- **Dynamic client registration** - MCP clients can register themselves automatically with your project
|
||||
- **Row Level Security** - Your existing RLS policies automatically apply to MCP clients
|
||||
- **User authorization** - Users explicitly approve AI agent access through your authorization flow
|
||||
- **Token management** - Automatic refresh token rotation and expiration handled by Supabase
|
||||
|
||||
## How MCP authentication works
|
||||
|
||||
When you build an MCP server that connects to your Supabase project, authentication flows through Supabase Auth:
|
||||
|
||||
1. **Discovery**: The MCP client fetches your OAuth configuration from Supabase's discovery endpoint
|
||||
2. **Registration** (optional): The client registers itself as an OAuth client in your Supabase project
|
||||
3. **Authorization**: User is redirected to your authorization endpoint to approve the AI tool's access
|
||||
4. **Token exchange**: Supabase issues access and refresh tokens for the authenticated user
|
||||
5. **Authenticated access**: The MCP server can now make requests to your Supabase APIs on behalf of the user
|
||||
|
||||
By leveraging Supabase Auth, your MCP server can authenticate AI agents using your existing user accounts without building a separate authentication system.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before setting up MCP authentication:
|
||||
|
||||
- [Enable OAuth 2.1 server](/docs/guides/auth/oauth-server/getting-started) in your Supabase project
|
||||
- Build an [authorization endpoint](/docs/guides/auth/oauth-server/getting-started#build-your-authorization-endpoint)
|
||||
- (Optional) Enable dynamic client registration
|
||||
|
||||
## Setting up your MCP server
|
||||
|
||||
Configure your MCP server to use your Supabase Auth server:
|
||||
|
||||
```
|
||||
https://<project-ref>.supabase.co/auth/v1
|
||||
```
|
||||
|
||||
Replace `<project-ref>` with your project reference ID from the Supabase dashboard.
|
||||
|
||||
MCP clients will automatically discover your OAuth configuration from:
|
||||
|
||||
```
|
||||
https://<project-ref>.supabase.co/.well-known/oauth-authorization-server/auth/v1
|
||||
```
|
||||
|
||||
### OAuth client setup
|
||||
|
||||
Depending on your MCP server implementation, you have two options:
|
||||
|
||||
- **Pre-register an OAuth client** - Manually register your client by following the [Register an OAuth client](/docs/guides/auth/oauth-server/getting-started#register-an-oauth-client) guide and use the client credentials in your MCP server
|
||||
- **Dynamic client registration** - Enable this in **Authentication** > **OAuth Server** in your Supabase dashboard to allow MCP clients to register themselves automatically without manual intervention
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
Dynamic registration allows any MCP client to register with your project. Consider:
|
||||
|
||||
- Requiring user approval for all clients
|
||||
- Monitoring registered clients regularly
|
||||
- Validating redirect URIs are from trusted domains
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Building an MCP server with Supabase Auth
|
||||
|
||||
When building your own MCP server, integrate with Supabase Auth to authenticate AI agents as your existing users and leverage your RLS policies.
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
**Looking for an easier way to build MCP servers?**
|
||||
|
||||
[FastMCP](https://gofastmcp.com) provides a streamlined way to build MCP servers with built-in Supabase Auth integration. FastMCP handles OAuth configuration, token management, and authentication flows automatically, letting you focus on building your AI agent's functionality. Check out their [Supabase integration guide](https://gofastmcp.com/todo) to get started quickly.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Handling MCP tokens in your application
|
||||
|
||||
When your MCP server makes requests to your Supabase APIs on behalf of authenticated users, it will send access tokens issued by Supabase Auth, just like any other OAuth client.
|
||||
|
||||
### Validating MCP tokens
|
||||
|
||||
Use the same token validation as other OAuth clients.
|
||||
|
||||
See [Token Security & RLS](/docs/guides/auth/oauth-server/token-security) for more examples.
|
||||
|
||||
## Security considerations
|
||||
|
||||
### User approval
|
||||
|
||||
Always require explicit user approval for MCP clients:
|
||||
|
||||
- Show clear information about what the AI agent can access
|
||||
- Display the client name and description
|
||||
- List the scopes being requested
|
||||
- Provide an option to deny access
|
||||
- Allow users to revoke access later
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### MCP client can't discover OAuth configuration
|
||||
|
||||
**Problem**: Client shows "OAuth discovery failed" or similar error.
|
||||
|
||||
**Solutions**:
|
||||
|
||||
- Verify OAuth 2.1 is enabled in your project
|
||||
- Check that `/.well-known/oauth-authorization-server` returns valid JSON
|
||||
- Ensure your project URL is accessible
|
||||
|
||||
### Dynamic registration fails
|
||||
|
||||
**Problem**: Client receives 403 or 404 on registration endpoint.
|
||||
|
||||
**Solutions**:
|
||||
|
||||
- Enable dynamic client registration in project settings
|
||||
- Verify redirect URIs are valid, complete URLs (protocol, domain, path, and port)
|
||||
- Check for rate limiting on registration endpoint
|
||||
|
||||
### Token exchange fails
|
||||
|
||||
**Problem**: Client receives "invalid_grant" error.
|
||||
|
||||
**Solutions**:
|
||||
|
||||
- Verify authorization code hasn't expired (10 minutes)
|
||||
- Ensure code verifier matches code challenge
|
||||
- Check that redirect URI exactly matches registration
|
||||
- Confirm client_id is correct
|
||||
|
||||
### RLS policies block MCP access
|
||||
|
||||
**Problem**: MCP client can't access data despite valid token.
|
||||
|
||||
**Solutions**:
|
||||
|
||||
- Check RLS policies include the MCP client's `client_id`
|
||||
- Verify user has necessary permissions
|
||||
- Test with service role key to isolate RLS issues
|
||||
- Review [Token Security guide](/docs/guides/auth/oauth-server/token-security)
|
||||
|
||||
## Next steps
|
||||
|
||||
- [Secure with RLS](/docs/guides/auth/oauth-server/token-security) - Create granular policies for MCP clients
|
||||
- [OAuth flows](/docs/guides/auth/oauth-server/oauth-flows) - Deep dive into OAuth implementation
|
||||
- [MCP Specification](https://modelcontextprotocol.io/docs) - Official MCP documentation
|
||||
@@ -0,0 +1,767 @@
|
||||
---
|
||||
id: 'oauth-server-flows'
|
||||
title: 'OAuth 2.1 Flows'
|
||||
description: 'Understanding the authorization code and refresh token flows with OpenID Connect'
|
||||
---
|
||||
|
||||
Supabase Auth implements OAuth 2.1 with OpenID Connect (OIDC), supporting the authorization code flow with PKCE and refresh token flow. This guide explains how these flows work in detail.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
This guide explains the OAuth 2.1 flows for **third-party client applications** that authenticate with your Supabase project. These flows require custom implementation and are not available in the `@supabase/supabase-js` library. The `supabase-js` library is for authenticating **with** Supabase Auth as an identity provider, not for building your own OAuth server.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Supported grant types
|
||||
|
||||
Supabase Auth supports two OAuth 2.1 grant types:
|
||||
|
||||
1. **Authorization Code with PKCE** (`authorization_code`) - For obtaining initial access tokens
|
||||
2. **Refresh Token** (`refresh_token`) - For obtaining new access tokens without re-authentication
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Other grant types like `client_credentials` or `password` are not supported.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Authorization code flow with PKCE
|
||||
|
||||
The authorization code flow with PKCE (Proof Key for Code Exchange) is the recommended flow for all OAuth clients, including single-page applications, mobile apps, and server-side applications.
|
||||
|
||||
### How it works
|
||||
|
||||
The flow consists of several steps:
|
||||
|
||||
1. **Client initiates authorization** - Third-party app redirects user to Supabase Auth's authorize endpoint
|
||||
2. **Supabase validates and redirects** - Supabase Auth validates OAuth parameters and redirects user to your configured authorization URL
|
||||
3. **User authenticates and authorizes** - Your frontend checks if user is logged in, shows consent screen, and handles approval/denial
|
||||
4. **Authorization code issued** - Supabase Auth generates a short-lived authorization code and redirects back to client
|
||||
5. **Code exchange** - Client exchanges the code for tokens
|
||||
6. **Access granted** - Client receives access token, refresh token, and ID token
|
||||
|
||||
### Flow diagram
|
||||
|
||||
Here's a visual representation of the complete authorization code flow:
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐
|
||||
│ │ │ │ │ │
|
||||
│ Client │ │ Your Auth UI │ │ Supabase Auth │
|
||||
│ App │ │ (Frontend) │ │ │
|
||||
│ │ │ │ │ │
|
||||
└──────┬──────┘ └────────┬─────────┘ └────────┬─────────┘
|
||||
│ │ │
|
||||
│ 1. Generate PKCE params │
|
||||
│ (code_verifier, code_challenge) │
|
||||
│ │ │
|
||||
│ 2. Redirect to /oauth/authorize with code_challenge │
|
||||
├────────────────────────────────────────────────────────────────>│
|
||||
│ │ │
|
||||
│ │ 3. Validate params & redirect │
|
||||
│ │ to authorization_path │
|
||||
│ │<────────────────────────────────┤
|
||||
│ │ │
|
||||
│ │ 4. getAuthorizationDetails() │
|
||||
│ ├────────────────────────────────>│
|
||||
│ │ Return client info │
|
||||
│ │<────────────────────────────────┤
|
||||
│ │ │
|
||||
│ │ 5. User login & consent │
|
||||
│ │ │
|
||||
│ │ 6. approveAuthorization() │
|
||||
│ ├────────────────────────────────>│
|
||||
│ │ Return redirect_to with code │
|
||||
│ │<────────────────────────────────┤
|
||||
│ │ │
|
||||
│ 7. Redirect to client callback with code │
|
||||
│<───────────────────────────────────────────────────────────────┤
|
||||
│ │ │
|
||||
│ 8. Exchange code for tokens (POST /oauth/token) │
|
||||
│ with code_verifier │
|
||||
├────────────────────────────────────────────────────────────────>│
|
||||
│ │ │
|
||||
│ 9. Return tokens (access, refresh, ID) │
|
||||
│<────────────────────────────────────────────────────────────────┤
|
||||
│ │ │
|
||||
│ 10. Access resources with access_token │
|
||||
│ │ │
|
||||
│ 11. Refresh tokens (POST /oauth/token with refresh_token) │
|
||||
├────────────────────────────────────────────────────────────────>│
|
||||
│ │ │
|
||||
│ 12. Return new tokens │
|
||||
│<────────────────────────────────────────────────────────────────┤
|
||||
│ │ │
|
||||
```
|
||||
|
||||
**Key points:**
|
||||
|
||||
- Third-party client redirects user to **Supabase Auth's authorize endpoint** (not directly to your UI)
|
||||
- Supabase Auth validates OAuth parameters and redirects to **your authorization path**
|
||||
- Your frontend UI handles authentication and consent using `supabase-js` OAuth methods
|
||||
- Supabase Auth handles all backend OAuth logic (code generation, token issuance)
|
||||
|
||||
### Step 1: Generate PKCE parameters
|
||||
|
||||
Before initiating the flow, the client must generate PKCE parameters:
|
||||
|
||||
```javascript
|
||||
// Generate a random code verifier (43-128 characters)
|
||||
function generateCodeVerifier() {
|
||||
const array = new Uint8Array(32)
|
||||
crypto.getRandomValues(array)
|
||||
return base64URLEncode(array)
|
||||
}
|
||||
|
||||
// Create code challenge from verifier
|
||||
async function generateCodeChallenge(verifier) {
|
||||
const encoder = new TextEncoder()
|
||||
const data = encoder.encode(verifier)
|
||||
const hash = await crypto.subtle.digest('SHA-256', data)
|
||||
return base64URLEncode(new Uint8Array(hash))
|
||||
}
|
||||
|
||||
function base64URLEncode(buffer) {
|
||||
return btoa(String.fromCharCode(...buffer))
|
||||
.replace(/\+/g, '-')
|
||||
.replace(/\//g, '_')
|
||||
.replace(/=/g, '')
|
||||
}
|
||||
|
||||
// Generate and store verifier (you'll need it later)
|
||||
const codeVerifier = generateCodeVerifier()
|
||||
sessionStorage.setItem('code_verifier', codeVerifier)
|
||||
|
||||
// Generate challenge to send in authorization request
|
||||
const codeChallenge = await generateCodeChallenge(codeVerifier)
|
||||
```
|
||||
|
||||
### Step 2: Authorization request
|
||||
|
||||
The client redirects the user to your authorization endpoint with the following parameters:
|
||||
|
||||
```
|
||||
https://<project-ref>.supabase.co/auth/v1/oauth/authorize?
|
||||
response_type=code
|
||||
&client_id=<client-id>
|
||||
&redirect_uri=<configured-redirect-uri>
|
||||
&state=<random-state>
|
||||
&code_challenge=<code-challenge>
|
||||
&code_challenge_method=S256
|
||||
```
|
||||
|
||||
#### Required parameters
|
||||
|
||||
| Parameter | Description |
|
||||
| ----------------------- | -------------------------------------------- |
|
||||
| `response_type` | Must be `code` for authorization code flow |
|
||||
| `client_id` | The client ID from registration |
|
||||
| `redirect_uri` | Must exactly match a registered redirect URI |
|
||||
| `code_challenge` | The generated code challenge |
|
||||
| `code_challenge_method` | Must be `S256` (SHA-256) |
|
||||
|
||||
#### Optional parameters
|
||||
|
||||
| Parameter | Description |
|
||||
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `state` | Random string to prevent CSRF attacks (highly recommended) |
|
||||
| `scope` | Space-separated list of scopes (e.g., `openid email profile phone`). Requested scopes will be included in the access token and control what information is returned by the UserInfo endpoint. Default scope when none provided is `email`. If the `openid` scope is requested, an ID token will be included in the response. |
|
||||
| `nonce` | Random string for replay attack protection. If provided, will be included in the ID token. |
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
Always include a `state` parameter to protect against CSRF attacks. Generate a random string, store it in session storage, and verify it matches when the user returns.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Step 3: User authentication and consent
|
||||
|
||||
After receiving the authorization request, Supabase Auth validates the OAuth parameters (client_id, redirect_uri, PKCE, etc.) and then redirects the user to your configured **authorization path** (e.g., `https://example.com/oauth/consent?authorization_id=<id>`).
|
||||
|
||||
The URL will contain an `authorization_id` query parameter that identifies this authorization request.
|
||||
|
||||
Your frontend application at the authorization path should:
|
||||
|
||||
1. **Extract authorization_id** - Get the `authorization_id` from the URL query parameters
|
||||
2. **Fetch authorization details** - Call `supabase.auth.oauth.getAuthorizationDetails(authorization_id)` to retrieve information about the OAuth client and request parameters
|
||||
3. **Check user authentication** - Verify if the user is logged in; if not, redirect to your login page (preserving the full authorization path including the `authorization_id`). After successful login, redirect the user back to the authorization path with the same `authorization_id` query parameter
|
||||
4. **Display consent screen** - Show the user information about the requesting client (name, redirect URI, scopes)
|
||||
5. **Handle user decision** - When the user approves or denies:
|
||||
- Call `supabase.auth.oauth.approveAuthorization(authorization_id)` to approve
|
||||
- Call `supabase.auth.oauth.denyAuthorization(authorization_id)` to deny
|
||||
- Redirect user to the returned `redirect_to` URL
|
||||
|
||||
This is a **frontend implementation** using `supabase-js`. Supabase Auth handles all the backend OAuth logic (generating authorization codes, validating requests, etc.) after you call the approve/deny methods.
|
||||
|
||||
See the [Getting Started guide](/docs/guides/auth/oauth-server/getting-started#example-authorization-ui) for complete implementation examples.
|
||||
|
||||
### Step 4: Authorization code issued
|
||||
|
||||
If the user approves access, Supabase Auth redirects back to the client's redirect URI with an authorization code:
|
||||
|
||||
```
|
||||
https://client-app.com/callback?
|
||||
code=<authorization-code>
|
||||
&state=<state-from-request>
|
||||
```
|
||||
|
||||
The authorization code is:
|
||||
|
||||
- **Short-lived** - Valid for 10 minutes
|
||||
- **Single-use** - Can only be exchanged once
|
||||
- **Bound to PKCE** - Can only be exchanged with the correct code verifier
|
||||
|
||||
If the user denies access, Supabase Auth redirects with error information in query parameters:
|
||||
|
||||
```
|
||||
https://client-app.com/callback?
|
||||
error=access_denied
|
||||
&error_description=The+user+denied+the+authorization+request
|
||||
&state=<state-from-request>
|
||||
```
|
||||
|
||||
The error parameters allow clients to display relevant error messages to users:
|
||||
|
||||
| Parameter | Description |
|
||||
| ------------------- | --------------------------------------------------------------------- |
|
||||
| `error` | Error code (e.g., `access_denied`, `invalid_request`, `server_error`) |
|
||||
| `error_description` | Human-readable error description explaining what went wrong |
|
||||
| `state` | The state parameter from the original request (for CSRF protection) |
|
||||
|
||||
### Step 5: Token exchange
|
||||
|
||||
The client exchanges the authorization code for tokens by making a POST request to the token endpoint:
|
||||
|
||||
```bash
|
||||
curl -X POST 'https://<project-ref>.supabase.co/auth/v1/oauth/token' \
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-d 'grant_type=authorization_code' \
|
||||
-d 'code=<authorization-code>' \
|
||||
-d 'client_id=<client-id>' \
|
||||
-d 'redirect_uri=<redirect-uri>' \
|
||||
-d 'code_verifier=<code-verifier>'
|
||||
```
|
||||
|
||||
For confidential clients (with client secret):
|
||||
|
||||
```bash
|
||||
curl -X POST 'https://<project-ref>.supabase.co/auth/v1/oauth/token' \
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-d 'grant_type=authorization_code' \
|
||||
-d 'code=<authorization-code>' \
|
||||
-d 'client_id=<client-id>' \
|
||||
-d 'client_secret=<client-secret>' \
|
||||
-d 'redirect_uri=<redirect-uri>' \
|
||||
-d 'code_verifier=<code-verifier>'
|
||||
```
|
||||
|
||||
#### Example in JavaScript
|
||||
|
||||
```javascript
|
||||
// Retrieve the code verifier from storage
|
||||
const codeVerifier = sessionStorage.getItem('code_verifier')
|
||||
|
||||
// Exchange code for tokens
|
||||
const response = await fetch(`https://<project-ref>.supabase.co/auth/v1/oauth/token`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: new URLSearchParams({
|
||||
grant_type: 'authorization_code',
|
||||
code: authorizationCode,
|
||||
client_id: '<client-id>',
|
||||
redirect_uri: '<redirect-uri>',
|
||||
code_verifier: codeVerifier,
|
||||
}),
|
||||
})
|
||||
|
||||
const tokens = await response.json()
|
||||
```
|
||||
|
||||
### Step 6: Token response
|
||||
|
||||
On success, Supabase Auth returns a JSON response with tokens:
|
||||
|
||||
```json
|
||||
{
|
||||
"access_token": "eyJhbGc...",
|
||||
"token_type": "bearer",
|
||||
"expires_in": 3600,
|
||||
"refresh_token": "MXff...",
|
||||
"scope": "openid email profile",
|
||||
"id_token": "eyJhbGc..."
|
||||
}
|
||||
```
|
||||
|
||||
| Field | Description |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------------- |
|
||||
| `access_token` | JWT access token for accessing resources |
|
||||
| `token_type` | Always `bearer` |
|
||||
| `expires_in` | Token lifetime in seconds (default: 3600) |
|
||||
| `refresh_token` | Token for obtaining new access tokens |
|
||||
| `scope` | Granted scopes from the authorization request |
|
||||
| `id_token` | OpenID Connect ID token (included only if `openid` scope was requested in the authorization request) |
|
||||
|
||||
## Access token structure
|
||||
|
||||
Access tokens are JWTs containing standard Supabase claims plus OAuth-specific claims:
|
||||
|
||||
```json
|
||||
{
|
||||
"aud": "authenticated",
|
||||
"exp": 1735819200,
|
||||
"iat": 1735815600,
|
||||
"iss": "https://<project-ref>.supabase.co/auth/v1",
|
||||
"sub": "user-uuid",
|
||||
"email": "user@example.com",
|
||||
"phone": "",
|
||||
"app_metadata": {
|
||||
"provider": "email",
|
||||
"providers": ["email"]
|
||||
},
|
||||
"user_metadata": {},
|
||||
"role": "authenticated",
|
||||
"aal": "aal1",
|
||||
"amr": [
|
||||
{
|
||||
"method": "password",
|
||||
"timestamp": 1735815600
|
||||
}
|
||||
],
|
||||
"session_id": "session-uuid",
|
||||
"client_id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d"
|
||||
}
|
||||
```
|
||||
|
||||
### OAuth-specific claims
|
||||
|
||||
| Claim | Description |
|
||||
| ----------- | -------------------------------------------- |
|
||||
| `client_id` | The OAuth client ID that obtained this token |
|
||||
|
||||
All other claims follow the standard [Supabase JWT structure](/docs/guides/auth/jwts).
|
||||
|
||||
### Available scopes
|
||||
|
||||
The following scopes are currently supported:
|
||||
|
||||
| Scope | Description |
|
||||
| --------- | ------------------------------------------------------------------------------------- |
|
||||
| `openid` | Enables OpenID Connect. When requested, an ID token will be included in the response. |
|
||||
| `email` | Grants access to email and email_verified claims |
|
||||
| `profile` | Grants access to profile information (name, picture, etc.) |
|
||||
| `phone` | Grants access to phone_number and phone_number_verified claims |
|
||||
|
||||
**Default scope:** When no scope is specified in the authorization request, the default scope is `email`.
|
||||
|
||||
Scopes affect what information is included in ID tokens and returned by the UserInfo endpoint. All OAuth access tokens have full access to user data (same as regular session tokens), with the addition of the `client_id` claim. Use Row Level Security policies with the `client_id` claim to control which data each OAuth client can access.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
**Custom scopes are not currently supported.** Only the standard scopes listed above are available. Support for custom scopes is planned for a future release, which will allow you to define application-specific permissions and fine-grained access control.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Refresh token flow
|
||||
|
||||
Refresh tokens allow clients to obtain new access tokens without requiring the user to re-authenticate.
|
||||
|
||||
### When to refresh
|
||||
|
||||
Clients should refresh access tokens when:
|
||||
|
||||
- The access token is expired (check the `exp` claim)
|
||||
- The access token is about to expire (proactive refresh)
|
||||
- An API call returns a 401 Unauthorized error
|
||||
|
||||
### Refresh request
|
||||
|
||||
Make a POST request to the token endpoint with the refresh token:
|
||||
|
||||
```bash
|
||||
curl -X POST 'https://<project-ref>.supabase.co/auth/v1/oauth/token' \
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-d 'grant_type=refresh_token' \
|
||||
-d 'refresh_token=<refresh-token>' \
|
||||
-d 'client_id=<client-id>'
|
||||
```
|
||||
|
||||
For confidential clients:
|
||||
|
||||
```bash
|
||||
curl -X POST 'https://<project-ref>.supabase.co/auth/v1/oauth/token' \
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-d 'grant_type=refresh_token' \
|
||||
-d 'refresh_token=<refresh-token>' \
|
||||
-d 'client_id=<client-id>' \
|
||||
-d 'client_secret=<client-secret>'
|
||||
```
|
||||
|
||||
#### Example in JavaScript
|
||||
|
||||
```javascript
|
||||
async function refreshAccessToken(refreshToken) {
|
||||
const response = await fetch(`https://<project-ref>.supabase.co/auth/v1/oauth/token`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: new URLSearchParams({
|
||||
grant_type: 'refresh_token',
|
||||
refresh_token: refreshToken,
|
||||
client_id: '<client-id>',
|
||||
}),
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to refresh token')
|
||||
}
|
||||
|
||||
return await response.json()
|
||||
}
|
||||
```
|
||||
|
||||
### Refresh response
|
||||
|
||||
The response contains a new access token and optionally a new refresh token:
|
||||
|
||||
```json
|
||||
{
|
||||
"access_token": "eyJhbGc...",
|
||||
"token_type": "bearer",
|
||||
"expires_in": 3600,
|
||||
"refresh_token": "v1.MXff...",
|
||||
"scope": "openid email profile"
|
||||
}
|
||||
```
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Refresh tokens may be rotated (a new refresh token is issued). Always update your stored refresh token when a new one is provided.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## OpenID Connect (OIDC)
|
||||
|
||||
Supabase Auth supports OpenID Connect, an identity layer on top of OAuth 2.1.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
**ID tokens are only included when the `openid` scope is requested.** To receive an ID token, include `openid` in the space-separated list of scopes in your authorization request. ID tokens are valid for 1 hour.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### ID tokens
|
||||
|
||||
ID tokens are JWTs that contain user identity information. They are signed by Supabase Auth and can be verified by clients.
|
||||
|
||||
The claims included in the ID token depend on the scopes requested during authorization. For example, requesting `openid email profile` will include email and profile-related claims, while requesting only `openid email` will include only email-related claims.
|
||||
|
||||
#### Example ID token
|
||||
|
||||
```json
|
||||
{
|
||||
"iss": "https://<project-ref>.supabase.co/auth/v1",
|
||||
"sub": "user-uuid",
|
||||
"aud": "client-id",
|
||||
"exp": 1735819200,
|
||||
"iat": 1735815600,
|
||||
"auth_time": 1735815600,
|
||||
"nonce": "random-nonce-from-request",
|
||||
"email": "user@example.com",
|
||||
"email_verified": true,
|
||||
"phone_number": "+1234567890",
|
||||
"phone_number_verified": false,
|
||||
"name": "John Doe",
|
||||
"picture": "https://example.com/avatar.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
#### Standard OIDC claims
|
||||
|
||||
| Claim | Description |
|
||||
| ----------------------- | ------------------------------------------------------------ |
|
||||
| `sub` | Subject (user ID) |
|
||||
| `nonce` | The nonce value from the authorization request (if provided) |
|
||||
| `email` | User's email address |
|
||||
| `email_verified` | Whether the email is verified |
|
||||
| `phone_number` | User's phone number |
|
||||
| `phone_number_verified` | Whether the phone is verified |
|
||||
| `name` | User's full name |
|
||||
| `picture` | User's profile picture URL |
|
||||
|
||||
### UserInfo endpoint
|
||||
|
||||
Clients can retrieve user information by calling the UserInfo endpoint with an access token:
|
||||
|
||||
```bash
|
||||
curl 'https://<project-ref>.supabase.co/auth/v1/oauth/userinfo' \
|
||||
-H 'Authorization: Bearer <access-token>'
|
||||
```
|
||||
|
||||
The information returned depends on the scopes granted in the access token. For example:
|
||||
|
||||
**With `email` scope:**
|
||||
|
||||
```json
|
||||
{
|
||||
"sub": "user-uuid",
|
||||
"email": "user@example.com",
|
||||
"email_verified": true
|
||||
}
|
||||
```
|
||||
|
||||
**With `email profile phone` scopes:**
|
||||
|
||||
```json
|
||||
{
|
||||
"sub": "user-uuid",
|
||||
"email": "user@example.com",
|
||||
"email_verified": true,
|
||||
"phone_number": "+1234567890",
|
||||
"phone_number_verified": false,
|
||||
"name": "John Doe",
|
||||
"picture": "https://example.com/avatar.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
### OIDC discovery
|
||||
|
||||
Supabase Auth exposes OpenID Connect and OAuth 2.1 discovery endpoints that describe its capabilities:
|
||||
|
||||
```
|
||||
https://<project-ref>.supabase.co/auth/v1/.well-known/openid-configuration
|
||||
https://<project-ref>.supabase.co/auth/v1/.well-known/oauth-authorization-server
|
||||
```
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Both endpoints return the same metadata and can be used interchangeably. They are provided for compatibility with different OAuth and OIDC clients that may expect one or the other.
|
||||
|
||||
</Admonition>
|
||||
|
||||
These endpoints return metadata about:
|
||||
|
||||
- Available endpoints (authorization, token, userinfo, JWKS)
|
||||
- Supported grant types and response types
|
||||
- Supported scopes and claims
|
||||
- Token signing algorithms
|
||||
|
||||
This enables automatic integration with OIDC-compliant libraries and tools.
|
||||
|
||||
## Token validation
|
||||
|
||||
Third-party clients should validate access tokens to ensure they're authentic and not tampered with.
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
**Recommended: Use asymmetric JWT signing keys**
|
||||
|
||||
For OAuth implementations, we strongly recommend using asymmetric signing algorithms (RS256 or ES256) instead of the default HS256. With asymmetric keys, third-party clients can validate JWTs using the public key from your JWKS endpoint without needing access to your JWT secret. This is more secure, scalable, and follows OAuth best practices.
|
||||
|
||||
Learn how to [configure asymmetric JWT signing keys](/docs/guides/auth/signing-keys) in your project.
|
||||
|
||||
</Admonition>
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
**ID tokens require asymmetric signing algorithms**
|
||||
|
||||
If you request the `openid` scope to receive ID tokens, your project must be configured to use asymmetric signing algorithms (RS256 or ES256). ID token generation will fail with an error if your project is still using the default HS256 symmetric algorithm. This is a security requirement of the OpenID Connect specification.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### JWKS endpoint
|
||||
|
||||
Supabase Auth exposes a JSON Web Key Set (JWKS) endpoint containing public keys for token verification:
|
||||
|
||||
```
|
||||
https://<project-ref>.supabase.co/auth/v1/.well-known/jwks.json
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"keys": [
|
||||
{
|
||||
"kty": "RSA",
|
||||
"kid": "key-id",
|
||||
"use": "sig",
|
||||
"alg": "RS256",
|
||||
"n": "...",
|
||||
"e": "AQAB"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Validating tokens
|
||||
|
||||
Use a JWT library to verify tokens:
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="node"
|
||||
queryGroup="language"
|
||||
>
|
||||
<TabPanel id="node" label="Node.js">
|
||||
|
||||
```javascript
|
||||
import { createRemoteJWKSet, jwtVerify } from 'jose'
|
||||
|
||||
const JWKS = createRemoteJWKSet(
|
||||
new URL('https://<project-ref>.supabase.co/auth/v1/.well-known/jwks.json')
|
||||
)
|
||||
|
||||
async function verifyAccessToken(token) {
|
||||
try {
|
||||
const { payload } = await jwtVerify(token, JWKS, {
|
||||
issuer: 'https://<project-ref>.supabase.co/auth/v1',
|
||||
audience: 'authenticated',
|
||||
})
|
||||
return payload
|
||||
} catch (error) {
|
||||
console.error('Token verification failed:', error)
|
||||
return null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="python" label="Python">
|
||||
|
||||
```python
|
||||
from jose import jwt
|
||||
from jose.backends import RSAKey
|
||||
import requests
|
||||
|
||||
# Fetch JWKS
|
||||
jwks = requests.get('https://<project-ref>.supabase.co/auth/v1/.well-known/jwks.json').json()
|
||||
|
||||
def verify_access_token(token):
|
||||
try:
|
||||
payload = jwt.decode(
|
||||
token,
|
||||
jwks,
|
||||
algorithms=['RS256'],
|
||||
issuer='https://<project-ref>.supabase.co/auth/v1',
|
||||
audience='authenticated'
|
||||
)
|
||||
return payload
|
||||
except jwt.JWTError as e:
|
||||
print(f'Token verification failed: {e}')
|
||||
return None
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="go" label="Go">
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/coreos/go-oidc/v3/oidc"
|
||||
)
|
||||
|
||||
func verifyAccessToken(ctx context.Context, token string) (*oidc.IDToken, error) {
|
||||
provider, err := oidc.NewProvider(
|
||||
ctx,
|
||||
"https://<project-ref>.supabase.co/auth/v1",
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
verifier := provider.Verifier(&oidc.Config{
|
||||
ClientID: "authenticated",
|
||||
})
|
||||
|
||||
return verifier.Verify(ctx, token)
|
||||
}
|
||||
```
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
### What to validate
|
||||
|
||||
Always verify:
|
||||
|
||||
1. **Signature** - Token is signed by Supabase Auth
|
||||
2. **Issuer** (`iss`) - Matches your project URL
|
||||
3. **Audience** (`aud`) - Is `authenticated`
|
||||
4. **Expiration** (`exp`) - Token is not expired
|
||||
5. **Client ID** (`client_id`) - Matches your client (if applicable)
|
||||
|
||||
## Managing user grants
|
||||
|
||||
Users can view and manage the OAuth applications they've authorized to access their account. This is important for transparency and security, allowing users to audit and revoke access when needed.
|
||||
|
||||
### Viewing authorized applications
|
||||
|
||||
Users can retrieve a list of all OAuth clients they've authorized:
|
||||
|
||||
```javascript
|
||||
const { data: grants, error } = await supabase.auth.oauth.getUserGrants()
|
||||
|
||||
if (error) {
|
||||
console.error('Error fetching grants:', error)
|
||||
} else {
|
||||
console.log('Authorized applications:', grants)
|
||||
}
|
||||
```
|
||||
|
||||
The response includes details about each authorized OAuth client:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": "grant-uuid",
|
||||
"client_id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
|
||||
"client_name": "My Third-Party App",
|
||||
"scopes": ["email", "profile"],
|
||||
"created_at": "2025-01-15T10:30:00.000Z",
|
||||
"updated_at": "2025-01-15T10:30:00.000Z"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Revoking access
|
||||
|
||||
Users can revoke access for a specific OAuth client at any time. When access is revoked, all active sessions and refresh tokens for that client are immediately invalidated:
|
||||
|
||||
```javascript
|
||||
const { error } = await supabase.auth.oauth.revokeGrant(clientId)
|
||||
|
||||
if (error) {
|
||||
console.error('Error revoking access:', error)
|
||||
} else {
|
||||
console.log('Access revoked successfully')
|
||||
}
|
||||
```
|
||||
|
||||
After revoking access:
|
||||
|
||||
- All refresh tokens for that client are deleted
|
||||
- The user will need to re-authorize the application to grant access again
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
**Build a settings page for your users**
|
||||
|
||||
It's a good practice to provide a settings page where users can view all authorized applications and revoke access to any they no longer trust or use. This increases transparency and gives users control over their data.
|
||||
|
||||
</Admonition>
|
||||
|
||||
For complete API reference, see the [OAuth methods in supabase-js](/docs/reference/javascript/auth-oauth).
|
||||
|
||||
## Next steps
|
||||
|
||||
- [Implement MCP authentication](/docs/guides/auth/oauth-server/mcp-authentication) - Enable AI agent authentication
|
||||
- [Secure with RLS](/docs/guides/auth/oauth-server/token-security) - Control data access for OAuth clients
|
||||
- [Learn about JWTs](/docs/guides/auth/jwts) - Understand Supabase token structure
|
||||
@@ -0,0 +1,446 @@
|
||||
---
|
||||
id: 'oauth-server-token-security'
|
||||
title: 'Token Security and Row Level Security'
|
||||
description: 'Secure your data with Row Level Security policies for OAuth clients'
|
||||
---
|
||||
|
||||
When you enable OAuth 2.1 in your Supabase project, third-party applications can access user data on their behalf. Row Level Security (RLS) policies are crucial for controlling exactly what data each OAuth client can access.
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
**Scopes control OIDC data, not database access**
|
||||
|
||||
The OAuth scopes (`openid`, `email`, `profile`, `phone`) control what user information is included in ID tokens and returned by the UserInfo endpoint. They do **not** control access to your database tables or API endpoints.
|
||||
|
||||
Use RLS to define which OAuth clients can access which data, regardless of the scopes they requested.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## How OAuth tokens work with RLS
|
||||
|
||||
OAuth access tokens issued by Supabase Auth are JWTs that include all standard Supabase claims plus OAuth-specific claims. This means your existing RLS policies continue to work, and you can add OAuth-specific logic to create granular access controls.
|
||||
|
||||
### Token structure
|
||||
|
||||
Every OAuth access token includes:
|
||||
|
||||
```json
|
||||
{
|
||||
"sub": "user-uuid",
|
||||
"role": "authenticated",
|
||||
"aud": "authenticated",
|
||||
"user_id": "user-uuid",
|
||||
"email": "user@example.com",
|
||||
"client_id": "9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
|
||||
"aal": "aal1",
|
||||
"amr": [{ "method": "password", "timestamp": 1735815600 }],
|
||||
"session_id": "session-uuid",
|
||||
"iss": "https://<project-ref>.supabase.co/auth/v1",
|
||||
"iat": 1735815600,
|
||||
"exp": 1735819200
|
||||
}
|
||||
```
|
||||
|
||||
The key OAuth-specific claim is:
|
||||
|
||||
| Claim | Description |
|
||||
| ----------- | -------------------------------------------------------------- |
|
||||
| `client_id` | Unique identifier of the OAuth client that obtained this token |
|
||||
|
||||
You can use this claim in RLS policies to grant different permissions to different clients.
|
||||
|
||||
## Extracting OAuth claims in RLS
|
||||
|
||||
Use the `auth.jwt()` function to access token claims in your policies:
|
||||
|
||||
```sql
|
||||
-- Get the client ID from the token
|
||||
(auth.jwt() ->> 'client_id')
|
||||
|
||||
-- Check if the token is from an OAuth client
|
||||
(auth.jwt() ->> 'client_id') IS NOT NULL
|
||||
|
||||
-- Check if the token is from a specific client
|
||||
(auth.jwt() ->> 'client_id') = 'mobile-app-client-id'
|
||||
```
|
||||
|
||||
## Common RLS patterns for OAuth
|
||||
|
||||
### Pattern 1: Grant specific client full access
|
||||
|
||||
Allow a specific OAuth client to access all user data:
|
||||
|
||||
```sql
|
||||
CREATE POLICY "Mobile app can access user data"
|
||||
ON user_data FOR ALL
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') = 'mobile-app-client-id'
|
||||
);
|
||||
```
|
||||
|
||||
### Pattern 2: Grant multiple clients read-only access
|
||||
|
||||
Allow several OAuth clients to read data, but not modify it:
|
||||
|
||||
```sql
|
||||
CREATE POLICY "Third-party apps can read profiles"
|
||||
ON profiles FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') IN (
|
||||
'analytics-client-id',
|
||||
'reporting-client-id',
|
||||
'dashboard-client-id'
|
||||
)
|
||||
);
|
||||
```
|
||||
|
||||
### Pattern 3: Restrict sensitive data from OAuth clients
|
||||
|
||||
Prevent OAuth clients from accessing sensitive data:
|
||||
|
||||
```sql
|
||||
CREATE POLICY "OAuth clients cannot access payment info"
|
||||
ON payment_methods FOR ALL
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') IS NULL -- Only direct user sessions
|
||||
);
|
||||
```
|
||||
|
||||
### Pattern 4: Client-specific data access
|
||||
|
||||
Different clients access different subsets of data:
|
||||
|
||||
```sql
|
||||
-- Analytics client can only read aggregated data
|
||||
CREATE POLICY "Analytics client reads summaries"
|
||||
ON user_metrics FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') = 'analytics-client-id'
|
||||
);
|
||||
|
||||
-- Admin client can read and modify all data
|
||||
CREATE POLICY "Admin client full access"
|
||||
ON user_data FOR ALL
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') = 'admin-client-id'
|
||||
);
|
||||
```
|
||||
|
||||
## Real-world examples
|
||||
|
||||
### Example 1: Multi-platform application
|
||||
|
||||
You have a web app, mobile app, and third-party integrations:
|
||||
|
||||
```sql
|
||||
-- Web app: Full access
|
||||
CREATE POLICY "Web app full access"
|
||||
ON profiles FOR ALL
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(
|
||||
(auth.jwt() ->> 'client_id') = 'web-app-client-id'
|
||||
OR (auth.jwt() ->> 'client_id') IS NULL -- Direct user sessions
|
||||
)
|
||||
);
|
||||
|
||||
-- Mobile app: Read-only access to profiles
|
||||
CREATE POLICY "Mobile app reads profiles"
|
||||
ON profiles FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') = 'mobile-app-client-id'
|
||||
);
|
||||
|
||||
-- Third-party integration: Limited data access
|
||||
CREATE POLICY "Integration reads public data"
|
||||
ON profiles FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') = 'integration-client-id' AND
|
||||
is_public = true
|
||||
);
|
||||
```
|
||||
|
||||
## Custom access token hooks
|
||||
|
||||
[Custom Access Token Hooks](/docs/guides/auth/auth-hooks/custom-access-token-hook) work with OAuth tokens, allowing you to inject custom claims based on the OAuth client. This is particularly useful for customizing standard JWT claims like `audience` (`aud`) or adding client-specific metadata.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Custom Access Token Hooks are triggered for **all** token issuance. Use `client_id` or `authentication_method` (`oauth_provider/authorization_code` for OAuth flows) to differentiate OAuth from regular authentication.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Customizing the audience claim
|
||||
|
||||
A common use case is customizing the `audience` claim for different OAuth clients. This allows third-party services to validate that tokens were issued specifically for them:
|
||||
|
||||
```typescript
|
||||
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
|
||||
|
||||
serve(async (req) => {
|
||||
const { user, claims, client_id } = await req.json()
|
||||
|
||||
// Customize audience based on OAuth client
|
||||
if (client_id === 'mobile-app-client-id') {
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
claims: {
|
||||
aud: 'https://api.myapp.com',
|
||||
app_version: '2.0.0',
|
||||
},
|
||||
}),
|
||||
{ headers: { 'Content-Type': 'application/json' } }
|
||||
)
|
||||
}
|
||||
|
||||
if (client_id === 'analytics-partner-id') {
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
claims: {
|
||||
aud: 'https://analytics.partner.com',
|
||||
access_level: 'read-only',
|
||||
},
|
||||
}),
|
||||
{ headers: { 'Content-Type': 'application/json' } }
|
||||
)
|
||||
}
|
||||
|
||||
// Default audience for non-OAuth flows
|
||||
return new Response(JSON.stringify({ claims: {} }), {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
The `audience` claim is especially important for:
|
||||
|
||||
- **JWT validation by third parties**: Services can verify tokens were issued for their specific API
|
||||
- **Multi-tenant applications**: Different audiences for different client applications
|
||||
- **Compliance**: Meeting security requirements that mandate audience validation
|
||||
|
||||
### Adding client-specific claims
|
||||
|
||||
You can also add custom claims and metadata based on the OAuth client:
|
||||
|
||||
```typescript
|
||||
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
|
||||
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
|
||||
|
||||
serve(async (req) => {
|
||||
const { user, claims, client_id } = await req.json()
|
||||
|
||||
const supabase = createClient(Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_SECRET_KEY')!)
|
||||
|
||||
// Add custom claims based on OAuth client
|
||||
let customClaims = {}
|
||||
|
||||
if (client_id === 'mobile-app-client-id') {
|
||||
customClaims.aud = 'https://mobile.myapp.com'
|
||||
customClaims.app_version = '2.0.0'
|
||||
customClaims.platform = 'mobile'
|
||||
} else if (client_id === 'analytics-client-id') {
|
||||
customClaims.aud = 'https://analytics.myapp.com'
|
||||
customClaims.read_only = true
|
||||
customClaims.data_retention_days = 90
|
||||
} else if (client_id?.startsWith('mcp-')) {
|
||||
// MCP AI agents
|
||||
const { data: agent } = await supabase
|
||||
.from('approved_ai_agents')
|
||||
.select('name, max_data_retention_days')
|
||||
.eq('client_id', client_id)
|
||||
.single()
|
||||
|
||||
customClaims.aud = `https://mcp.myapp.com/${client_id}`
|
||||
customClaims.ai_agent = true
|
||||
customClaims.agent_name = agent?.name
|
||||
customClaims.max_retention = agent?.max_data_retention_days
|
||||
}
|
||||
|
||||
return new Response(JSON.stringify({ claims: customClaims }), {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
Use these custom claims in RLS:
|
||||
|
||||
```sql
|
||||
-- Policy based on custom claims
|
||||
CREATE POLICY "Read-only clients cannot modify"
|
||||
ON user_data FOR UPDATE
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() -> 'user_metadata' ->> 'read_only')::boolean IS NOT TRUE
|
||||
);
|
||||
|
||||
-- Policy based on audience claim
|
||||
CREATE POLICY "Only specific audience can access"
|
||||
ON api_data FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'aud') IN (
|
||||
'https://api.myapp.com',
|
||||
'https://mobile.myapp.com'
|
||||
)
|
||||
);
|
||||
```
|
||||
|
||||
## Security best practices
|
||||
|
||||
### 1. Principle of least privilege
|
||||
|
||||
Grant OAuth clients only the minimum permissions they need:
|
||||
|
||||
```sql
|
||||
-- Bad: Grant all access by default
|
||||
CREATE POLICY "OAuth clients full access"
|
||||
ON user_data FOR ALL
|
||||
USING (auth.uid() = user_id);
|
||||
|
||||
-- Good: Grant specific access per client
|
||||
CREATE POLICY "Specific client specific access"
|
||||
ON user_data FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') = 'trusted-client-id'
|
||||
);
|
||||
```
|
||||
|
||||
### 2. Separate policies for OAuth clients
|
||||
|
||||
Create dedicated policies for OAuth clients rather than mixing them with user policies:
|
||||
|
||||
```sql
|
||||
-- User access
|
||||
CREATE POLICY "Users access their own data"
|
||||
ON user_data FOR ALL
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') IS NULL
|
||||
);
|
||||
|
||||
-- OAuth client access (separate policy)
|
||||
CREATE POLICY "OAuth clients limited access"
|
||||
ON user_data FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') IN ('client-1', 'client-2')
|
||||
);
|
||||
```
|
||||
|
||||
### 3. Regularly audit OAuth clients
|
||||
|
||||
Track and review which clients have access:
|
||||
|
||||
```sql
|
||||
-- View all active OAuth clients
|
||||
SELECT
|
||||
oc.client_id,
|
||||
oc.name,
|
||||
oc.created_at,
|
||||
COUNT(DISTINCT s.user_id) as active_users
|
||||
FROM auth.oauth_clients oc
|
||||
LEFT JOIN auth.sessions s ON s.client_id = oc.client_id
|
||||
WHERE s.created_at > NOW() - INTERVAL '30 days'
|
||||
GROUP BY oc.client_id, oc.name, oc.created_at;
|
||||
```
|
||||
|
||||
## Testing your policies
|
||||
|
||||
Always test your RLS policies before deploying to production:
|
||||
|
||||
```sql
|
||||
-- Test as a specific OAuth client
|
||||
SET request.jwt.claims = '{
|
||||
"sub": "test-user-uuid",
|
||||
"role": "authenticated",
|
||||
"client_id": "test-client-id"
|
||||
}';
|
||||
|
||||
-- Test queries
|
||||
SELECT * FROM user_data WHERE user_id = 'test-user-uuid';
|
||||
|
||||
-- Reset
|
||||
RESET request.jwt.claims;
|
||||
```
|
||||
|
||||
Or use the Supabase Dashboard's [RLS policy tester](/dashboard/project/_/auth/policies).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Policy not working for OAuth client
|
||||
|
||||
**Problem**: OAuth client can't access data despite having a valid token.
|
||||
|
||||
**Check**:
|
||||
|
||||
1. Verify the policy includes the client's `client_id`
|
||||
2. Ensure RLS is enabled on the table
|
||||
3. Check for conflicting restrictive policies
|
||||
4. Test with service role key to isolate RLS issues
|
||||
|
||||
```sql
|
||||
-- Debug: See what client_id is in the token
|
||||
SELECT auth.jwt() ->> 'client_id';
|
||||
|
||||
-- Debug: Test without RLS
|
||||
SET LOCAL role = service_role;
|
||||
SELECT * FROM your_table;
|
||||
```
|
||||
|
||||
### Policy too permissive
|
||||
|
||||
**Problem**: OAuth client has access to data it shouldn't.
|
||||
|
||||
**Solution**: Use `AS RESTRICTIVE` policies to add additional constraints:
|
||||
|
||||
```sql
|
||||
-- This policy runs in addition to permissive policies
|
||||
CREATE POLICY "Restrict OAuth clients"
|
||||
ON sensitive_data
|
||||
AS RESTRICTIVE
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (
|
||||
-- OAuth clients cannot access this table at all
|
||||
(auth.jwt() ->> 'client_id') IS NULL
|
||||
);
|
||||
```
|
||||
|
||||
### Can't differentiate between users and OAuth clients
|
||||
|
||||
**Problem**: Need to apply different logic for direct user sessions vs OAuth.
|
||||
|
||||
**Solution**: Check if `client_id` is present:
|
||||
|
||||
```sql
|
||||
-- Direct user sessions (no OAuth)
|
||||
CREATE POLICY "Direct users full access"
|
||||
ON user_data FOR ALL
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') IS NULL
|
||||
);
|
||||
|
||||
-- OAuth clients (limited access)
|
||||
CREATE POLICY "OAuth clients read only"
|
||||
ON user_data FOR SELECT
|
||||
USING (
|
||||
auth.uid() = user_id AND
|
||||
(auth.jwt() ->> 'client_id') IS NOT NULL
|
||||
);
|
||||
```
|
||||
|
||||
## Next steps
|
||||
|
||||
- [Learn about JWTs](/docs/guides/auth/jwts) - Deep dive into Supabase token structure
|
||||
- [Row Level Security](/docs/guides/auth/row-level-security) - Complete RLS guide
|
||||
- [Custom Access Token Hooks](/docs/guides/auth/auth-hooks/custom-access-token-hook) - Inject custom claims
|
||||
- [OAuth flows](/docs/guides/auth/oauth-server/oauth-flows) - Understand token issuance
|
||||
@@ -9,6 +9,14 @@ subtitle: 'Set up redirect urls with Supabase Auth.'
|
||||
|
||||
Supabase Auth allows you to control how the [user sessions](/docs/guides/auth/sessions) are handled by your application.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
**Looking for OAuth client redirect URIs?**
|
||||
|
||||
This guide covers redirect URLs for users signing **into** your application (using social providers like Google, GitHub, etc.). If you're setting up your Supabase project as an **OAuth 2.1 provider** for third-party applications, see the [OAuth Server Redirect URI configuration](/docs/guides/auth/oauth-server/getting-started#redirect-uri-configuration) instead.
|
||||
|
||||
</Admonition>
|
||||
|
||||
When using [passwordless sign-ins](/docs/reference/javascript/auth-signinwithotp) or [third-party providers](/docs/reference/javascript/auth-signinwithoauth#sign-in-using-a-third-party-provider-with-redirect), the Supabase client library provides a `redirectTo` parameter to specify where to redirect the user after authentication. The URL in `redirectTo` should match the [Redirect URLs](/dashboard/project/_/auth/url-configuration) list configuration.
|
||||
|
||||
To configure allowed redirect URLs, go to the [URL Configuration](/dashboard/project/_/auth/url-configuration) page. Once you've added necessary URLs, you can use the URL you want the user to be redirected to in the `redirectTo` parameter.
|
||||
|
||||
@@ -10,35 +10,35 @@ To enable Figma Auth for your project, you need to set up a Figma OAuth applicat
|
||||
|
||||
Setting up Figma logins for your application consists of 3 parts:
|
||||
|
||||
- Create and configure a Figma App on the [Figma Developers page](https://www.figma.com/developers).
|
||||
- Create and configure a Figma App on the [Figma Developers page](https://www.figma.com/developers/app).
|
||||
- Add your Figma `client_id` and `client_secret` to your [Supabase Project](https://app.supabase.com).
|
||||
- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js).
|
||||
|
||||
## Access the Figma Developers page
|
||||
|
||||
- Go to the [Figma Developers page](https://www.figma.com/developers)
|
||||
- Click on `My apps` at the top right
|
||||
- Go to the [Figma Developers page](https://www.figma.com/developers/app)
|
||||
- Log in (if necessary)
|
||||
|
||||

|
||||
|
||||
## Find your callback URL
|
||||
|
||||
<$Partial path="social_provider_setup.mdx" variables={{ "provider": "Figma" }} />
|
||||
|
||||
## Create a Figma OAuth app
|
||||
|
||||
- Enter your `App name`, `Website URL` and upload your app logo
|
||||
- Click on `Add callback`
|
||||
- Add your `Callback URL`
|
||||
- Click on `Save`
|
||||
1. Enter your `App name`, select the owner for the app and click `Create app` button
|
||||
|
||||

|
||||

|
||||
|
||||
- Copy and save your newly-generated `Client ID`
|
||||
- Copy and save your newly-generated `Client Secret`
|
||||
2. Copy and save your newly-generated `Client ID`
|
||||
3. Copy and save your newly-generated `Client Secret`
|
||||
4. Then, go to `OAuth credentials` and click on `Add a redirect URL` button
|
||||
|
||||

|
||||

|
||||
|
||||
5. Add your URL from the previous step (callback URL on Supabase) and click on `Add` button
|
||||
6. Go to `OAuth scopes` and select `current_user:read` under `Users`.
|
||||
|
||||

|
||||
|
||||
## Enter your Figma credentials into your Supabase project
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
id: 'replication'
|
||||
title: 'Database Replication'
|
||||
description: 'Replicate your database to external destinations using replication powered by Supabase ETL or manual replication.'
|
||||
description: 'Replicate your database to external destinations using Supabase replication or manual replication.'
|
||||
subtitle: 'An introduction to database replication and change data capture.'
|
||||
sidebar_label: 'Overview'
|
||||
---
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
id: 'replication-faq'
|
||||
title: 'Replication FAQ'
|
||||
id: 'manual-replication-faq'
|
||||
title: 'Manual Replication FAQ'
|
||||
description: 'Frequently asked questions about manual database replication.'
|
||||
subtitle: 'Common questions and considerations when setting up manual replication.'
|
||||
sidebar_label: 'FAQ'
|
||||
@@ -30,13 +30,15 @@ You can view [publications](/dashboard/project/default/database/publications) in
|
||||
|
||||
## How to configure database settings for replication?
|
||||
|
||||
Yes. Using the Supabase CLI, you can [configure database settings](/docs/guides/database/custom-postgres-config#cli-configurable-settings) to optimize them for your replication needs. These values can vary depending on the activity of your database size and activity.
|
||||
Using the Supabase CLI, you can [configure database settings](/docs/guides/database/custom-postgres-config#cli-configurable-settings) to optimize them for your replication needs. These values can vary depending on your database size and activity.
|
||||
|
||||
## What are some important configuration options?
|
||||
|
||||
Some of the more important options to be aware of are:
|
||||
|
||||
- `max_wal_size`
|
||||
- `max_slot_wal_keep_size`
|
||||
- `wal_keep_size`
|
||||
- `max_wal_senders`
|
||||
- `max_wal_size` - Maximum size the WAL can grow between automatic WAL checkpoints
|
||||
- `max_slot_wal_keep_size` - Maximum size of WAL files that replication slots are allowed to retain
|
||||
- `wal_keep_size` - Minimum number of past WAL files to keep for standby servers
|
||||
- `max_wal_senders` - Maximum number of concurrent connections from standby servers or streaming backup clients
|
||||
|
||||
These settings help ensure your replication slots don't run out of space and that replicas can reconnect without requiring a full re-sync.
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
id: 'monitoring-replication'
|
||||
title: 'Monitoring Replication'
|
||||
id: 'manual-replication-monitoring'
|
||||
title: 'Manual Replication Monitoring'
|
||||
description: 'Monitor replication lag and status for manual replication setups.'
|
||||
subtitle: 'Track replication health and performance.'
|
||||
sidebar_label: 'Monitoring'
|
||||
@@ -16,7 +16,7 @@ Monitoring replication lag is important and there are 3 ways to do this:
|
||||
3. [Metrics](/docs/guides/telemetry/metrics) - Using the prometheus endpoint for your project
|
||||
- replication_slots_max_lag_bytes - this is the more important one
|
||||
- pg_stat_replication_replay_lag - lag to replay WAL files from the source DB on the target DB (throttled by disk or high activity)
|
||||
- pg_stat_replication_send_lag - lag in sending WAL files from the source DB (a high lag means that the publisher is not being asked to send new WAL files OR a network issues)
|
||||
- pg_stat_replication_send_lag - lag in sending WAL files from the source DB (a high lag means that the publisher is not being asked to send new WAL files OR network issues)
|
||||
|
||||
### Primary
|
||||
|
||||
@@ -51,7 +51,7 @@ The WAL size can be checked using the `pg_ls_waldir()` function:
|
||||
select * from pg_ls_waldir();
|
||||
```
|
||||
|
||||
#### Check LSN
|
||||
#### Check the LSN
|
||||
|
||||
```sql
|
||||
select pg_current_wal_lsn();
|
||||
@@ -91,7 +91,7 @@ ORDER BY
|
||||
table_name;
|
||||
```
|
||||
|
||||
#### Check LSN
|
||||
#### Check the LSN
|
||||
|
||||
```sql
|
||||
select pg_last_wal_replay_lsn();
|
||||
|
||||
@@ -6,7 +6,7 @@ subtitle: 'Set up replication with Airbyte, Estuary, Fivetran, and other tools.'
|
||||
sidebar_label: 'Setting up'
|
||||
---
|
||||
|
||||
This guide covers setting up **manual replication** using external tools. If you prefer a simpler, managed solution, see [replication](/docs/guides/database/replication/replication-setup) instead.
|
||||
This guide covers setting up **manual replication** using external tools. If you prefer a simpler, managed solution, see [Replication](/docs/guides/database/replication/replication-setup) instead.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
@@ -21,7 +21,7 @@ To set up replication, the following is recommended:
|
||||
- Instance size of XL or greater
|
||||
- [IPv4 add-on](/docs/guides/platform/ipv4-address) enabled
|
||||
|
||||
To create a replication slot, you will need to use the `postgres` user and follow the instructions in our [guide](/docs/guides/database/postgres/setup-replication-external).
|
||||
To create a replication slot, you will need to use the `postgres` user and follow the instructions in the [external replication setup guide](/docs/guides/database/postgres/setup-replication-external).
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
@@ -29,7 +29,7 @@ If you are running Postgres 17 or higher, you can create a new user and grant th
|
||||
|
||||
</Admonition>
|
||||
|
||||
If you are replicating to an external system and using any of the tools below, check their documentation first and we have added additional information where the setup with Supabase can vary.
|
||||
If you are replicating to an external system and using any of the tools below, check their documentation first. Additional information is provided where the setup with Supabase can vary.
|
||||
|
||||
<Tabs
|
||||
scrollable
|
||||
@@ -67,7 +67,7 @@ You can follow those steps with the following modifications:
|
||||
|
||||
1. In Step 2, choose `logical replication` as the sync mechanism
|
||||
2. In Step 3, do not create a user and use the existing `postgres` user for replication
|
||||
3. In Step 5, no need to modify any WAL settings as we have done that for you
|
||||
3. In Step 5, no need to modify any WAL settings as this has been configured
|
||||
|
||||
</TabPanel>
|
||||
|
||||
@@ -77,7 +77,7 @@ Materialize has the following [documentation](https://materialize.com/docs/sql/c
|
||||
|
||||
You can follow those steps with the following modifications:
|
||||
|
||||
1. Follow the steps in our [guide](/docs/guides/database/postgres/setup-replication-external) to create a publication slot
|
||||
1. Follow the steps in the [external replication setup guide](/docs/guides/database/postgres/setup-replication-external) to create a publication slot
|
||||
|
||||
</TabPanel>
|
||||
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
---
|
||||
id: 'replication-bigquery'
|
||||
title: 'Replicate to BigQuery'
|
||||
description: 'Replicate your Supabase database to Google BigQuery using replication.'
|
||||
subtitle: 'Stream data changes to BigQuery in real-time.'
|
||||
sidebar_label: 'BigQuery'
|
||||
---
|
||||
|
||||
<Admonition type="caution" label="Private Alpha">
|
||||
|
||||
Replication is currently in private alpha. Access is limited and features may change.
|
||||
|
||||
</Admonition>
|
||||
|
||||
BigQuery is Google's fully managed data warehouse. Replication powered by [Supabase ETL](https://github.com/supabase/etl) allows you to automatically sync your Supabase database tables to BigQuery for analytics and reporting.
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
This page covers BigQuery-specific configuration. For complete setup instructions including publications, general settings, and pipeline management, see the [Replication Setup guide](/docs/guides/database/replication/replication-setup).
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Setup
|
||||
|
||||
Setting up BigQuery replication requires preparing your GCP resources, then configuring BigQuery as a destination.
|
||||
|
||||
#### Step 1: Prepare GCP resources
|
||||
|
||||
Before configuring BigQuery as a destination, set up the following in Google Cloud Platform:
|
||||
|
||||
1. **Google Cloud Platform (GCP) account**: [Sign up for GCP](https://cloud.google.com/gcp) if you don't have one
|
||||
2. **BigQuery dataset**: Create a [BigQuery dataset](https://cloud.google.com/bigquery/docs/datasets-intro) in your GCP project
|
||||
3. **GCP service account key**: Create a [service account](https://cloud.google.com/iam/docs/keys-create-delete) with the **BigQuery Data Editor** role and download the JSON key file
|
||||
|
||||
#### Step 2: Add BigQuery as a destination
|
||||
|
||||
After preparing your GCP resources, configure BigQuery as a destination:
|
||||
|
||||
1. Navigate to [Database](/dashboard/project/_/database/replication) → **Replication** in your Supabase Dashboard
|
||||
2. Click **Add destination**
|
||||
3. Configure the destination:
|
||||
|
||||
<Image
|
||||
alt="BigQuery Configuration Settings"
|
||||
src="/docs/img/database/replication/replication-bigquery-details.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
- **Destination type**: Select **BigQuery**
|
||||
- **Project ID**: Your BigQuery project identifier (found in the GCP Console)
|
||||
- **Dataset ID**: The name of your BigQuery dataset (without the project ID)
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
In the GCP Console, the dataset is shown as `project-id.dataset-id`. Enter only the part after the dot. For example, if you see `my-project.my_dataset`, enter `my_dataset`.
|
||||
|
||||
</Admonition>
|
||||
|
||||
- **Service Account Key**: Your GCP service account key in JSON format. The service account must have the following permissions:
|
||||
- `bigquery.datasets.get`
|
||||
- `bigquery.tables.create`
|
||||
- `bigquery.tables.get`
|
||||
- `bigquery.tables.getData`
|
||||
- `bigquery.tables.update`
|
||||
- `bigquery.tables.updateData`
|
||||
|
||||
4. Complete the remaining configuration following the [Replication Setup guide](/docs/guides/database/replication/replication-setup)
|
||||
|
||||
### How it works
|
||||
|
||||
Once configured, replication to BigQuery:
|
||||
|
||||
1. Captures changes from your Postgres database (INSERT, UPDATE, DELETE operations)
|
||||
2. Batches changes for optimal performance
|
||||
3. Creates BigQuery tables automatically to match your Postgres schema
|
||||
4. Streams data to BigQuery with CDC metadata
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Due to ingestion latency in BigQuery's streaming API, there may be a delay (typically seconds to minutes) in data appearing. This is normal and expected for BigQuery's architecture.
|
||||
|
||||
</Admonition>
|
||||
|
||||
#### BigQuery CDC format
|
||||
|
||||
BigQuery tables include additional columns for change tracking:
|
||||
|
||||
- `_change_type`: The type of change (`INSERT`, `UPDATE`, `DELETE`)
|
||||
- `_commit_timestamp`: When the change was committed in Postgres
|
||||
- `_stream_id`: Internal identifier for the replication stream
|
||||
|
||||
### Querying replicated data
|
||||
|
||||
Once replication is running, you can query your data in BigQuery:
|
||||
|
||||
```sql
|
||||
-- Query the replicated table
|
||||
SELECT * FROM `your-project.your_dataset.users`
|
||||
WHERE created_at > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY);
|
||||
|
||||
-- View CDC changes
|
||||
SELECT
|
||||
_change_type,
|
||||
_commit_timestamp,
|
||||
id,
|
||||
name,
|
||||
email
|
||||
FROM `your-project.your_dataset.users`
|
||||
ORDER BY _commit_timestamp DESC
|
||||
LIMIT 100;
|
||||
```
|
||||
|
||||
### Limitations
|
||||
|
||||
BigQuery-specific limitations:
|
||||
|
||||
- **Ingestion latency**: BigQuery's streaming API has inherent latency (typically seconds to minutes)
|
||||
- **Row size**: Limited to 10 MB per row due to BigQuery Storage Write API constraints
|
||||
|
||||
For general replication limitations that apply to all destinations, see the [Replication Setup guide](/docs/guides/database/replication/replication-setup#limitations).
|
||||
|
||||
### Next steps
|
||||
|
||||
- [Set up replication](/docs/guides/database/replication/replication-setup)
|
||||
- [Monitor replication](/docs/guides/database/replication/replication-monitoring)
|
||||
- [View replication FAQ](/docs/guides/database/replication/replication-faq)
|
||||
@@ -1,33 +0,0 @@
|
||||
---
|
||||
id: 'replication-destinations'
|
||||
title: 'Replication Destinations'
|
||||
description: 'Choose where to replicate your database with Replication.'
|
||||
subtitle: 'Available destinations for Replication.'
|
||||
sidebar_label: 'Destinations'
|
||||
---
|
||||
|
||||
<Admonition type="caution" label="Private Alpha">
|
||||
|
||||
Replication is currently in private alpha. Access is limited and features may change.
|
||||
|
||||
</Admonition>
|
||||
|
||||
Replication powered by [Supabase ETL](https://github.com/supabase/etl) supports multiple destination types for syncing your database. Choose the destination that best fits your analytics and integration needs.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Some destinations may not be available for all users. Additional destinations are planned for the future, but we don't have public timelines to share at this time.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Available destinations
|
||||
|
||||
| Destination | Description | Configuration |
|
||||
| ------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------ |
|
||||
| **BigQuery** | Google's fully managed data warehouse | [Configure BigQuery →](/docs/guides/database/replication/replication-bigquery) |
|
||||
| **Iceberg (Analytics Buckets)** | Apache Iceberg tables in S3-compatible storage | [Configure Iceberg →](/docs/guides/database/replication/replication-iceberg) |
|
||||
|
||||
### Next steps
|
||||
|
||||
- [Set up replication](/docs/guides/database/replication/replication-setup)
|
||||
- [Monitor replication](/docs/guides/database/replication/replication-monitoring)
|
||||
@@ -14,22 +14,23 @@ Replication is currently in private alpha. Access is limited and features may ch
|
||||
|
||||
## What destinations are supported?
|
||||
|
||||
Replication currently supports Iceberg (Analytics Buckets). See the [Destinations guide](/docs/guides/database/replication/replication-destinations) for details.
|
||||
Replication currently supports Analytics Buckets (Iceberg format) and BigQuery. See the destination tabs in the [Setup guide](/docs/guides/database/replication/replication-setup#step-3-add-a-destination) for configuration details.
|
||||
|
||||
Availability varies based on the planned roll-out strategy. The destinations you can access depend on your project and access level.
|
||||
|
||||
## Why is a table not being replicated?
|
||||
|
||||
Common reasons:
|
||||
|
||||
- **Missing primary key**: Tables must have a primary key to be replicated
|
||||
- **Not in publication**: Ensure the table is included in your publication
|
||||
- **Missing primary key**: Tables must have a primary key to be replicated (Postgres logical replication requirement)
|
||||
- **Not in publication**: Ensure the table is included in your Postgres publication
|
||||
- **Unsupported data types**: Tables with custom data types are not supported
|
||||
- **Partitioned tables**: Not currently supported
|
||||
|
||||
Check your publication settings and verify your table meets the requirements.
|
||||
|
||||
## Why aren't publication changes reflected after adding or removing tables?
|
||||
|
||||
After modifying your publication, you must restart the pipeline for changes to take effect. See [Adding or removing tables](/docs/guides/database/replication/replication-setup#adding-or-removing-tables) for instructions.
|
||||
After modifying your Postgres publication, you must restart the replication pipeline for changes to take effect. See [Adding or removing tables](/docs/guides/database/replication/replication-setup#adding-or-removing-tables) for instructions.
|
||||
|
||||
## Why is a pipeline in failed state?
|
||||
|
||||
@@ -48,7 +49,7 @@ Table errors occur during the copy phase. To recover, click **View status**, fin
|
||||
|
||||
## How to verify replication is working
|
||||
|
||||
Check the [Database](/dashboard/project/_/database/replication) → **Replication** page:
|
||||
Check the [Database](/dashboard/project/_/database/replication) → **replication** page:
|
||||
|
||||
1. Verify your pipeline shows **Running** status
|
||||
2. Click **View status** to check table states
|
||||
@@ -57,35 +58,49 @@ Check the [Database](/dashboard/project/_/database/replication) → **Replicatio
|
||||
|
||||
See the [Replication Monitoring guide](/docs/guides/database/replication/replication-monitoring) for comprehensive monitoring instructions.
|
||||
|
||||
## What are the main limitations?
|
||||
|
||||
Key limitations to be aware of:
|
||||
|
||||
- **Primary keys**: Required on all tables
|
||||
- **Custom data types**: Not supported
|
||||
- **Schema changes**: Not automatically handled
|
||||
|
||||
Destination-specific limitations may also apply. See the [Iceberg](/docs/guides/database/replication/replication-iceberg#limitations) destination page for details.
|
||||
|
||||
## How to stop or pause replication
|
||||
|
||||
You can manage your pipeline using the actions menu in the destinations list. See [Managing your pipeline](/docs/guides/database/replication/replication-setup#managing-your-pipeline) for details on available actions.
|
||||
|
||||
Note: Stopping replication will cause changes to queue up in the WAL.
|
||||
|
||||
## What happens if a table is deleted at the destination?
|
||||
|
||||
If a table is deleted downstream at the destination (e.g., in your Analytics Bucket or BigQuery dataset), the replication pipeline will automatically recreate it.
|
||||
|
||||
This behavior is by design to prevent the pipeline from breaking if tables are accidentally deleted. The pipeline ensures that all tables in your publication are always present at the destination.
|
||||
|
||||
**To permanently remove a table from your destination:**
|
||||
|
||||
You have two options:
|
||||
|
||||
**Option 1: Pause the pipeline first**
|
||||
|
||||
1. Pause or delete your replication pipeline
|
||||
2. Delete the table at your destination
|
||||
3. The table will not be recreated since the pipeline is not running
|
||||
|
||||
**Option 2: Remove from publication first**
|
||||
|
||||
1. Remove the table from your Postgres publication using `ALTER PUBLICATION ... DROP TABLE`
|
||||
2. Restart your replication pipeline to apply the change (the table at the destination will remain but stop receiving new changes)
|
||||
3. Delete the table at your destination
|
||||
|
||||
Note: Removing a table from the publication and restarting the pipeline does not delete the table downstream, it only stops replicating new changes to it.
|
||||
|
||||
## Can data duplicates occur during pipeline operations?
|
||||
|
||||
Yes, data duplicates can occur in certain scenarios when stopping a pipeline.
|
||||
|
||||
When you stop a pipeline (for restarts or updates), replication tries to finish processing any transactions that are currently being sent to your destination. It waits up to a few minutes to allow these in-progress transactions to complete cleanly before stopping.
|
||||
When you stop a pipeline (for restarts or updates), the replication process tries to finish processing any transactions that are currently being sent to your destination. It waits up to a few minutes to allow these in-progress transactions to complete cleanly before stopping.
|
||||
|
||||
However, if a transaction in your database takes longer than this waiting period to complete, the pipeline will stop before that entire transaction has been fully processed. When the pipeline starts again, it must restart the incomplete transaction from the beginning to maintain transaction boundaries, which results in some data being sent twice to your destination.
|
||||
|
||||
**Understanding transaction boundaries**: A transaction is a group of database changes that happen together (for example, all changes within a `BEGIN...COMMIT` block). Replication must process entire transactions - it cannot process part of a transaction, stop, and then continue from the middle. This means if a transaction is interrupted, the whole transaction must be replayed when the pipeline resumes.
|
||||
**Understanding transaction boundaries**: A transaction is a group of database changes that happen together (for example, all changes within a `BEGIN...COMMIT` block). Postgres logical replication must process entire transactions - it cannot process part of a transaction, stop, and then continue from the middle. This means if a transaction is interrupted, the whole transaction must be replayed when the pipeline resumes.
|
||||
|
||||
**Example scenario**: Suppose you have a batch operation that updates 10,000 rows within a single transaction. If this operation takes 10 minutes to complete and you stop the pipeline after 5 minutes (when 5,000 rows have been processed), the pipeline cannot resume from row 5,001. Instead, when it restarts, it must reprocess all 10,000 rows from the beginning, resulting in the first 5,000 rows being sent to your destination twice.
|
||||
|
||||
**Important**: We are not currently planning to implement automatic deduplication. If your use case requires guaranteed exactly-once delivery, you should implement deduplication logic in your downstream systems based on primary keys or other unique identifiers.
|
||||
**Important**: There are currently no plans to implement automatic deduplication. If your use case requires guaranteed exactly-once delivery, you should implement deduplication logic in your downstream systems based on primary keys or other unique identifiers.
|
||||
|
||||
## Where to find replication logs
|
||||
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
---
|
||||
id: 'replication-iceberg'
|
||||
title: 'Replicate to Iceberg (Analytics Buckets)'
|
||||
description: 'Replicate your Supabase database to Iceberg format using Analytics Buckets.'
|
||||
subtitle: 'Stream data to Analytics Buckets.'
|
||||
sidebar_label: 'Iceberg'
|
||||
---
|
||||
|
||||
<Admonition type="caution" label="Private Alpha">
|
||||
|
||||
Replication is currently in private alpha. Access is limited and features may change.
|
||||
|
||||
</Admonition>
|
||||
|
||||
<Admonition type="caution" label="Current Limitation">
|
||||
|
||||
Iceberg replication is currently incomplete. It provides an append-only log listing all your data changes with an additional column explaining the type of operation (INSERT, UPDATE, DELETE).
|
||||
|
||||
</Admonition>
|
||||
|
||||
Apache Iceberg is an open table format for analytic datasets. Replication powered by [Supabase ETL](https://github.com/supabase/etl) to Iceberg uses Supabase [Analytics Buckets](/docs/guides/storage/analytics) to store your replicated data.
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
This page covers Iceberg-specific configuration. For complete setup instructions including publications, general settings, and pipeline management, see the [Replication Setup guide](/docs/guides/database/replication/replication-setup).
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Setup
|
||||
|
||||
Setting up Iceberg replication requires two steps: creating an Analytics Bucket, then configuring it as a destination.
|
||||
|
||||
#### Step 1: Create an Analytics bucket
|
||||
|
||||
First, create an Analytics Bucket to store your replicated data:
|
||||
|
||||
1. Navigate to [Storage](/dashboard/project/_/storage/buckets) → **Analytics** in your Supabase Dashboard
|
||||
2. Click **New bucket**
|
||||
|
||||
<Image
|
||||
alt="Create New Analytics Bucket"
|
||||
src="/docs/img/database/replication/replication-iceberg-new-bucket.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
#### Step 2: Add Iceberg as a destination
|
||||
|
||||
After clicking **New bucket**, fill in the bucket details and copy the credentials:
|
||||
|
||||
1. Fill in the bucket details:
|
||||
|
||||
<Image
|
||||
alt="Analytics Bucket Details"
|
||||
src="/docs/img/database/replication/replication-iceberg-details.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
- **Name**: A unique name for your bucket
|
||||
- **Region**: Select the region where your data will be stored
|
||||
|
||||
2. Click **Create bucket**
|
||||
3. **Copy the credentials** displayed after bucket creation (Catalog Token, S3 Access Key ID, S3 Secret Access Key). You'll need these in the next steps.
|
||||
4. Navigate to [Database](/dashboard/project/_/database/replication) → **Replication** in your Supabase Dashboard
|
||||
5. Click **Add destination**
|
||||
6. Configure the destination:
|
||||
- **Destination type**: Select **Iceberg (Analytics Bucket)**
|
||||
- **Bucket**: The name of your Analytics Bucket from Step 1
|
||||
- **Namespace**: The schema name where your tables will be replicated (e.g., `public`)
|
||||
- **Catalog Token**: Authentication token for accessing the Iceberg catalog (copied in Step 3)
|
||||
- **S3 Access Key ID**: Access key for S3-compatible storage (copied in Step 3)
|
||||
- **S3 Secret Access Key**: Secret key for S3-compatible storage (copied in Step 3)
|
||||
7. Complete the remaining configuration following the [Replication Setup guide](/docs/guides/database/replication/replication-setup)
|
||||
|
||||
For more information about Analytics Buckets, see the [Analytics Buckets documentation](/docs/guides/storage/analytics).
|
||||
|
||||
### Limitations
|
||||
|
||||
Iceberg-specific limitations:
|
||||
|
||||
- **Append-only log**: Currently provides an append-only log format rather than a full table representation
|
||||
|
||||
For general replication limitations that apply to all destinations, see the [Replication Setup guide](/docs/guides/database/replication/replication-setup#limitations).
|
||||
|
||||
### Next steps
|
||||
|
||||
- [Set up replication](/docs/guides/database/replication/replication-setup)
|
||||
- [Monitor replication](/docs/guides/database/replication/replication-monitoring)
|
||||
- [View replication FAQ](/docs/guides/database/replication/replication-faq)
|
||||
@@ -12,14 +12,14 @@ Replication is currently in private alpha. Access is limited and features may ch
|
||||
|
||||
</Admonition>
|
||||
|
||||
After setting up replication, you can monitor the status and health of your replication pipelines directly from the Supabase Dashboard. The pipeline is the active process that continuously replicates changes from your database to your destination.
|
||||
After setting up replication, you can monitor the status and health of your replication pipelines directly from the Supabase Dashboard. The pipeline is the active Postgres replication process that continuously streams changes from your database to your destination.
|
||||
|
||||
### Viewing pipeline status
|
||||
|
||||
To monitor your replication pipelines:
|
||||
|
||||
1. Navigate to the [Database](/dashboard/project/_/database/replication) section in your Supabase Dashboard
|
||||
2. Select the **Replication** tab
|
||||
2. Select the **replication** tab
|
||||
3. You'll see a list of all your destinations with their pipeline status
|
||||
|
||||
<Image
|
||||
@@ -88,12 +88,18 @@ Table errors occur during the copy phase and affect individual tables. These err
|
||||
|
||||
**Recovering from table errors:**
|
||||
|
||||
When a table encounters an error during the copy phase, you can reset the table state (for some errors). This will restart the table copy from the beginning.
|
||||
When a table encounters an error during the copy phase, you can reset the table state. This will restart the table copy from the beginning.
|
||||
|
||||
#### Pipeline errors
|
||||
|
||||
Pipeline errors occur during the streaming phase (Live state) and affect the entire pipeline. When streaming data, if an error occurs, the entire pipeline will stop and enter a **Failed** state. This prevents data loss by ensuring no changes are skipped.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
When a pipeline error occurs, you'll receive an email notification immediately. This ensures you're promptly notified of any issues so you can take action to resolve them.
|
||||
|
||||
</Admonition>
|
||||
|
||||
<Image
|
||||
alt="Pipeline Error Details"
|
||||
src="/docs/img/database/replication/replication-pipeline-error.png"
|
||||
@@ -134,7 +140,7 @@ Logs contain diagnostic information that may be too technical for most users. If
|
||||
|
||||
#### Checking if replication is healthy
|
||||
|
||||
1. Navigate to [Database](/dashboard/project/_/database/replication) → **Replication**
|
||||
1. Navigate to [Database](/dashboard/project/_/database/replication) → **replication**
|
||||
2. Verify your destination shows **Running** status
|
||||
3. Click **View status** to check replication lag and table states
|
||||
4. Ensure all tables show **Live** state
|
||||
@@ -164,8 +170,8 @@ If you notice issues with your replication:
|
||||
|
||||
1. **Check pipeline state**: Ensure the pipeline is in **Running** state
|
||||
2. **Review table states**: Identify tables in **Error** state
|
||||
3. **Check logs**: Navigate to Logs → replication for detailed error information
|
||||
4. **Verify publication**: Ensure your publication is properly configured
|
||||
3. **Check logs**: Navigate to Logs → Replication for detailed error information
|
||||
4. **Verify publication**: Ensure your Postgres publication is properly configured
|
||||
5. **Monitor replication lag**: High lag may indicate performance issues
|
||||
|
||||
For more troubleshooting tips, see the [Replication FAQ](/docs/guides/database/replication/replication-faq).
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
id: 'replication-setup'
|
||||
title: 'Replication Setup'
|
||||
description: 'Set up replication to automatically sync your database to external destinations.'
|
||||
description: 'Set up replication using Postgres logical replication.'
|
||||
subtitle: 'Configure publications and destinations for replication.'
|
||||
sidebar_label: 'Setting up'
|
||||
---
|
||||
@@ -12,17 +12,21 @@ Replication is currently in private alpha. Access is limited and features may ch
|
||||
|
||||
</Admonition>
|
||||
|
||||
Replication powered by [Supabase ETL](https://github.com/supabase/etl) requires two main components: a **publication** (source) and a **destination**. Follow these steps to set up your replication pipeline.
|
||||
Replication uses **Postgres logical replication** to stream changes from your database. Powered by [Supabase ETL](https://github.com/supabase/etl), an open source tool built for Postgres logical replication, it provides a managed interface through the Dashboard to configure and monitor replication pipelines.
|
||||
|
||||
## Setup overview
|
||||
|
||||
Replication requires two main components: a **Postgres publication** (defines what to replicate) and a **destination** (where data is sent). Follow these steps to set up your replication pipeline.
|
||||
|
||||
<Admonition type="tip">
|
||||
|
||||
If you already have a publication set up, you can skip to [Step 2: Enable replication](#step-2-enable-replication).
|
||||
If you already have a Postgres publication set up, you can skip to [Step 2: Enable replication](#step-2-enable-replication).
|
||||
|
||||
</Admonition>
|
||||
|
||||
### Step 1: Create a publication
|
||||
### Step 1: Create a Postgres publication
|
||||
|
||||
A publication defines which tables and change types will be replicated. You need to create a publication using SQL.
|
||||
A Postgres publication defines which tables and change types will be replicated from your database. You create publications using SQL.
|
||||
|
||||
#### Creating a publication
|
||||
|
||||
@@ -36,7 +40,7 @@ create publication pub_users_orders
|
||||
for table users, orders;
|
||||
```
|
||||
|
||||
This publication will track all changes (INSERT, UPDATE, DELETE) for both the `users` and `orders` tables.
|
||||
This publication will track all changes (INSERT, UPDATE, DELETE, TRUNCATE) for both the `users` and `orders` tables.
|
||||
|
||||
##### Publication for all tables in a schema
|
||||
|
||||
@@ -96,7 +100,7 @@ After creating a publication via SQL, you can view it in the Supabase Dashboard:
|
||||
Before adding destinations, you need to enable replication for your project:
|
||||
|
||||
1. Navigate to the [Database](/dashboard/project/_/database/replication) section in your Supabase Dashboard
|
||||
2. Select the **Replication** tab
|
||||
2. Select the **replication** tab
|
||||
3. Click **Enable replication** to activate replication for your project
|
||||
|
||||
<Image
|
||||
@@ -107,44 +111,224 @@ Before adding destinations, you need to enable replication for your project:
|
||||
|
||||
### Step 3: Add a destination
|
||||
|
||||
Once replication is enabled and you have a publication, you can add a destination. The destination is where your replicated data will be stored, while the pipeline is the active process that continuously replicates changes from your database to that destination.
|
||||
Once replication is enabled and you have a Postgres publication, you can add a destination. The destination is where your replicated data will be stored, while the pipeline is the active Postgres replication process that continuously streams changes from your database to that destination.
|
||||
|
||||
#### Available destinations
|
||||
#### Choose and configure your destination
|
||||
|
||||
For a complete list of available destinations and how to choose the right one for your needs, see [Destinations](/docs/guides/database/replication/replication-destinations).
|
||||
Follow these steps to configure your destination. The specific configuration depends on which destination type you choose. Both Analytics Buckets and BigQuery destinations are supported, though availability varies based on the planned roll-out strategy.
|
||||
|
||||
#### Configuration
|
||||
<Tabs
|
||||
scrollable
|
||||
size="small"
|
||||
type="underlined"
|
||||
defaultActiveId="analytics-buckets"
|
||||
queryGroup="destination"
|
||||
>
|
||||
<TabPanel id="analytics-buckets" label="Analytics Buckets">
|
||||
|
||||
1. In the Replication tab, click **Add destination**
|
||||
2. Configure the destination settings:
|
||||
[Analytics Buckets](/docs/guides/storage/analytics/introduction) are specialized storage buckets in Supabase Storage designed for analytical workloads. They provide S3-compatible storage and use the [Apache Iceberg](https://iceberg.apache.org/) open table format, making your data accessible via standard tools like DuckDB, Spark, and other analytics platforms.
|
||||
|
||||
**General Settings:**
|
||||
When you replicate to Analytics Buckets, your database changes are automatically written in Iceberg format, creating tables in object storage that you can query for analytics.
|
||||
|
||||
##### Step 1: Create an analytics bucket
|
||||
|
||||
First, create an analytics bucket to store your replicated data:
|
||||
|
||||
1. Navigate to [Storage](/dashboard/project/_/storage/buckets) → **Analytics** in your Supabase Dashboard
|
||||
2. Click **New bucket**
|
||||
|
||||
<Image
|
||||
alt="Create new analytics bucket"
|
||||
src="/docs/img/database/replication/replication-iceberg-new-bucket.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
3. Fill in the bucket details:
|
||||
|
||||
<Image
|
||||
alt="Analytics bucket details"
|
||||
src="/docs/img/database/replication/replication-iceberg-details.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
- **Name**: A unique name for your bucket (e.g., `analytics_warehouse`)
|
||||
- **Region**: Select the region where your data will be stored
|
||||
|
||||
4. Click **Create bucket**
|
||||
|
||||
5. **Copy the credentials** displayed after bucket creation. You'll need these in the next steps:
|
||||
- **Catalog Token**: Authentication token for accessing the Iceberg catalog
|
||||
- **S3 Access Key ID**: Access key for S3-compatible storage
|
||||
- **S3 Secret Access Key**: Secret key for S3-compatible storage
|
||||
|
||||
##### Step 2: Configure analytics buckets as a destination
|
||||
|
||||
1. Navigate to [Database](/dashboard/project/_/database/replication) → **replication** in your Supabase Dashboard
|
||||
2. Click **Add destination**
|
||||
|
||||
<Image
|
||||
alt="Add Destination"
|
||||
src="/docs/img/database/replication/replication-add-destination.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
3. Configure the general settings:
|
||||
|
||||
- **Destination name**: A name to identify this destination (e.g., "Analytics Warehouse")
|
||||
- **Publication**: The publication to replicate data from (created in Step 1)
|
||||
- **Destination type**: Choose from available destination types
|
||||
- **Publication**: The publication to replicate data from (created in [Step 1](#step-1-create-a-postgres-publication))
|
||||
- **Destination type**: Select **Analytics Buckets**
|
||||
|
||||
**Destination-specific settings:**
|
||||
Each destination type requires different configuration. See the [Destinations guide](/docs/guides/database/replication/replication-destinations) for configuration details specific to your chosen destination.
|
||||
4. Configure Analytics Buckets settings:
|
||||
|
||||
<Image
|
||||
alt="Add Destination"
|
||||
src="/docs/img/database/replication/replication-add-destination.png"
|
||||
zoomable
|
||||
/>
|
||||
- **Bucket**: The name of your analytics bucket from Step 1
|
||||
- **Namespace**: The schema name where your tables will be replicated (e.g., `public`)
|
||||
- **Catalog Token**: Authentication token from Step 1
|
||||
- **S3 Access Key ID**: Access key from Step 1
|
||||
- **S3 Secret Access Key**: Secret key from Step 1
|
||||
|
||||
3. Configure **Advanced Settings** (optional):
|
||||
5. Configure **Advanced Settings** (optional):
|
||||
|
||||
- **Batch wait time (milliseconds)**: How long to wait for more changes before sending a batch. We recommend leaving this at the default value for optimal performance. Setting this too low can result in too much traffic and less efficient batching.
|
||||
- **Batch wait time (milliseconds)**: How long to wait for more changes before sending a batch. Default is recommended for optimal performance.
|
||||
|
||||
4. Click **Create and start** to begin replication
|
||||
6. Click **Create and start** to begin replication
|
||||
|
||||
Your replication pipeline will now start copying data from your database to the analytics bucket in Iceberg format.
|
||||
|
||||
##### How it works
|
||||
|
||||
Once configured, replication to Analytics Buckets:
|
||||
|
||||
1. Captures changes from your Postgres database (INSERT, UPDATE, DELETE, TRUNCATE operations)
|
||||
2. Batches changes for optimal performance
|
||||
3. Creates Iceberg tables automatically to match your Postgres schema
|
||||
4. Streams data to Analytics Buckets
|
||||
|
||||
##### How tables are structured
|
||||
|
||||
Replicated tables use a changelog structure:
|
||||
|
||||
- Tables are created with a `_changelog` suffix in the name (e.g., `users_changelog`)
|
||||
- Each table contains a `cdc_operation` column indicating the operation type: `INSERT`, `UPDATE`, `DELETE`, or `TRUNCATE`
|
||||
- This append-only format preserves the complete history of all changes
|
||||
|
||||
##### Limitations
|
||||
|
||||
- **Append-only log**: Currently provides an append-only log format rather than a full table representation
|
||||
|
||||
##### Additional resources
|
||||
|
||||
- [Analytics Buckets documentation](/docs/guides/storage/analytics/introduction) - Learn more about Analytics Buckets and S3-compatible storage
|
||||
- [Realtime Data Sync to Analytics Buckets](/docs/guides/storage/analytics/replication) - Step-by-step guide for replicating to Analytics Buckets
|
||||
- [Apache Iceberg](https://iceberg.apache.org/) - Official Iceberg documentation
|
||||
|
||||
</TabPanel>
|
||||
<TabPanel id="bigquery" label="BigQuery">
|
||||
|
||||
[BigQuery](https://cloud.google.com/bigquery) is Google's fully managed data warehouse. You can replicate your database tables to BigQuery for analytics and reporting.
|
||||
|
||||
##### Step 1: Prepare GCP resources
|
||||
|
||||
Before configuring BigQuery as a destination, set up the following in Google Cloud Platform:
|
||||
|
||||
1. **Google Cloud Platform (GCP) account**: [Sign up for GCP](https://cloud.google.com/gcp) if you don't have one
|
||||
|
||||
2. **BigQuery dataset**: Create a [BigQuery dataset](https://cloud.google.com/bigquery/docs/datasets-intro) in your GCP project
|
||||
|
||||
- Open the BigQuery console in GCP
|
||||
- Select your project
|
||||
- Click "Create Dataset"
|
||||
- Provide a dataset ID (e.g., `supabase_replication`)
|
||||
|
||||
3. **GCP service account key**: Create a [service account](https://cloud.google.com/iam/docs/keys-create-delete) with appropriate permissions:
|
||||
|
||||
- Go to IAM & Admin → Service Accounts
|
||||
- Click "Create Service Account"
|
||||
- Grant the **BigQuery Data Editor** role
|
||||
- Create and download the JSON key file
|
||||
|
||||
Required permissions:
|
||||
|
||||
- `bigquery.datasets.get`
|
||||
- `bigquery.tables.create`
|
||||
- `bigquery.tables.get`
|
||||
- `bigquery.tables.getData`
|
||||
- `bigquery.tables.update`
|
||||
- `bigquery.tables.updateData`
|
||||
|
||||
##### Step 2: Configure BigQuery as a destination
|
||||
|
||||
1. Navigate to [Database](/dashboard/project/_/database/replication) → **replication** in your Supabase Dashboard
|
||||
2. Click **Add destination**
|
||||
|
||||
<Image
|
||||
alt="BigQuery Configuration Settings"
|
||||
src="/docs/img/database/replication/replication-bigquery-details.png"
|
||||
zoomable
|
||||
/>
|
||||
|
||||
3. Configure the general settings:
|
||||
|
||||
- **Destination name**: A name to identify this destination (e.g., "BigQuery Warehouse")
|
||||
- **Publication**: The publication to replicate data from (created in [Step 1](#step-1-create-a-postgres-publication))
|
||||
- **Destination type**: Select **BigQuery**
|
||||
|
||||
4. Configure BigQuery-specific settings:
|
||||
|
||||
- **Project ID**: Your BigQuery project identifier (found in the GCP Console)
|
||||
- **Dataset ID**: The name of your BigQuery dataset (without the project ID)
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
In the GCP Console, the dataset is shown as `project-id.dataset-id`. Enter only the part after the dot. For example, if you see `my-project.my_dataset`, enter `my_dataset`.
|
||||
|
||||
</Admonition>
|
||||
|
||||
- **Service Account Key**: Your GCP service account key in JSON format (from Step 1)
|
||||
|
||||
5. Configure **Advanced Settings** (optional):
|
||||
|
||||
- **Batch wait time (milliseconds)**: How long to wait for more changes before sending a batch. Default is recommended for optimal performance.
|
||||
|
||||
6. Click **Create and start** to begin replication
|
||||
|
||||
Your replication pipeline will now start copying data from your database to BigQuery.
|
||||
|
||||
##### How it works
|
||||
|
||||
Once configured, replication to BigQuery:
|
||||
|
||||
1. Captures changes from your Postgres database (INSERT, UPDATE, DELETE, TRUNCATE operations)
|
||||
2. Batches changes for optimal performance
|
||||
3. Creates BigQuery tables automatically to match your Postgres schema
|
||||
4. Streams data to BigQuery
|
||||
|
||||
##### How tables are structured
|
||||
|
||||
Due to BigQuery limitations, replicated tables use a versioned structure:
|
||||
|
||||
- The table you query is a **view** (e.g., `users`)
|
||||
- The actual data is stored in versioned tables with a `_version` suffix (e.g., `users_version`)
|
||||
- When a table is truncated in your database, a new version is created and the view automatically points to the latest version
|
||||
|
||||
This structure handles table truncations seamlessly while maintaining query compatibility.
|
||||
|
||||
##### Limitations
|
||||
|
||||
- **Row size**: Limited to 10 MB per row due to BigQuery Storage Write API constraints
|
||||
|
||||
##### Additional resources
|
||||
|
||||
- [BigQuery documentation](https://cloud.google.com/bigquery/docs) - Official Google BigQuery documentation
|
||||
|
||||
</TabPanel>
|
||||
</Tabs>
|
||||
|
||||
### Step 4: Monitor your pipeline
|
||||
|
||||
After creating a destination, the pipeline will start and appear in the destinations list. You can monitor the pipeline's status and performance from the Dashboard.
|
||||
After creating a destination, the replication pipeline will start and appear in the destinations list. You can monitor the pipeline's status and performance from the Dashboard.
|
||||
|
||||
<Image
|
||||
alt="Destinations List"
|
||||
alt="Replication Destinations List"
|
||||
src="/docs/img/database/replication/replication-destinations-list.png"
|
||||
zoomable
|
||||
/>
|
||||
@@ -171,11 +355,11 @@ Available actions:
|
||||
|
||||
### Adding or removing tables
|
||||
|
||||
If you need to modify which tables are replicated after your pipeline is already running, follow these steps:
|
||||
If you need to modify which tables are replicated after your replication pipeline is already running, follow these steps:
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
If your publication uses `FOR ALL TABLES` or `FOR TABLES IN SCHEMA`, new tables in that scope are automatically included in the publication. However, you still **must restart the pipeline** for the changes to take effect.
|
||||
If your Postgres publication uses `FOR ALL TABLES` or `FOR TABLES IN SCHEMA`, new tables in that scope are automatically included in the publication. However, you still **must restart the replication pipeline** for the changes to take effect.
|
||||
|
||||
</Admonition>
|
||||
|
||||
@@ -191,11 +375,11 @@ If your publication uses `FOR ALL TABLES` or `FOR TABLES IN SCHEMA`, new tables
|
||||
alter publication pub_users_orders add table products, categories;
|
||||
```
|
||||
|
||||
2. **Restart the pipeline** using the actions menu (see [Managing your pipeline](#managing-your-pipeline)) for the changes to take effect.
|
||||
2. **Restart the replication pipeline** using the actions menu (see [Managing your pipeline](#managing-your-pipeline)) for the changes to take effect.
|
||||
|
||||
#### Removing tables from replication
|
||||
|
||||
1. Remove the table from your publication using SQL:
|
||||
1. Remove the table from your Postgres publication using SQL:
|
||||
|
||||
```sql
|
||||
-- Remove a single table from a publication
|
||||
@@ -205,56 +389,57 @@ If your publication uses `FOR ALL TABLES` or `FOR TABLES IN SCHEMA`, new tables
|
||||
alter publication pub_users_orders drop table orders, products;
|
||||
```
|
||||
|
||||
2. **Restart the pipeline** using the actions menu (see [Managing your pipeline](#managing-your-pipeline)) for the changes to take effect.
|
||||
2. **Restart the replication pipeline** using the actions menu (see [Managing your pipeline](#managing-your-pipeline)) for the changes to take effect.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Deleted tables are automatically recreated by the pipeline. To permanently delete a table, pause the pipeline first or remove it from the publication before deleting. See the [FAQ](/docs/guides/database/replication/replication-faq#what-happens-if-a-table-is-deleted-at-the-destination) for details.
|
||||
|
||||
</Admonition>
|
||||
|
||||
### How it works
|
||||
|
||||
Once configured, replication:
|
||||
|
||||
1. **Captures** changes from your database using the publication
|
||||
2. **Loads** the data to your destination in near real-time batches
|
||||
1. **Captures** changes from your Postgres database using Postgres publications and logical replication
|
||||
2. **Streams** the changes through the replication pipeline
|
||||
3. **Loads** the data to your destination in near real-time batches
|
||||
|
||||
Changes are sent in batches to optimize performance and reduce costs. The batch size and timing can be adjusted using the advanced settings.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Replication currently performs data extraction and loading only, without transformation. Your data is replicated as-is to the destination.
|
||||
|
||||
</Admonition>
|
||||
Changes are sent in batches to optimize performance and reduce costs. The batch size and timing can be adjusted using the advanced settings. The replication pipeline currently performs data extraction and loading only, without transformation - your data is replicated as-is to the destination.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
If you encounter issues during setup:
|
||||
|
||||
- **Publication not appearing**: Ensure you created the publication via SQL and refresh the dashboard
|
||||
- **Tables not showing in publication**: Verify your tables have primary keys (required for replication)
|
||||
- **Publication not appearing**: Ensure you created the Postgres publication via SQL and refresh the dashboard
|
||||
- **Tables not showing in publication**: Verify your tables have primary keys (required for Postgres logical replication)
|
||||
- **Pipeline failed to start**: Check the error message in the status view for specific details
|
||||
- **No data being replicated**: Verify your publication includes the correct tables and event types
|
||||
- **No data being replicated**: Verify your Postgres publication includes the correct tables and event types
|
||||
|
||||
For more troubleshooting help, see the [Replication FAQ](/docs/guides/database/replication/replication-faq).
|
||||
|
||||
### Limitations
|
||||
|
||||
Replication has the following limitations that apply to all destinations:
|
||||
Replication has the following limitations:
|
||||
|
||||
- **Primary keys required**: Tables must have primary keys
|
||||
- **Primary keys required**: Tables must have primary keys (Postgres logical replication requirement)
|
||||
- **Custom data types**: Not supported
|
||||
- **Schema changes**: Not automatically handled
|
||||
- **No data transformation**: Data is replicated as-is without transformation
|
||||
- **Data duplicates**: Duplicates can occur when stopping a pipeline if your database has transactions that take longer than a few minutes to complete. See [Can data duplicates occur?](/docs/guides/database/replication/replication-faq#can-data-duplicates-occur-during-pipeline-operations) for details
|
||||
|
||||
Destination-specific limitations may also apply. See the [Iceberg](/docs/guides/database/replication/replication-iceberg#limitations) destination page for details.
|
||||
Destination-specific limitations (such as Iceberg's append-only log format or BigQuery's row size limits) are detailed in each destination tab in [Step 3](#step-3-add-a-destination) above.
|
||||
|
||||
### Future work
|
||||
|
||||
Replication is actively being developed. Planned improvements include:
|
||||
|
||||
- **DDL support**: Automatic handling of schema changes (ALTER TABLE, ADD COLUMN, etc.)
|
||||
- **DDL support**: Automatic handling of Postgres schema changes (ALTER TABLE, ADD COLUMN, etc.)
|
||||
- **Additional destinations**: Support for more data warehouses and analytics platforms
|
||||
|
||||
We don't have public timelines for these features, but they represent our roadmap for making replication more robust and flexible.
|
||||
There are no public timelines for these features, but they represent the roadmap for making replication more robust and flexible.
|
||||
|
||||
### Next steps
|
||||
|
||||
- [Monitor replication](/docs/guides/database/replication/replication-monitoring)
|
||||
- [View replication FAQ](/docs/guides/database/replication/replication-faq)
|
||||
- [Monitor Replication](/docs/guides/database/replication/replication-monitoring)
|
||||
- [View Replication FAQ](/docs/guides/database/replication/replication-faq)
|
||||
@@ -66,6 +66,12 @@ Run the CLI by prefixing each command with `npx` or `bunx`:
|
||||
npx supabase --help
|
||||
```
|
||||
|
||||
<Admonition type="caution">
|
||||
|
||||
The Supabase CLI requires **Node.js 20 or later** when run via `npx` or `npm`. Older Node.js versions, such as 16, are not supported and fail to start the CLI.
|
||||
|
||||
</Admonition>
|
||||
|
||||
You can also install the CLI as dev dependency via [npm](https://www.npmjs.com/package/supabase):
|
||||
|
||||
```sh
|
||||
|
||||
@@ -124,7 +124,7 @@ The two special message types have a well defined binary format where the first
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type (0x03) | Join Ref Size | Ref Size | Topic Size |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|User Event Size| Payload Enc. | Join Ref (variable length) |
|
||||
|User Event Size| Metadata Size | Payload Enc. | Join Ref ... |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Ref (variable length) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -132,6 +132,8 @@ The two special message types have a well defined binary format where the first
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| User Event (variable length) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Metadata (variable length) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| User Payload (variable length) |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
```
|
||||
@@ -143,11 +145,13 @@ The two special message types have a well defined binary format where the first
|
||||
- **Ref Size**: 1 byte, size of reference string (max 255)
|
||||
- **Topic Size**: 1 byte, size of topic string (max 255)
|
||||
- **User Event Size**: 1 byte, size of user event string (max 255)
|
||||
- **Metadata Size**: 1 byte, size of metadata string (max 255)
|
||||
- **Payload Encoding**: 1 byte (0 = binary, 1 = JSON)
|
||||
- **Join Ref**: Variable length string
|
||||
- **Ref**: Variable length string
|
||||
- **Topic**: Variable length string
|
||||
- **User Event**: Variable length string
|
||||
- **Metadata**: Variable length JSON string
|
||||
- **User Payload**: Variable length payload data
|
||||
|
||||
#### User Broadcast
|
||||
@@ -386,6 +390,7 @@ Below is the same example from the previous section, showing the binary frame st
|
||||
- Topic: `realtime:chat-room`
|
||||
- Payload encoding being JSON
|
||||
- User Event: `user-event`
|
||||
- Metadata is empty
|
||||
- User Payload
|
||||
|
||||
```
|
||||
@@ -394,6 +399,7 @@ Below is the same example from the previous section, showing the binary frame st
|
||||
0x01 // Ref Size
|
||||
0x12 // Topic Size
|
||||
0x0A // User Event Size
|
||||
0x00 // Metadata Size
|
||||
0x01 // Payload Encoding (1 = JSON)
|
||||
10 // Actual Join Ref
|
||||
1 // Actual Ref
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: 'Platform Audit Logs'
|
||||
description: 'Monitor and track organization member activities via platform API or dashboard.'
|
||||
---
|
||||
|
||||
Any [Platform API](/docs/reference/api/introduction) or [dashboard](/dashboard) actions performed by organization members are logged automatically for auditing and security purposes. This includes actions such as creating a new project, inviting members, modifying an edge function or changing project settings.
|
||||
|
||||
Besides Platform Audit Logs, Supabase Auth also provides [Auth Audit Logs](/docs/guides/auth/audit-logs) to monitor authentication-related activities within your projects.
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Platform Audit Logs are only available on the [Team and Enterprise plans](/pricing).
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Accessing audit logs
|
||||
|
||||
Platform Audit Logs can be found under your [organization's audit logs](/dashboard/org/_/audit).
|
||||
|
||||
<Image
|
||||
alt="Platform audit logs"
|
||||
src={{
|
||||
light: '/docs/img/guides/security/platform-audit-logs--light.png',
|
||||
dark: '/docs/img/guides/security/platform-audit-logs--dark.png',
|
||||
}}
|
||||
zoomable
|
||||
/>
|
||||
|
||||
For each audit log, you can see additional details by clicking on the log entry:
|
||||
|
||||
- Timestamp of action
|
||||
- Actor who performed the action
|
||||
- IP address
|
||||
- Email
|
||||
- Token Type
|
||||
- Action performed
|
||||
- Name
|
||||
- Metadata such as route and response status
|
||||
- Action Target (Project, organization, Edge Function, ...)
|
||||
|
||||
## Limitations
|
||||
|
||||
- There is currently no way to export the logs via dashboard
|
||||
- There is currently no way to set up a log drain of platform audit logs
|
||||
- Retention periods depend on your plan
|
||||
@@ -5,15 +5,17 @@ subtitle: 'Replicate your PostgreSQL data to analytics buckets in real-time.'
|
||||
|
||||
<Admonition type="caution" title="This feature is in alpha">
|
||||
|
||||
Expect rapid changes, limited features, and possible breaking updates. [Share feedback](https://github.com/orgs/supabase/discussions/40116) as we refine the experience and expand access.
|
||||
Expect rapid changes, limited features, and possible breaking updates. [Share feedback](https://github.com/orgs/supabase/discussions/40116) as the experience is refined and access is expanded.
|
||||
|
||||
</Admonition>
|
||||
|
||||
By combining replication powered by [Supabase ETL](https://github.com/supabase/etl) with **Analytics Buckets**, you can build an end-to-end data warehouse solution that automatically syncs changes from your Postgres database to Iceberg tables.
|
||||
|
||||
This guide provides a quickstart for replicating to Analytics Buckets. For complete replication configuration including other destinations, see the [Replication Setup Guide](/docs/guides/database/replication/replication-setup).
|
||||
|
||||
## How it works
|
||||
|
||||
The replication pipeline captures changes (INSERT, UPDATE, DELETE) from your Postgres database in real-time and writes them to your analytics bucket. This allows you to maintain an always-up-to-date data warehouse without impacting your production workloads.
|
||||
The replication pipeline captures changes (INSERT, UPDATE, DELETE) from your Postgres database in real-time using Postgres logical replication and writes them to your analytics bucket. This allows you to maintain an always-up-to-date data warehouse without impacting your production workloads.
|
||||
|
||||
## Setup steps
|
||||
|
||||
@@ -43,7 +45,7 @@ CREATE PUBLICATION pub_warehouse
|
||||
FOR TABLE users, orders, products;
|
||||
```
|
||||
|
||||
This publication will track all changes (INSERT, UPDATE, DELETE) for the specified tables. For advanced use cases, see the [Replication Configuration Guide](/docs/guides/database/replication/replication-setup).
|
||||
This publication will track all changes (INSERT, UPDATE, DELETE) for the specified tables. For advanced publication options like column filtering and row predicates, see the [Replication Setup Guide](/docs/guides/database/replication/replication-setup#advanced-publication-options).
|
||||
|
||||
### Step 3: Create the replication pipeline
|
||||
|
||||
@@ -70,6 +72,12 @@ Once started, you can monitor the pipeline status directly in the **Database > R
|
||||
- **Sync Progress** - View the number of records replicated
|
||||
- **Logs** - Check detailed logs for troubleshooting
|
||||
|
||||
<Admonition type="note">
|
||||
|
||||
Deleted tables are automatically recreated by the pipeline. To permanently delete a table, pause the pipeline first or remove it from the publication before deleting. See the [FAQ](/docs/guides/database/replication/replication-faq#what-happens-if-i-delete-a-table-at-the-destination) for details.
|
||||
|
||||
</Admonition>
|
||||
|
||||
## Next steps
|
||||
|
||||
Once data is flowing to your analytics bucket, you can:
|
||||
@@ -78,4 +86,8 @@ Once data is flowing to your analytics bucket, you can:
|
||||
- [Connect with PyIceberg](/docs/guides/storage/analytics/examples/pyiceberg)
|
||||
- [Analyze with Apache Spark](/docs/guides/storage/analytics/examples/apache-spark)
|
||||
|
||||
For advanced topics, see the [Replication Monitoring Guide](/docs/guides/database/replication/replication-monitoring).
|
||||
For detailed replication configuration and advanced topics:
|
||||
|
||||
- [Replication Setup Guide](/docs/guides/database/replication/replication-setup) - Complete replication configuration including BigQuery and other destinations
|
||||
- [Replication Monitoring Guide](/docs/guides/database/replication/replication-monitoring) - Monitor replication pipeline status and health
|
||||
- [Replication FAQ](/docs/guides/database/replication/replication-faq) - Common questions about replication
|
||||
@@ -14,11 +14,21 @@ Go to [**Account Settings > Preferences**](/dashboard/account/me)
|
||||
- Find your email under **Account Identities** and click the edit icon
|
||||
- After saving the new address, an email is sent to _both the old and new email addresses_
|
||||
- Your account email is updated after clicking the link _in both emails_
|
||||
- Ensure the new address is shown by default in **Primary email**.
|
||||
- If it is not, select it from the dropdown and save.
|
||||
|
||||
If you are using GitHub Authentication to login into your Supabase account:
|
||||
If you are using GitHub Authentication / [Vercel Marketplace](/docs/guides/integrations/vercel-marketplace) to login into your Supabase account:
|
||||
|
||||
- Log out of Supabase.
|
||||
- Change Primary Email in GitHub
|
||||
- Log out of GitHub.
|
||||
- Log back into GitHub (with the new, desired email set as primary)
|
||||
- Change Primary Email in GitHub / Vercel
|
||||
- Log out of GitHub / Vercel.
|
||||
- Log back into GitHub / Vercel (with the new, desired email set as primary)
|
||||
- Log back into Supabase.
|
||||
- Go to [**Account Settings > Preferences**](/dashboard/account/me)
|
||||
- Ensure the new address is shown by default in **Primary email**.
|
||||
- If it is not, select it from the dropdown and save.
|
||||
|
||||
**Note:**
|
||||
|
||||
- The email in the primary email value can only be linked to a single Supabase account.
|
||||
- If you have multiple accounts using the same email, the first account associated with email will be have it assigned as the primary email. If you need to switch it, use the steps above to change the email on the account that you do not wish to associate the email with. Alternatively, if it is possible, [request for an account deletion](/dashboard/account/me) on the account so that it will remove the association. After that, go into the desired account and update **Primary email**.
|
||||
@@ -6,7 +6,8 @@ github_url = "https://github.com/orgs/supabase/discussions/33045"
|
||||
database_id = "91ae4c49-bf22-4b8c-b96b-cd11f1c38158"
|
||||
---
|
||||
|
||||
If you're unable to download backups due to physical backups being enabled, you can use the Supabase CLI command `pgdump` as an alternative.
|
||||
When Point-in-Time Recovery (PITR) or physical backups are enabled, Supabase no longer generates the downloadable logical backup file (backup.gz). This is expected, as the backup pipeline switches entirely to physical backups. You can still download backups via the Supabase CLI command `pgdump`.
|
||||
|
||||
For step-by-step instructions, check out our guide: [Backup & Restore](/docs/guides/platform/migrating-within-supabase/backup-restore).
|
||||
|
||||
You can also learn more about how backups work in Supabase here: [Database Backups](/docs/guides/platform/backups).
|
||||
@@ -10,7 +10,7 @@ database_id = "caa72a34-696c-47c6-8976-e50cf7fb396e"
|
||||
Have you ever accidentally committed a service key to a public repo? Or maybe rotating keys is just something you regularly do for security compliance.
|
||||
Whatever the reason, here's how to rotate the keys for your Supabase project.
|
||||
|
||||
1. Go to the [API Settings page](/dashboard/project/_/settings/api) in the Supabase Dashboard
|
||||
1. Go to the [API Settings page](/dashboard/project/_/settings/api-keys/new) in the Supabase Dashboard
|
||||
2. Find the JWT Secrets section
|
||||
|
||||
<img
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
---
|
||||
slug: /
|
||||
sidebar_position: 1
|
||||
id: management-api
|
||||
title: Management API
|
||||
sidebar_label: Management API
|
||||
---
|
||||
|
||||
The Management API allows you to manage your projects programmatically.
|
||||
|
||||
## Authentication
|
||||
|
||||
All API requests require a Supabase Personal token to be included in the Authorization header: `Authorization: Bearer <supabase_personal_token>`.
|
||||
To generate or manage your API token, visit your [account](https://supabase.com/dashboard/account/tokens) page.
|
||||
Your API tokens carry the same privileges as your user account, so be sure to keep it secret.
|
||||
|
||||
```bash
|
||||
$ curl https://api.supabase.com/v1/projects \
|
||||
-H "Authorization: Bearer sbp_bdd0••••••••••••••••••••••••••••••••4f23"
|
||||
```
|
||||
|
||||
All API requests must be authenticated and made over HTTPS.
|
||||
|
||||
## Rate limits
|
||||
|
||||
The rate limit for Management API is 120 requests per one minute per user, and applies cumulatively across all requests made with your personal access tokens.
|
||||
|
||||
If you exceed this limit, all Management API calls for the next minute will be blocked, resulting in a HTTP 429 response.
|
||||
|
||||
The Management API is subject to our fair-use policy.
|
||||
All resources created via the API are subject to the pricing detailed on our [Pricing](https://supabase.com/pricing) pages.
|
||||
|
||||
## Additional links
|
||||
|
||||
- [OpenAPI Docs](https://api.supabase.com/api/v1)
|
||||
- [OpenAPI Spec](https://api.supabase.com/api/v1-json)
|
||||
- Reporting bugs and issues: [github.com/supabase/supabase](https://github.com/supabase/supabase)
|
||||
@@ -36,16 +36,11 @@ hideTitle: true
|
||||
-H "Authorization: Bearer sbp_bdd0••••••••••••••••••••••••••••••••4f23"
|
||||
```
|
||||
|
||||
All API requests must be authenticated and made over HTTPS.
|
||||
All API requests must be authenticated and made over HTTPS foo.
|
||||
|
||||
## Rate limits
|
||||
<$Partial path="api_rate_limits.mdx" />
|
||||
|
||||
The rate limit for Management API is 120 requests per one minute per user, and applies cumulatively across all requests made with your personal access tokens.
|
||||
|
||||
If you exceed this limit, all Management API calls for the next minute will be blocked, resulting in a HTTP 429 response.
|
||||
|
||||
The Management API is subject to our fair-use policy.
|
||||
All resources created via the API are subject to the pricing detailed on our [Pricing](https://supabase.com/pricing) pages.
|
||||
The Management API is subject to our fair-use policy. All resources created via the API are subject to the pricing detailed on our [Pricing](https://supabase.com/pricing) pages.
|
||||
|
||||
</RefSubLayout.Details>
|
||||
|
||||
|
||||
@@ -27,14 +27,19 @@ async function _typeSpecSingleton() {
|
||||
return typeSpec
|
||||
}
|
||||
|
||||
function normalizeRefPath(path: string) {
|
||||
return path.replace(/\.index(?=\.|$)/g, '').replace(/\.+/g, '.')
|
||||
}
|
||||
|
||||
export async function getTypeSpec(ref: string) {
|
||||
const modules = await _typeSpecSingleton()
|
||||
|
||||
const delimiter = ref.indexOf('.')
|
||||
const refMod = ref.substring(0, delimiter)
|
||||
const normalizedRef = normalizeRefPath(ref)
|
||||
const delimiter = normalizedRef.indexOf('.')
|
||||
const refMod = normalizedRef.substring(0, delimiter)
|
||||
|
||||
const mod = modules.find((mod) => mod.name === refMod)
|
||||
return mod?.methods.get(ref)
|
||||
return mod?.methods.get(normalizedRef)
|
||||
}
|
||||
|
||||
let cliSpec: Json
|
||||
|
||||
@@ -574,10 +574,10 @@ function parseType(type: any, map: Map<number, any>, typeArguments?: any, debug
|
||||
switch (type.kindString) {
|
||||
case 'Type alias':
|
||||
if (typeof type.type === 'object') {
|
||||
return parseType(type.type, map)
|
||||
return parseType(type.type, map, typeArguments)
|
||||
}
|
||||
case 'Interface':
|
||||
return parseInterface(type, map)
|
||||
return parseInterface(type, map, typeArguments)
|
||||
default:
|
||||
break
|
||||
}
|
||||
@@ -599,10 +599,16 @@ function delegateParsing(
|
||||
const dereferencedType = parseType(referenced, map, typeArguments)
|
||||
|
||||
if (dereferencedType) {
|
||||
dereferencedType.name = nameOrAnonymous([original, dereferencedType])
|
||||
// When resolving a type parameter (e.g., T -> { vectorBucket: VectorBucket }),
|
||||
// don't override the name or comment - let the resolved type speak for itself
|
||||
const isTypeParameterResolution = original.refersToTypeParameter === true
|
||||
|
||||
if (!isTypeParameterResolution) {
|
||||
dereferencedType.name = nameOrAnonymous([original, dereferencedType])
|
||||
}
|
||||
}
|
||||
|
||||
if (original.comment) {
|
||||
if (original.comment && !original.refersToTypeParameter) {
|
||||
dereferencedType.comment = {
|
||||
...normalizeComment(dereferencedType.comment),
|
||||
...normalizeComment(original.comment),
|
||||
@@ -696,14 +702,14 @@ function parseReferenceType(type: any, map: Map<number, any>, typeArguments?: an
|
||||
type,
|
||||
referenced.type,
|
||||
map,
|
||||
type.typeArguments
|
||||
typeArguments ?? type.typeArguments
|
||||
)
|
||||
: delegateParsing(type, referenced, map, type.typeArguments)
|
||||
: delegateParsing(type, referenced, map, typeArguments ?? type.typeArguments)
|
||||
|
||||
if (maybeType) {
|
||||
return maybeType
|
||||
} else if (isNewTypedoc(referenced) && referenced.kind === KIND_INTERFACE) {
|
||||
return parseInterface(referenced, map)
|
||||
return parseInterface(referenced, map, typeArguments ?? type.typeArguments)
|
||||
} else if (isNewTypedoc(referenced) && referenced.kind === KIND_CLASS) {
|
||||
// Class is too complicated to display here, just return its name
|
||||
return {
|
||||
@@ -919,9 +925,9 @@ function parseTypeOperatorType(
|
||||
}
|
||||
}
|
||||
|
||||
function parseInterface(type: any, map: Map<number, any>): CustomObjectType {
|
||||
function parseInterface(type: any, map: Map<number, any>, typeArguments?: any): CustomObjectType {
|
||||
const properties = (type.children ?? [])
|
||||
.map((child) => parseTypeInternals(child, map))
|
||||
.map((child) => parseTypeInternals(child, map, typeArguments))
|
||||
.filter(Boolean)
|
||||
|
||||
return {
|
||||
|
||||
@@ -266,7 +266,7 @@ export function McpConfigPanel() {
|
||||
const [selectedProject, setSelectedProject] = useState<{ ref: string; name: string } | null>(null)
|
||||
const [selectedPlatform, setSelectedPlatform] = useState<'hosted' | 'local'>('hosted')
|
||||
const [selectedClient, setSelectedClient] = useState<McpClient | null>(null)
|
||||
const { theme } = useTheme()
|
||||
const { resolvedTheme } = useTheme()
|
||||
const sendTelemetryEvent = useSendTelemetryEvent()
|
||||
|
||||
const isPlatform = selectedPlatform === 'hosted'
|
||||
@@ -325,7 +325,7 @@ export function McpConfigPanel() {
|
||||
basePath="/docs"
|
||||
className="mt-6"
|
||||
projectRef={project?.ref}
|
||||
theme={theme as 'light' | 'dark'}
|
||||
theme={resolvedTheme as 'light' | 'dark'}
|
||||
isPlatform={isPlatform}
|
||||
onCopyCallback={handleCopy}
|
||||
onInstallCallback={handleInstall}
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
"hast-util-to-html": "^9.0.0",
|
||||
"icons": "workspace:*",
|
||||
"isbot": "^5.1.2",
|
||||
"js-yaml": "^3.14.1",
|
||||
"js-yaml": "^3.14.2",
|
||||
"jsrsasign": "^11.0.0",
|
||||
"katex": "^0.16.21",
|
||||
"libpg-query": "15.2.0",
|
||||
|
||||
@@ -10,6 +10,7 @@ Alan De Los Santos
|
||||
Aleksi Immonen
|
||||
Alexander Korotkov
|
||||
Ali Waseem
|
||||
Allan S
|
||||
Amy Q
|
||||
Andrew Valleteau
|
||||
Andrey A
|
||||
@@ -111,6 +112,7 @@ Leonardo Santiago
|
||||
Long Hoang
|
||||
Luca Forstner
|
||||
Łukasz Niemier
|
||||
Maksym Ionutsa
|
||||
Manan Gupta
|
||||
Margarita Sandomirskaia
|
||||
Mark Burggraf
|
||||
|
||||
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 230 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 225 KiB |
|
After Width: | Height: | Size: 221 KiB |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="508" height="508"><svg width="508" height="508" viewBox="0 0 508 508" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_7026_10735)">
|
||||
<circle cx="254" cy="254" r="254" fill="#020202"></circle>
|
||||
<path d="M321.997 150.712C321.401 150.568 320.844 150.299 320.363 149.925C319.883 149.551 319.491 149.08 319.215 148.544C318.938 148.008 318.783 147.42 318.76 146.821C318.738 146.22 318.848 145.624 319.084 145.07C327.226 125.716 330.819 110.23 325.021 103.747C309.666 86.5471 248.085 120.749 228.451 132.333C227.925 132.642 227.337 132.837 226.728 132.903C226.118 132.969 225.501 132.906 224.918 132.719C224.336 132.531 223.801 132.223 223.351 131.815C222.902 131.407 222.548 130.909 222.313 130.356C214.06 111.043 205.384 97.6094 196.589 97.0268C173.279 95.4688 154.491 162.187 148.991 183.932C148.844 184.515 148.57 185.06 148.188 185.528C147.805 185.998 147.323 186.381 146.775 186.651C146.227 186.921 145.626 187.072 145.012 187.094C144.399 187.116 143.788 187.009 143.221 186.778C123.406 178.825 107.545 175.316 100.914 180.98C83.305 195.978 118.315 256.126 130.175 275.304C130.492 275.816 130.692 276.391 130.76 276.987C130.829 277.582 130.765 278.186 130.573 278.755C130.381 279.325 130.065 279.847 129.647 280.286C129.228 280.725 128.718 281.07 128.15 281.298C108.384 289.359 94.6306 297.834 94.0272 306.424C92.439 329.192 160.74 347.544 183.01 352.916C183.605 353.061 184.16 353.33 184.64 353.704C185.118 354.077 185.509 354.548 185.785 355.083C186.061 355.618 186.215 356.205 186.237 356.803C186.26 357.402 186.151 357.998 185.916 358.551C177.773 377.905 174.181 393.398 179.979 399.874C195.334 417.074 256.921 382.877 276.556 371.293C277.081 370.984 277.67 370.789 278.28 370.722C278.889 370.655 279.507 370.717 280.09 370.905C280.673 371.093 281.207 371.402 281.657 371.81C282.106 372.219 282.46 372.717 282.694 373.271C290.947 392.578 299.616 406.012 308.417 406.601C331.728 408.153 350.516 341.44 356.009 319.688C356.157 319.106 356.432 318.562 356.816 318.094C357.2 317.625 357.682 317.243 358.231 316.974C358.779 316.705 359.381 316.554 359.995 316.533C360.608 316.511 361.219 316.619 361.786 316.85C381.601 324.803 397.455 328.304 404.093 322.648C421.702 307.65 386.684 247.495 374.825 228.317C374.51 227.804 374.312 227.229 374.245 226.634C374.177 226.039 374.242 225.436 374.434 224.868C374.626 224.299 374.941 223.777 375.358 223.338C375.775 222.899 376.284 222.552 376.85 222.323C396.623 214.261 410.376 205.786 410.973 197.196C412.568 174.428 344.26 156.078 321.997 150.712ZM295.254 128.885C299.734 136.73 276.646 189 259.474 225.561C259.186 226.172 258.715 226.682 258.121 227.024C257.528 227.365 256.842 227.521 256.155 227.47C255.468 227.419 254.814 227.164 254.28 226.739C253.746 226.314 253.358 225.739 253.169 225.093C246.234 201.322 238.306 173.392 229.824 149.683C229.491 148.752 229.508 147.736 229.871 146.817C230.235 145.897 230.921 145.133 231.808 144.662C252.989 133.363 289.234 118.358 295.254 128.885ZM193.746 135.355C202.589 137.807 224.103 190.714 238.424 228.426C238.664 229.056 238.699 229.742 238.527 230.393C238.354 231.044 237.983 231.627 237.461 232.065C236.939 232.503 236.292 232.775 235.608 232.844C234.923 232.913 234.234 232.775 233.632 232.45C211.501 220.453 185.694 206.159 162.529 195.253C161.622 194.823 160.901 194.093 160.493 193.192C160.085 192.292 160.018 191.279 160.303 190.335C167.12 167.736 181.865 132.069 193.746 135.355ZM126.652 210.04C134.676 205.664 188.197 228.216 225.621 244.989C226.248 245.269 226.771 245.73 227.12 246.31C227.47 246.889 227.629 247.56 227.577 248.23C227.524 248.901 227.264 249.54 226.828 250.062C226.393 250.582 225.805 250.962 225.143 251.147C200.813 257.921 172.211 265.664 147.937 273.949C146.985 274.272 145.946 274.255 145.007 273.9C144.067 273.545 143.286 272.876 142.805 272.011C131.257 251.322 115.867 215.92 126.652 210.04ZM133.275 309.188C135.779 300.551 189.952 279.537 228.562 265.548C229.207 265.315 229.91 265.28 230.576 265.448C231.243 265.617 231.84 265.98 232.288 266.49C232.736 266.999 233.015 267.631 233.085 268.299C233.155 268.968 233.015 269.641 232.682 270.23C220.392 291.846 205.758 317.053 194.592 339.672C194.156 340.561 193.409 341.269 192.486 341.668C191.563 342.068 190.525 342.134 189.557 341.853C166.42 335.235 129.905 320.792 133.275 309.188ZM209.739 374.722C205.252 366.884 228.347 314.608 245.519 278.054C245.806 277.442 246.279 276.931 246.872 276.59C247.465 276.249 248.151 276.093 248.838 276.144C249.525 276.194 250.179 276.45 250.713 276.875C251.247 277.3 251.634 277.874 251.824 278.521C258.759 302.285 266.686 330.222 275.169 353.932C275.499 354.862 275.481 355.877 275.117 356.795C274.752 357.713 274.064 358.475 273.178 358.945C252.004 370.223 215.752 385.256 209.76 374.722H209.739ZM311.247 368.252C302.397 365.807 280.883 312.894 266.562 275.182C266.322 274.55 266.285 273.862 266.458 273.21C266.63 272.559 267.003 271.974 267.526 271.536C268.049 271.097 268.697 270.826 269.382 270.758C270.068 270.69 270.759 270.83 271.361 271.157C293.485 283.154 319.299 297.455 342.457 308.362C343.366 308.789 344.089 309.519 344.497 310.42C344.905 311.321 344.971 312.335 344.683 313.28C337.872 335.912 323.128 371.544 311.247 368.252ZM378.341 293.566C370.31 297.949 316.795 2Line truncated
|
||||
</g>
|
||||
</svg><style>@media (prefers-color-scheme: light) { :root { filter: none; } }
|
||||
@media (prefers-color-scheme: dark) { :root { filter: none; } }
|
||||
</style></svg>
|
||||
|
After Width: | Height: | Size: 6.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg width="200" height="200" version="1.1" xmlns="http://www.w3.org/2000/svg" desc="Created with imagetracer.js version 1.2.6" ><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="1" d="M 0 0 L 200 0 L 200 200 L 0 200 L 0 0 Z M 123 9 L 123 10 L 125 10 L 123 9 Z M 136 9 L 136 10 L 139 10 L 136 9 Z M 141 10 L 141 13 L 142 13 Q 143 9 141 10 Z M 77 11 L 78 13 L 79 13 L 77 11 Z M 68 12 L 64 14 L 51 32 L 50 37 Q 51 39 49 38 L 49 40 Q 50 43 48 42 L 48 44 L 48 45 L 47 44 L 45 43 L 46 46 L 46 48 Q 47 52 44 51 L 45 54 L 42 56 L 44 57 L 42 58 L 44 58 L 42 61 L 43 62 L 41 63 L 31 58 L 29 59 L 29 57 L 25 58 L 23 58 L 21 57 L 19 58 Q 13 56 14 60 L 17 59 L 13 64 L 13 66 L 15 78 L 17 82 L 16 84 L 18 84 L 17 86 L 21 92 L 20 94 L 22 93 L 21 95 L 27 105 L 27 107 L 28 109 L 30 108 L 29 110 L 33 115 L 31 116 L 29 116 L 28 118 L 16 123 L 16 125 L 14 125 L 13 129 L 13 131 L 12 134 L 14 137 L 23 143 Q 24 146 26 144 L 27 147 L 29 146 L 31 147 Q 33 146 32 149 L 34 148 L 36 150 L 46 152 Q 47 155 49 153 L 57 157 L 59 156 L 63 159 L 61 166 Q 57 167 60 169 L 59 169 L 59 171 L 57 175 L 58 177 L 56 178 L 58 178 L 57 181 L 59 182 L 56 183 L 66 187 L 76 186 L 79 184 Q 80 186 82 183 L 84 184 L 84 182 L 87 183 L 86 182 L 99 176 L 101 176 L 101 175 Q 102 172 104 174 L 105 172 L 106 174 L 106 173 L 110 170 Q 112 171 111 168 L 114 169 L 115 167 L 117 171 L 116 173 L 118 172 L 117 174 L 119 174 L 121 182 L 124 183 L 123 185 L 125 184 L 124 188 L 127 188 L 127 186 L 129 188 Q 128 190 131 189 L 131 187 L 134 188 L 135 186 L 136 188 L 141 181 Q 143 182 142 180 L 142 178 L 144 175 L 147 172 L 146 171 L 150 168 L 148 167 Q 147 164 150 165 L 149 164 L 150 160 L 152 160 L 151 157 L 153 157 L 152 155 Q 155 153 153 152 L 155 146 L 157 146 L 155 145 L 157 141 L 157 139 Q 156 136 159 137 L 162 138 Q 165 137 164 140 L 166 139 L 175 142 Q 178 141 177 144 L 178 144 Q 177 141 180 142 L 182 142 L 184 141 L 185 142 L 184 140 L 186 136 L 186 134 L 187 130 L 184 119 L 180 112 L 183 111 L 179 109 L 180 107 Q 181 104 178 105 L 173 97 L 174 95 L 170 92 L 173 93 L 174 92 L 169 90 L 167 87 L 168 85 L 170 85 L 170 84 Q 171 81 173 83 Q 175 84 174 81 L 184 76 Q 186 71 189 75 L 189 74 Q 185 72 188 71 L 187 68 L 189 68 L 187 67 L 183 59 L 178 56 Q 174 57 175 55 L 174 55 L 161 49 L 158 49 Q 159 46 157 47 L 155 47 Q 151 48 152 46 L 151 46 L 143 43 L 142 44 L 137 42 L 138 37 L 141 33 L 140 31 L 142 31 L 141 29 L 143 23 L 141 20 L 142 18 Q 139 12 130 13 L 128 13 L 125 15 L 123 14 L 120 15 L 122 16 L 119 16 L 117 16 L 115 17 Q 113 20 112 18 Q 110 23 104 22 Q 102 25 101 23 L 100 25 Q 97 29 91 28 L 90 31 L 88 30 L 88 32 L 86 32 L 84 32 L 84 28 L 83 28 L 83 27 L 81 26 L 80 23 Q 76 21 79 20 L 78 19 L 72 12 L 70 13 L 68 12 Z M 97 17 L 97 19 L 99 18 L 97 17 Z M 108 17 L 106 19 L 108 19 L 108 17 Z M 98 20 L 98 22 L 100 21 L 98 20 Z M 52 24 L 50 26 L 52 27 L 52 24 Z M 89 28 L 90 30 Q 91 27 89 28 Z M 141 35 L 141 38 L 142 38 Q 143 34 141 35 Z M 144 37 L 143 40 L 144 40 L 144 37 Z M 144 41 L 144 42 L 146 42 L 144 41 Z M 154 45 L 154 46 L 156 46 L 154 45 Z M 45 46 L 44 49 L 45 49 L 45 46 Z M 175 49 L 174 51 L 176 52 L 175 49 Z M 172 52 L 172 53 L 174 53 L 172 52 Z M 32 57 L 33 59 Q 34 56 32 57 Z M 188 57 L 188 58 L 190 58 L 188 57 Z M 37 58 L 34 60 L 38 60 L 37 58 Z M 11 60 L 10 63 L 12 63 L 11 60 Z M 186 60 L 185 62 L 187 63 L 186 60 Z M 190 66 L 190 68 L 192 67 L 190 66 Z M 13 70 L 12 73 L 13 73 L 13 70 Z M 185 75 L 185 77 L 187 76 L 185 75 Z M 10 76 L 11 78 Q 12 75 10 76 Z M 191 76 L 189 78 L 190 80 L 191 78 L 191 76 Z M 185 78 L 186 80 Q 187 77 185 78 Z M 19 90 L 18 93 L 19 93 L 19 90 Z M 18 96 L 17 99 L 18 99 L 18 96 Z M 21 96 L 20 99 L 22 99 L 21 96 Z M 19 100 L 20 102 Q 21 99 19 100 Z M 22 102 L 22 103 L 24 103 L 22 102 Z M 183 104 L 182 107 Q 179 106 180 109 L 183 108 L 183 104 Z M 28 109 Q 26 112 29 111 L 28 109 Z M 31 112 L 29 114 L 31 114 L 31 112 Z M 186 121 L 187 123 Q 188 120 186 121 Z M 14 123 L 12 125 L 14 125 L 14 123 Z M 191 130 L 190 134 L 191 134 L 191 130 Z M 11 134 L 9 139 L 11 139 L 12 140 L 11 134 Z M 189 135 L 187 137 L 189 137 L 189 135 Z M 191 137 L 189 139 L 191 139 L 191 137 Z M 162 139 L 163 141 Q 164 138 162 139 Z M 16 141 L 16 142 L 19 142 L 16 141 Z M 161 142 L 161 144 L 163 143 L 161 142 Z M 25 146 L 25 148 Q 24 150 27 149 L 26 148 Q 27 145 25 146 Z M 156 148 L 156 150 L 158 149 L 156 148 Z M 28 149 L 26 151 L 28 151 L 28 149 Z M 30 149 L 30 150 L 32 150 L 30 149 Z M 42 152 L 41 155 L 43 155 L 42 152 Z M 46 155 L 46 156 L 48 156 L 46 155 Z M 51 156 L 52 158 Q 53 155 51 156 Z M 156 156 L 155 158 L 153 159 L 155 159 L 156 160 L 156 156 Z M 159 156 L 157 160 L 159 159 L 159 156 Z M 47 157 L 47 158 L 49 158 L 47 157 Z M 59 157 Q 57 160 60 159 L 59 157 Z M 59 162 Q 57 165 60 164 L 59 162 Z M 149 169 L 148 171 L 150 170 L 149 169 Z M 111 173 L 112 175 Q 113 172 111 173 Z M 140 184 L 139 186 L 138 188 L 140 187 L 140 184 Z M 143 184 L 142 187 L 143 187 L 143 184 Z M 122 185 L 122 188 L 124 187 L 122 185 Z M 71 187 L 71 189 L 73 188 Line truncated
|
||||
|
After Width: | Height: | Size: 83 KiB |
@@ -0,0 +1 @@
|
||||
<svg width="3370" height="3370" version="1.1" xmlns="http://www.w3.org/2000/svg" desc="Created with imagetracer.js version 1.2.6" ><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0" d="M 0 0 L 3370 0 L 3370 3370 L 0 3370 L 0 0 Z M 739 610 L 715 655 L 685 724 L 665 781 L 654 823 L 654 827 L 673 850 L 741 924 Q 794 979 856 1026 L 858 1029 L 747 976 L 627 915 L 624 915 Q 622 920 623 928 L 622 929 L 622 938 L 621 939 L 620 970 L 619 971 L 619 1056 L 620 1057 L 620 1079 L 621 1080 L 621 1096 L 622 1097 L 624 1135 L 625 1136 L 626 1155 L 627 1156 Q 626 1164 628 1168 L 693 1195 L 752 1217 L 823 1240 L 886 1257 L 912 1262 L 913 1264 L 861 1274 L 834 1277 L 833 1278 L 817 1279 L 816 1280 L 796 1281 L 795 1282 L 771 1283 L 770 1284 L 754 1284 L 753 1285 L 732 1285 L 731 1286 L 651 1286 L 665 1335 L 687 1393 L 716 1456 L 742 1506 L 745 1508 L 752 1510 L 816 1521 L 848 1524 L 849 1525 L 858 1525 L 859 1526 L 869 1526 L 870 1527 L 896 1528 L 897 1529 L 916 1529 L 917 1530 L 973 1530 L 974 1529 L 989 1529 L 990 1528 L 1008 1527 L 1015 1525 L 1018 1526 L 802 1602 Q 870 1689 948 1768 L 1031 1848 L 1258 1729 Q 1318 1695 1376 1658 L 1378 1657 Q 1275 1739 1181 1830 Q 1112 1897 1052 1973 L 1004 2040 Q 983 2069 965 2103 L 947 2139 L 930 2178 L 895 2269 L 851 2396 L 851 2399 L 819 2495 L 813 2519 L 814 2537 L 821 2553 Q 830 2565 848 2569 L 867 2569 L 872 2568 L 1029 2517 L 1152 2473 L 1240 2437 Q 1293 2413 1339 2381 L 1409 2331 L 1469 2280 L 1559 2380 Q 1618 2442 1683 2500 L 1747 2555 L 1780 2580 L 1856 2366 L 1857 2366 L 1855 2376 L 1855 2384 L 1854 2385 L 1853 2411 L 1852 2412 L 1852 2464 L 1853 2465 L 1853 2485 L 1854 2486 L 1854 2500 L 1855 2501 L 1856 2523 L 1857 2524 L 1858 2543 L 1859 2544 L 1859 2551 L 1860 2552 L 1860 2559 L 1865 2588 L 1865 2594 L 1874 2638 L 1886 2645 L 1927 2666 L 1990 2695 L 2045 2716 L 2096 2731 L 2096 2655 L 2097 2654 L 2097 2632 L 2098 2631 L 2098 2615 L 2099 2614 L 2100 2589 L 2101 2588 L 2103 2559 L 2104 2558 L 2104 2551 L 2109 2522 L 2109 2516 L 2119 2469 L 2120 2471 L 2127 2505 L 2142 2560 L 2165 2631 L 2187 2690 L 2214 2754 Q 2219 2756 2227 2755 L 2228 2756 L 2236 2756 L 2237 2757 L 2246 2757 L 2247 2758 L 2284 2760 L 2285 2761 L 2301 2761 L 2302 2762 L 2323 2762 L 2324 2763 L 2415 2763 L 2416 2762 L 2432 2762 L 2433 2761 L 2455 2760 L 2468 2758 L 2411 2646 L 2354 2527 L 2355 2525 Q 2394 2576 2439 2622 Q 2494 2678 2556 2728 L 2561 2728 L 2592 2720 L 2654 2699 L 2724 2669 L 2773 2644 L 2564 2471 L 2527 2438 Q 2468 2383 2418 2321 L 2377 2266 L 2351 2227 L 2314 2166 L 2280 2117 Q 2239 2062 2193 2013 Q 2132 1947 2060 1893 L 1988 1843 L 1915 1801 L 1902 1792 Q 1885 1779 1875 1760 L 1868 1742 L 1865 1727 L 1865 1709 L 1868 1695 L 1874 1681 L 1885 1665 Q 2000 1519 2124 1383 Q 2144 1361 2169 1344 L 2267 1275 L 2321 1233 Q 2351 1204 2374 1168 L 2390 1135 Q 2396 1119 2399 1102 L 2399 1097 L 2395 1086 L 2380 1056 Q 2364 1029 2344 1008 L 2334 996 L 2343 997 L 2356 1001 L 2377 1011 Q 2403 1027 2426 1047 L 2493 940 L 2497 927 Q 2496 912 2489 904 L 2473 889 L 2459 885 L 2451 886 L 2443 889 L 2295 982 L 2281 983 L 2263 987 Q 2240 994 2222 1004 Q 2192 1020 2169 1042 Q 2144 1064 2125 1092 L 2047 1202 L 2015 1243 L 1983 1274 L 1921 1329 L 1765 1460 L 1707 1505 L 1691 1513 L 1674 1517 L 1656 1517 L 1641 1514 Q 1619 1508 1605 1495 L 1584 1473 L 1541 1398 L 1501 1339 Q 1460 1282 1413 1233 Q 1356 1172 1291 1121 L 1232 1078 L 1156 1031 L 1096 990 Q 1042 951 995 906 Q 954 868 918 827 L 742 613 L 739 610 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0" d="M 1380.5 1654 L 1379.5 1656 L 1380.5 1654 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 738.5 610 L 742 612.5 L 807 691.5 L 802 687.5 L 739.5 611 Q 737.3 610.3 738 612.5 L 736 613.5 L 738.5 610 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 733.5 619 L 733 620.5 L 715.5 656 L 715 654.5 L 733.5 619 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 712.5 661 L 713 662.5 L 708.5 671 L 708 669.5 L 712.5 661 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 706.5 674 L 707 675.5 L 703.5 682 L 703 680.5 L 706.5 674 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 702.5 683 L 703 684.5 L 700.5 689 L 700 687.5 L 702.5 683 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 698.5 692 L 699 693.5 L 697.5 696 L 697 694.5 L 698.5 692 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 807.5 693 L 821 708.5 L 816 704.5 L 807.5 693 Z " /><path fill="rgb(255,255,255)" stroke="rgb(255,255,255)" stroke-width="1" opacity="0.4980392156862745" d="M 695.5 699 L 696 700.5 L 694.5 703 L 694 701.5 L 6Line truncated
|
||||
|
After Width: | Height: | Size: 128 KiB |
@@ -0,0 +1 @@
|
||||
<svg width="3370" height="3370" version="1.1" xmlns="http://www.w3.org/2000/svg" desc="Created with imagetracer.js version 1.2.6" ><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0" d="M 0 0 L 3370 0 L 3370 3370 L 0 3370 L 0 0 Z M 739 610 Q 707 668 682 733 L 667 776 L 654 824 L 655 828 L 671 847 L 729 911 Q 788 974 858 1027 L 861 1031 L 748 977 L 624 915 L 623 931 L 622 932 L 622 942 L 621 943 L 620 980 L 619 981 L 620 1071 L 621 1072 L 621 1090 L 622 1091 L 623 1119 L 624 1120 L 624 1130 L 625 1131 L 625 1141 L 626 1142 L 628 1167 L 662 1182 L 762 1220 L 849 1247 L 892 1258 L 914 1262 L 915 1264 L 857 1275 L 829 1278 L 828 1279 L 820 1279 L 819 1280 L 811 1280 L 810 1281 L 801 1281 L 800 1282 L 761 1284 L 760 1285 L 741 1285 L 740 1286 L 654 1287 L 652 1287 L 652 1291 L 656 1305 L 671 1351 L 687 1392 L 716 1455 L 742 1505 L 746 1508 L 754 1510 L 811 1520 L 842 1523 L 843 1524 L 852 1524 L 853 1525 L 862 1525 L 863 1526 L 873 1526 L 874 1527 L 902 1528 L 903 1529 L 927 1529 L 928 1530 L 984 1529 L 985 1528 L 996 1528 L 997 1527 L 1012 1526 L 1019 1524 L 1022 1525 L 803 1602 L 813 1617 L 851 1662 L 937 1756 L 1011 1829 L 1031 1847 L 1037 1845 L 1084 1819 L 1259 1728 Q 1322 1692 1383 1653 L 1385 1652 Q 1285 1732 1193 1819 Q 1119 1889 1055 1970 L 1001 2045 L 966 2102 Q 948 2135 933 2172 L 889 2287 L 828 2468 L 828 2471 L 815 2510 L 814 2523 L 813 2524 L 814 2535 L 817 2545 L 824 2556 Q 833 2566 849 2569 L 865 2569 L 874 2567 L 1016 2521 L 1151 2473 L 1239 2437 Q 1295 2411 1344 2377 L 1407 2332 L 1467 2281 L 1470 2280 Q 1521 2341 1577 2398 Q 1630 2453 1688 2504 L 1744 2552 L 1777 2578 L 1780 2579 L 1857 2361 L 1858 2361 L 1856 2378 L 1855 2379 L 1855 2387 L 1854 2388 L 1853 2422 L 1852 2423 L 1853 2478 L 1854 2479 L 1854 2495 L 1855 2496 L 1857 2530 L 1858 2531 L 1859 2548 L 1860 2549 L 1864 2585 L 1874 2637 L 1887 2645 L 1928 2666 L 1996 2697 L 2068 2723 L 2092 2730 L 2096 2730 L 2096 2724 L 2095 2723 L 2096 2645 L 2097 2644 L 2097 2625 L 2098 2624 L 2098 2609 L 2099 2608 L 2101 2574 L 2102 2573 L 2103 2556 L 2104 2555 L 2104 2548 L 2105 2547 L 2110 2508 L 2118 2472 Q 2117 2467 2120 2468 L 2132 2523 L 2151 2588 Q 2179 2674 2214 2753 L 2216 2754 Q 2220 2753 2222 2755 L 2250 2757 L 2251 2758 L 2290 2760 L 2291 2761 L 2309 2761 L 2310 2762 L 2335 2762 L 2336 2763 L 2405 2763 L 2406 2762 L 2441 2761 L 2442 2760 L 2452 2760 L 2453 2759 L 2467 2758 Q 2408 2644 2353 2524 L 2353 2522 Q 2388 2568 2428 2610 Q 2488 2673 2557 2728 L 2604 2716 L 2653 2699 Q 2716 2675 2772 2644 L 2561 2469 L 2519 2431 Q 2457 2372 2405 2305 L 2355 2234 Q 2323 2177 2286 2126 Q 2246 2069 2199 2020 Q 2136 1952 2062 1895 L 1992 1846 L 1909 1798 L 1899 1790 Q 1884 1778 1875 1761 L 1869 1747 L 1865 1730 L 1865 1706 L 1867 1697 Q 1872 1679 1883 1667 Q 1994 1525 2114 1393 Q 2133 1370 2158 1352 Q 2211 1311 2269 1273 Q 2299 1252 2327 1227 Q 2356 1198 2377 1162 L 2391 1131 L 2399 1100 L 2392 1080 L 2377 1052 L 2361 1029 Q 2348 1011 2332 997 L 2332 995 L 2352 999 L 2376 1010 Q 2403 1026 2426 1046 L 2487 949 L 2496 931 L 2496 919 L 2490 906 L 2477 892 L 2464 886 L 2452 886 L 2444 889 L 2294 983 L 2277 984 L 2261 988 Q 2240 994 2223 1004 Q 2189 1023 2162 1049 Q 2141 1070 2124 1094 L 2049 1200 L 2018 1240 Q 1985 1275 1948 1306 L 1778 1450 L 1703 1508 Q 1691 1514 1677 1517 L 1653 1517 L 1639 1514 Q 1617 1507 1602 1493 Q 1591 1484 1583 1472 L 1543 1402 L 1499 1337 Q 1451 1271 1395 1215 Q 1347 1166 1293 1123 L 1240 1084 Q 1196 1054 1149 1027 L 1094 989 Q 1037 947 987 899 Q 952 866 920 830 L 739 610 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 738.5 610 L 742.5 615 L 738.5 610 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 744.5 617 L 747.5 621 L 744.5 617 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 734.5 618 L 734 619.5 L 732.5 622 L 733 620.5 L 734.5 618 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 749.5 623 L 752.5 627 L 749.5 623 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 754.5 629 L 756.5 632 L 754.5 629 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 758.5 634 L 761.5 638 L 758.5 634 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 763.5 640 L 766.5 644 L 763.5 640 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 768.5 646 L 770.5 649 L 768.5 646 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 772.5 651 L 775.5 655 L 772.5 651 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" opacity="0.7529411764705882" d="M 716.5 653 L 717 654.5 L 715.5 657 L 715 655.5 L 716.5 653 Z " /><path fill="rgb(0,0,0)" stroke="rgb(0,0,0)" stroke-width="1" oLine truncated
|
||||
|
After Width: | Height: | Size: 155 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
|
||||
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" fill="#FFFFFF"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
|
||||
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" fill="#10A37F"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -1976,6 +1976,43 @@
|
||||
"tags": ["Projects"],
|
||||
"x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }],
|
||||
"x-oauth-scope": "projects:write"
|
||||
},
|
||||
"patch": {
|
||||
"operationId": "v1-update-a-project",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": { "schema": { "$ref": "#/components/schemas/V1UpdateProjectBody" } }
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/V1ProjectRefResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"401": { "description": "Unauthorized" },
|
||||
"403": { "description": "Forbidden action" },
|
||||
"429": { "description": "Rate limit exceeded" },
|
||||
"500": { "description": "Failed to update project" }
|
||||
},
|
||||
"security": [{ "bearer": [] }],
|
||||
"summary": "Updates the given project",
|
||||
"tags": ["Projects"],
|
||||
"x-badges": [{ "name": "OAuth scope: projects:write", "position": "after" }],
|
||||
"x-oauth-scope": "projects:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/secrets": {
|
||||
@@ -3181,6 +3218,65 @@
|
||||
"x-oauth-scope": "auth:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/config/realtime": {
|
||||
"get": {
|
||||
"operationId": "v1-get-realtime-config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Gets project's realtime configuration",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/RealtimeConfigResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"401": { "description": "Unauthorized" },
|
||||
"403": { "description": "Forbidden action" },
|
||||
"429": { "description": "Rate limit exceeded" }
|
||||
},
|
||||
"security": [{ "bearer": [] }],
|
||||
"summary": "Gets realtime configuration",
|
||||
"tags": ["Realtime Config"]
|
||||
},
|
||||
"patch": {
|
||||
"operationId": "v1-update-realtime-config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/UpdateRealtimeConfigBody" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"204": { "description": "" },
|
||||
"401": { "description": "Unauthorized" },
|
||||
"403": { "description": "Forbidden action" },
|
||||
"429": { "description": "Rate limit exceeded" }
|
||||
},
|
||||
"security": [{ "bearer": [] }],
|
||||
"summary": "Updates realtime configuration",
|
||||
"tags": ["Realtime Config"]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/config/auth/third-party-auth": {
|
||||
"post": {
|
||||
"operationId": "v1-create-project-tpa-integration",
|
||||
@@ -4192,6 +4288,39 @@
|
||||
"x-oauth-scope": "database:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/query/read-only": {
|
||||
"post": {
|
||||
"description": "All entity references must be schema qualified.",
|
||||
"operationId": "v1-read-only-query",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": { "schema": { "$ref": "#/components/schemas/V1ReadOnlyQueryBody" } }
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"201": { "description": "" },
|
||||
"401": { "description": "Unauthorized" },
|
||||
"403": { "description": "Forbidden action" },
|
||||
"429": { "description": "Rate limit exceeded" },
|
||||
"500": { "description": "Failed to run read-only sql query" }
|
||||
},
|
||||
"security": [{ "bearer": [] }],
|
||||
"summary": "[Beta] Run a sql query as supabase_read_only_user",
|
||||
"tags": ["Database"],
|
||||
"x-badges": [{ "name": "OAuth scope: database:read", "position": "after" }],
|
||||
"x-oauth-scope": "database:read"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/webhooks/enable": {
|
||||
"post": {
|
||||
"operationId": "v1-enable-database-webhook",
|
||||
@@ -4252,6 +4381,47 @@
|
||||
"x-oauth-scope": "projects:read"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/password": {
|
||||
"patch": {
|
||||
"operationId": "v1-update-database-password",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": { "minLength": 20, "maxLength": 20, "pattern": "^[a-z]+$", "type": "string" }
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/V1UpdatePasswordBody" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": { "$ref": "#/components/schemas/V1UpdatePasswordResponse" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"401": { "description": "Unauthorized" },
|
||||
"403": { "description": "Forbidden action" },
|
||||
"429": { "description": "Rate limit exceeded" },
|
||||
"500": { "description": "Failed to update database password" }
|
||||
},
|
||||
"security": [{ "bearer": [] }],
|
||||
"summary": "Updates the database password",
|
||||
"tags": ["Database"],
|
||||
"x-badges": [{ "name": "OAuth scope: database:write", "position": "after" }],
|
||||
"x-oauth-scope": "database:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/jit": {
|
||||
"get": {
|
||||
"description": "Mappings of roles a user can assume in the project database",
|
||||
@@ -6772,6 +6942,11 @@
|
||||
},
|
||||
"required": ["id", "ref", "name"]
|
||||
},
|
||||
"V1UpdateProjectBody": {
|
||||
"type": "object",
|
||||
"properties": { "name": { "type": "string", "minLength": 1, "maxLength": 256 } },
|
||||
"required": ["name"]
|
||||
},
|
||||
"SecretResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -7231,8 +7406,22 @@
|
||||
},
|
||||
"icebergCatalog": {
|
||||
"type": "object",
|
||||
"properties": { "enabled": { "type": "boolean" } },
|
||||
"required": ["enabled"]
|
||||
"properties": {
|
||||
"enabled": { "type": "boolean" },
|
||||
"maxNamespaces": { "type": "integer", "minimum": 0 },
|
||||
"maxTables": { "type": "integer", "minimum": 0 },
|
||||
"maxCatalogs": { "type": "integer", "minimum": 0 }
|
||||
},
|
||||
"required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"]
|
||||
},
|
||||
"vectorBuckets": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": { "type": "boolean" },
|
||||
"maxBuckets": { "type": "integer", "minimum": 0 },
|
||||
"maxIndexes": { "type": "integer", "minimum": 0 }
|
||||
},
|
||||
"required": ["enabled", "maxBuckets", "maxIndexes"]
|
||||
}
|
||||
},
|
||||
"required": ["imageTransformation", "s3Protocol"]
|
||||
@@ -7286,8 +7475,22 @@
|
||||
},
|
||||
"icebergCatalog": {
|
||||
"type": "object",
|
||||
"properties": { "enabled": { "type": "boolean" } },
|
||||
"required": ["enabled"]
|
||||
"properties": {
|
||||
"enabled": { "type": "boolean" },
|
||||
"maxNamespaces": { "type": "integer", "minimum": 0 },
|
||||
"maxTables": { "type": "integer", "minimum": 0 },
|
||||
"maxCatalogs": { "type": "integer", "minimum": 0 }
|
||||
},
|
||||
"required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"]
|
||||
},
|
||||
"vectorBuckets": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": { "type": "boolean" },
|
||||
"maxBuckets": { "type": "integer", "minimum": 0 },
|
||||
"maxIndexes": { "type": "integer", "minimum": 0 }
|
||||
},
|
||||
"required": ["enabled", "maxBuckets", "maxIndexes"]
|
||||
}
|
||||
},
|
||||
"required": ["imageTransformation", "s3Protocol"]
|
||||
@@ -7460,6 +7663,11 @@
|
||||
"properties": {
|
||||
"api_max_request_duration": { "type": "integer", "nullable": true },
|
||||
"db_max_pool_size": { "type": "integer", "nullable": true },
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"disable_signup": { "type": "boolean", "nullable": true },
|
||||
"external_anonymous_users_enabled": { "type": "boolean", "nullable": true },
|
||||
"external_apple_additional_client_ids": { "type": "string", "nullable": true },
|
||||
@@ -7737,6 +7945,7 @@
|
||||
"required": [
|
||||
"api_max_request_duration",
|
||||
"db_max_pool_size",
|
||||
"db_max_pool_size_unit",
|
||||
"disable_signup",
|
||||
"external_anonymous_users_enabled",
|
||||
"external_apple_additional_client_ids",
|
||||
@@ -8296,6 +8505,11 @@
|
||||
"external_zoom_email_optional": { "type": "boolean", "nullable": true },
|
||||
"external_zoom_secret": { "type": "string", "nullable": true },
|
||||
"db_max_pool_size": { "type": "integer", "nullable": true },
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"api_max_request_duration": { "type": "integer", "nullable": true },
|
||||
"mfa_totp_enroll_enabled": { "type": "boolean", "nullable": true },
|
||||
"mfa_totp_verify_enabled": { "type": "boolean", "nullable": true },
|
||||
@@ -8320,6 +8534,148 @@
|
||||
"nimbus_oauth_client_secret": { "type": "string", "nullable": true }
|
||||
}
|
||||
},
|
||||
"RealtimeConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"private_only": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"description": "Whether to only allow private channels"
|
||||
},
|
||||
"connection_pool": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"nullable": true,
|
||||
"description": "Sets connection pool size for Realtime Authorization"
|
||||
},
|
||||
"max_concurrent_users": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of concurrent users rate limit"
|
||||
},
|
||||
"max_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of events per second rate per channel limit"
|
||||
},
|
||||
"max_bytes_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of bytes per second rate per channel limit"
|
||||
},
|
||||
"max_channels_per_client": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of channels per client rate limit"
|
||||
},
|
||||
"max_joins_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of joins per second rate limit"
|
||||
},
|
||||
"max_presence_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of presence events per second rate limit"
|
||||
},
|
||||
"max_payload_size_in_kb": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of payload size in KB rate limit"
|
||||
},
|
||||
"suspend": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"description": "Whether to suspend realtime"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"private_only",
|
||||
"connection_pool",
|
||||
"max_concurrent_users",
|
||||
"max_events_per_second",
|
||||
"max_bytes_per_second",
|
||||
"max_channels_per_client",
|
||||
"max_joins_per_second",
|
||||
"max_presence_events_per_second",
|
||||
"max_payload_size_in_kb",
|
||||
"suspend"
|
||||
]
|
||||
},
|
||||
"UpdateRealtimeConfigBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"private_only": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to only allow private channels"
|
||||
},
|
||||
"connection_pool": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"description": "Sets connection pool size for Realtime Authorization"
|
||||
},
|
||||
"max_concurrent_users": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"description": "Sets maximum number of concurrent users rate limit"
|
||||
},
|
||||
"max_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"description": "Sets maximum number of events per second rate per channel limit"
|
||||
},
|
||||
"max_bytes_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000000,
|
||||
"description": "Sets maximum number of bytes per second rate per channel limit"
|
||||
},
|
||||
"max_channels_per_client": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"description": "Sets maximum number of channels per client rate limit"
|
||||
},
|
||||
"max_joins_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"description": "Sets maximum number of joins per second rate limit"
|
||||
},
|
||||
"max_presence_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"description": "Sets maximum number of presence events per second rate limit"
|
||||
},
|
||||
"max_payload_size_in_kb": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"description": "Sets maximum number of payload size in KB rate limit"
|
||||
},
|
||||
"suspend": { "type": "boolean", "description": "Whether to suspend realtime" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"CreateThirdPartyAuthBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -8875,6 +9231,14 @@
|
||||
},
|
||||
"required": ["query"]
|
||||
},
|
||||
"V1ReadOnlyQueryBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query": { "type": "string", "minLength": 1 },
|
||||
"parameters": { "type": "array", "items": {} }
|
||||
},
|
||||
"required": ["query"]
|
||||
},
|
||||
"GetProjectDbMetadataResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -8901,6 +9265,16 @@
|
||||
},
|
||||
"required": ["databases"]
|
||||
},
|
||||
"V1UpdatePasswordBody": {
|
||||
"type": "object",
|
||||
"properties": { "password": { "type": "string", "minLength": 4 } },
|
||||
"required": ["password"]
|
||||
},
|
||||
"V1UpdatePasswordResponse": {
|
||||
"type": "object",
|
||||
"properties": { "message": { "type": "string" } },
|
||||
"required": ["message"]
|
||||
},
|
||||
"JitAccessResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -78,7 +78,7 @@ flags:
|
||||
name: --workdir <string>
|
||||
description: path to a Supabase project directory
|
||||
default_value: ''
|
||||
- id: "yes"
|
||||
- id: 'yes'
|
||||
name: --yes
|
||||
description: answer yes to all prompts
|
||||
default_value: 'false'
|
||||
|
||||
@@ -328,6 +328,12 @@
|
||||
"slug": "v1-patch-a-migration",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-read-only-query",
|
||||
"title": "Read only query",
|
||||
"slug": "v1-read-only-query",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-remove-a-read-replica",
|
||||
"title": "Remove a read replica",
|
||||
@@ -358,6 +364,12 @@
|
||||
"slug": "v1-setup-a-read-replica",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-update-database-password",
|
||||
"title": "Update database password",
|
||||
"slug": "v1-update-database-password",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-update-jit-access",
|
||||
"title": "Update jit access",
|
||||
@@ -778,6 +790,12 @@
|
||||
"slug": "v1-restore-a-project",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-update-a-project",
|
||||
"title": "Update a project",
|
||||
"slug": "v1-update-a-project",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-update-network-restrictions",
|
||||
"title": "Update network restrictions",
|
||||
@@ -792,6 +810,24 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"title": "Realtime Config",
|
||||
"items": [
|
||||
{
|
||||
"id": "v1-get-realtime-config",
|
||||
"title": "Get realtime config",
|
||||
"slug": "v1-get-realtime-config",
|
||||
"type": "operation"
|
||||
},
|
||||
{
|
||||
"id": "v1-update-realtime-config",
|
||||
"title": "Update realtime config",
|
||||
"slug": "v1-update-realtime-config",
|
||||
"type": "operation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"title": "Rest",
|
||||
|
||||
@@ -880,13 +880,6 @@
|
||||
"type": "category",
|
||||
"title": "Storage",
|
||||
"items": [
|
||||
{
|
||||
"id": "storageclient-constructor",
|
||||
"title": "Create a storage client",
|
||||
"slug": "storageclient-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "file-buckets",
|
||||
"isFunc": false,
|
||||
@@ -1027,6 +1020,34 @@
|
||||
"slug": "storage-from-list",
|
||||
"product": "storage",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"id": "storagefile-exists",
|
||||
"title": "Check if file exists",
|
||||
"slug": "storage-from-exists",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storagefile-info",
|
||||
"title": "Get file metadata",
|
||||
"slug": "storage-from-info",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storagefile-list-v2",
|
||||
"title": "List files (v2)",
|
||||
"slug": "storage-from-listv2",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storagefile-to-base64",
|
||||
"title": "Convert file to base64",
|
||||
"slug": "storage-from-tobase64",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1039,23 +1060,30 @@
|
||||
"type": "function",
|
||||
"items": [
|
||||
{
|
||||
"id": "storageanalyticsclient-createbucket",
|
||||
"id": "storageanalytics-from",
|
||||
"title": "Access an analytics bucket",
|
||||
"slug": "storageanalytics-from",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storageanalytics-createbucket",
|
||||
"title": "Create a new analytics bucket",
|
||||
"slug": "storageanalyticsclient-createbucket",
|
||||
"slug": "storageanalytics-createbucket",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storageanalyticsclient-listbuckets",
|
||||
"id": "storageanalytics-listbuckets",
|
||||
"title": "List analytics buckets",
|
||||
"slug": "storageanalyticsclient-listbuckets",
|
||||
"slug": "storageanalytics-listbuckets",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storageanalyticsclient-deletebucket",
|
||||
"id": "storageanalytics-deletebucket",
|
||||
"title": "Delete an analytics bucket",
|
||||
"slug": "storageanalyticsclient-deletebucket",
|
||||
"slug": "storageanalytics-deletebucket",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
}
|
||||
@@ -1070,249 +1098,109 @@
|
||||
"type": "function",
|
||||
"items": [
|
||||
{
|
||||
"id": "storagevectorsclient-constructor",
|
||||
"title": "Create a vectors client",
|
||||
"slug": "storagevectorsclient-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "storagevectorsclient-from",
|
||||
"id": "storagevectors-from",
|
||||
"title": "Access a vector bucket",
|
||||
"slug": "storagevectorsclient-from",
|
||||
"slug": "storagevectors-from",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketapi-constructor",
|
||||
"title": "Create a vector bucket API instance",
|
||||
"slug": "vectorbucketapi-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketapi-createbucket",
|
||||
"id": "storagevectors-create-bucket",
|
||||
"title": "Create a vector bucket",
|
||||
"slug": "vectorbucketapi-createbucket",
|
||||
"slug": "storagevectors-createbucket",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketapi-deletebucket",
|
||||
"id": "storagevectors-delete-bucket",
|
||||
"title": "Delete a vector bucket",
|
||||
"slug": "vectorbucketapi-deletebucket",
|
||||
"slug": "storagevectors-deletebucket",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketapi-getbucket",
|
||||
"id": "storagevectors-get-bucket",
|
||||
"title": "Retrieve a vector bucket",
|
||||
"slug": "vectorbucketapi-getbucket",
|
||||
"slug": "storagevectors-getbucket",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketapi-listbuckets",
|
||||
"id": "storagevectors-list-buckets",
|
||||
"title": "List all vector buckets",
|
||||
"slug": "vectorbucketapi-listbuckets",
|
||||
"slug": "storagevectors-listbuckets",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketapi-throwonerror",
|
||||
"title": "Enable error throwing",
|
||||
"slug": "vectorbucketapi-throwonerror",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketscope-constructor",
|
||||
"title": "Create a vector bucket scope",
|
||||
"slug": "vectorbucketscope-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketscope-createindex",
|
||||
"id": "vectorbucket-createindex",
|
||||
"title": "Create a vector index",
|
||||
"slug": "vectorbucketscope-createindex",
|
||||
"slug": "vectorbucket-createindex",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketscope-deleteindex",
|
||||
"id": "vectorbucket-deleteindex",
|
||||
"title": "Delete a vector index",
|
||||
"slug": "vectorbucketscope-deleteindex",
|
||||
"slug": "vectorbucket-deleteindex",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketscope-getindex",
|
||||
"id": "vectorbucket-getindex",
|
||||
"title": "Retrieve a vector index",
|
||||
"slug": "vectorbucketscope-getindex",
|
||||
"slug": "vectorbucket-getindex",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorbucketscope-listindexes",
|
||||
"id": "vectorbucket-listindexes",
|
||||
"title": "List all vector indexes",
|
||||
"slug": "vectorbucketscope-listindexes",
|
||||
"slug": "vectorbucket-listindexes",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vector-data",
|
||||
"isFunc": false,
|
||||
"title": "Vector Data",
|
||||
"slug": "vector-data",
|
||||
"product": "storage",
|
||||
"id": "vectorbucket-index",
|
||||
"title": "Access a vector index",
|
||||
"slug": "vectorbucket-index",
|
||||
"type": "function",
|
||||
"items": [
|
||||
{
|
||||
"id": "vectordataapi-constructor",
|
||||
"title": "Create a vector data API instance",
|
||||
"slug": "vectordataapi-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectordataapi-deletevectors",
|
||||
"title": "Delete vectors",
|
||||
"slug": "vectordataapi-deletevectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectordataapi-getvectors",
|
||||
"title": "Retrieve vectors",
|
||||
"slug": "vectordataapi-getvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectordataapi-listvectors",
|
||||
"title": "List all vectors",
|
||||
"slug": "vectordataapi-listvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectordataapi-putvectors",
|
||||
"title": "Insert or update vectors",
|
||||
"slug": "vectordataapi-putvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectordataapi-queryvectors",
|
||||
"title": "Query vectors",
|
||||
"slug": "vectordataapi-queryvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectordataapi-throwonerror",
|
||||
"title": "Enable error throwing",
|
||||
"slug": "vectordataapi-throwonerror",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
}
|
||||
]
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vector-index",
|
||||
"isFunc": false,
|
||||
"title": "Vector Index",
|
||||
"slug": "vector-index",
|
||||
"product": "storage",
|
||||
"id": "vectorindex-deletevectors",
|
||||
"title": "Delete vectors from index",
|
||||
"slug": "vectorindex-deletevectors",
|
||||
"type": "function",
|
||||
"items": [
|
||||
{
|
||||
"id": "vectorindexapi-constructor",
|
||||
"title": "Create a vector index API instance",
|
||||
"slug": "vectorindexapi-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "vectorindexapi-createindex",
|
||||
"title": "Create an index",
|
||||
"slug": "vectorindexapi-createindex",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexapi-deleteindex",
|
||||
"title": "Delete an index",
|
||||
"slug": "vectorindexapi-deleteindex",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexapi-getindex",
|
||||
"title": "Retrieve an index",
|
||||
"slug": "vectorindexapi-getindex",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexapi-listindexes",
|
||||
"title": "List all indexes",
|
||||
"slug": "vectorindexapi-listindexes",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexapi-throwonerror",
|
||||
"title": "Enable error throwing",
|
||||
"slug": "vectorindexapi-throwonerror",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexscope-constructor",
|
||||
"title": "Create a vector index scope",
|
||||
"slug": "vectorindexscope-constructor",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexscope-deletevectors",
|
||||
"title": "Delete vectors from index",
|
||||
"slug": "vectorindexscope-deletevectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexscope-getvectors",
|
||||
"title": "Retrieve vectors from index",
|
||||
"slug": "vectorindexscope-getvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexscope-listvectors",
|
||||
"title": "List vectors in index",
|
||||
"slug": "vectorindexscope-listvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexscope-putvectors",
|
||||
"title": "Add vectors to index",
|
||||
"slug": "vectorindexscope-putvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindexscope-queryvectors",
|
||||
"title": "Search vectors in index",
|
||||
"slug": "vectorindexscope-queryvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
}
|
||||
]
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindex-getvectors",
|
||||
"title": "Retrieve vectors from index",
|
||||
"slug": "vectorindex-getvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindex-listvectors",
|
||||
"title": "List vectors in index",
|
||||
"slug": "vectorindex-listvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindex-putvectors",
|
||||
"title": "Add vectors to index",
|
||||
"slug": "vectorindex-putvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
},
|
||||
{
|
||||
"id": "vectorindex-queryvectors",
|
||||
"title": "Search vectors in index",
|
||||
"slug": "vectorindex-queryvectors",
|
||||
"type": "function",
|
||||
"product": "storage"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 88,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -42,7 +42,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 89,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L89"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L89"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -61,7 +61,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 90,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L90"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -80,7 +80,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 91,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L91"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L91"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -99,7 +99,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 92,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L92"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L92"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -118,7 +118,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 93,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L93"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L93"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -137,7 +137,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 94,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L94"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L94"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -156,7 +156,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 95,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L95"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L95"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -175,7 +175,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 96,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L96"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L96"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -194,7 +194,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 97,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L97"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L97"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -213,7 +213,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 98,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L98"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L98"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -232,7 +232,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 99,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L99"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L99"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -251,7 +251,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 100,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L100"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L100"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -270,7 +270,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 101,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L101"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L101"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -289,7 +289,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 102,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L102"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L102"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -309,7 +309,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 87,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L87"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L87"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -339,7 +339,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 34,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -373,7 +373,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 34,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -416,7 +416,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 42,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L42"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L42"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -645,7 +645,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 41,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L41"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L41"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -682,7 +682,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 43,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L43"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L43"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -705,7 +705,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 40,
|
||||
"character": 7,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L40"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L40"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -735,7 +735,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 19,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L19"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L19"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -964,7 +964,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 17,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L17"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L17"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1000,7 +1000,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 18,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L18"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L18"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1023,7 +1023,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 16,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L16"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L16"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1042,7 +1042,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 75,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1076,7 +1076,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 75,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -1175,7 +1175,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 60,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1209,7 +1209,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 60,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1260,7 +1260,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 15,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L15"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L15"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1301,7 +1301,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 32,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L32"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1316,7 +1316,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 32,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L32"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1387,7 +1387,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1411,7 +1411,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 30,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L30"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L30"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1480,7 +1480,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 50,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L50"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L50"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1495,7 +1495,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 50,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L50"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L50"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1543,7 +1543,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1572,7 +1572,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 49,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L49"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L49"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1621,7 +1621,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 82,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L82"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L82"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1636,7 +1636,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 82,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L82"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L82"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1684,7 +1684,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1713,7 +1713,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 81,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L81"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L81"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1762,7 +1762,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 66,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L66"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1777,7 +1777,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 66,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L66"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1825,7 +1825,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1854,7 +1854,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 65,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L65"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1877,7 +1877,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 105,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L105"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L105"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1910,7 +1910,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 121,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L121"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L121"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2019,7 +2019,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 109,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L109"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L109"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2035,7 +2035,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 109,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L109"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L109"
|
||||
}
|
||||
],
|
||||
"indexSignatures": [
|
||||
@@ -2050,7 +2050,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 109,
|
||||
"character": 14,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L109"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L109"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -2096,7 +2096,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 113,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L113"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L113"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2146,7 +2146,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 117,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L117"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L117"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2177,7 +2177,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 132,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L132"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L132"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2211,7 +2211,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 137,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L137"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L137"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2231,7 +2231,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 105,
|
||||
"character": 36,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L105"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L105"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2248,7 +2248,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 16,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L16"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L16"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 88,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -42,7 +42,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 89,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L89"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L89"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -61,7 +61,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 90,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L90"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -80,7 +80,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 91,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L91"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L91"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -99,7 +99,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 92,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L92"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L92"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -118,7 +118,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 93,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L93"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L93"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -137,7 +137,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 94,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L94"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L94"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -156,7 +156,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 95,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L95"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L95"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -175,7 +175,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 96,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L96"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L96"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -194,7 +194,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 97,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L97"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L97"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -213,7 +213,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 98,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L98"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L98"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -232,7 +232,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 99,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L99"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L99"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -251,7 +251,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 100,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L100"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L100"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -270,7 +270,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 101,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L101"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L101"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -289,7 +289,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 102,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L102"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L102"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -309,7 +309,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 87,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L87"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L87"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -339,7 +339,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 34,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -373,7 +373,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 34,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L34"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -416,7 +416,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 42,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L42"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L42"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -645,7 +645,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 41,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L41"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L41"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -682,7 +682,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 43,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L43"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L43"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -705,7 +705,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 40,
|
||||
"character": 7,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L40"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L40"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -735,7 +735,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 19,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L19"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L19"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -964,7 +964,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 17,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L17"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L17"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1000,7 +1000,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 18,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L18"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L18"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1023,7 +1023,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 16,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L16"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L16"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1042,7 +1042,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 75,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1076,7 +1076,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 75,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L75"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -1175,7 +1175,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 60,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1209,7 +1209,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 60,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L60"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1260,7 +1260,7 @@
|
||||
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
|
||||
"line": 15,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/FunctionsClient.ts#L15"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/FunctionsClient.ts#L15"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1301,7 +1301,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 32,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L32"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1316,7 +1316,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 32,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L32"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1387,7 +1387,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1411,7 +1411,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 30,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L30"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L30"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1480,7 +1480,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 50,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L50"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L50"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1495,7 +1495,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 50,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L50"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L50"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1543,7 +1543,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1572,7 +1572,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 49,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L49"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L49"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1621,7 +1621,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 82,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L82"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L82"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1636,7 +1636,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 82,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L82"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L82"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1684,7 +1684,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1713,7 +1713,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 81,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L81"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L81"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1762,7 +1762,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 66,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L66"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -1777,7 +1777,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 66,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L66"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -1825,7 +1825,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 31,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L31"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L31"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1854,7 +1854,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 65,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L65"
|
||||
}
|
||||
],
|
||||
"extendedTypes": [
|
||||
@@ -1877,7 +1877,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 105,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L105"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L105"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -1910,7 +1910,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 121,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L121"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L121"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2019,7 +2019,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 109,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L109"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L109"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2035,7 +2035,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 109,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L109"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L109"
|
||||
}
|
||||
],
|
||||
"indexSignatures": [
|
||||
@@ -2050,7 +2050,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 109,
|
||||
"character": 14,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L109"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L109"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -2096,7 +2096,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 113,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L113"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L113"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2146,7 +2146,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 117,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L117"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L117"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2177,7 +2177,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 132,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L132"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L132"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2211,7 +2211,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 137,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L137"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L137"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -2231,7 +2231,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 105,
|
||||
"character": 36,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L105"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L105"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2248,7 +2248,7 @@
|
||||
"fileName": "packages/core/functions-js/src/types.ts",
|
||||
"line": 16,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/functions-js/src/types.ts#L16"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/functions-js/src/types.ts#L16"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
|
||||
@@ -22351,7 +22351,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 112,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -22385,7 +22385,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 112,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -22433,7 +22433,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22453,7 +22453,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22803,7 +22803,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22823,7 +22823,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 24,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22904,7 +22904,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 25,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22927,7 +22927,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 47,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22947,7 +22947,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 45,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22965,7 +22965,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 23,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23015,7 +23015,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 10,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23035,7 +23035,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23071,7 +23071,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 42,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23091,7 +23091,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 40,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23267,7 +23267,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 88,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23283,7 +23283,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 88,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -23298,7 +23298,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 88,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23349,7 +23349,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 73,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L73"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L73"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23375,7 +23375,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 81,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L81"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L81"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23402,7 +23402,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 87,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L87"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L87"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23424,7 +23424,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 86,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L86"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L86"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23653,7 +23653,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 83,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L83"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L83"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23679,7 +23679,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 90,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L90"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23713,7 +23713,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 74,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L74"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L74"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23737,7 +23737,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 80,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L80"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L80"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23763,7 +23763,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 84,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L84"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L84"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23822,7 +23822,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 78,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L78"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L78"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23848,7 +23848,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 85,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L85"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L85"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23869,7 +23869,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 82,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L82"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L82"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23903,7 +23903,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 114,
|
||||
"character": 14,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L114"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L114"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23932,7 +23932,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 113,
|
||||
"character": 14,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L113"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L113"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23951,7 +23951,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 194,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
}
|
||||
],
|
||||
"getSignature": {
|
||||
@@ -23973,7 +23973,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 194,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23998,7 +23998,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 308,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24021,7 +24021,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 308,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -24108,19 +24108,19 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 202,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
},
|
||||
{
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 206,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
},
|
||||
{
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 214,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L214"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L214"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24135,7 +24135,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 202,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -24237,7 +24237,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 206,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -24341,7 +24341,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 315,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24364,7 +24364,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 315,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24391,7 +24391,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 332,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24414,7 +24414,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 332,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24462,7 +24462,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 325,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24485,7 +24485,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 325,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -24554,7 +24554,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 261,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24577,7 +24577,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 261,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -24803,7 +24803,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 275,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L275"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L275"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24853,7 +24853,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 274,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L274"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L274"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24898,7 +24898,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 273,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L273"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L273"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24918,7 +24918,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 272,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L272"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L272"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25028,7 +25028,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 226,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -25051,7 +25051,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 226,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -25198,7 +25198,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 37,
|
||||
"character": 21,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L37"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L37"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -25278,7 +25278,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25298,7 +25298,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25768,7 +25768,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25788,7 +25788,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 24,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25869,7 +25869,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 25,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25892,7 +25892,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 47,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25912,7 +25912,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 45,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25930,7 +25930,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 23,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25970,7 +25970,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 10,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25990,7 +25990,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -26026,7 +26026,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 42,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -26046,7 +26046,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 40,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -42262,7 +42262,7 @@
|
||||
},
|
||||
{
|
||||
"id": 1408,
|
||||
"name": "redirect_uri",
|
||||
"name": "redirect_url",
|
||||
"variant": "declaration",
|
||||
"kind": 1024,
|
||||
"flags": {
|
||||
@@ -42272,7 +42272,7 @@
|
||||
"summary": [
|
||||
{
|
||||
"kind": "text",
|
||||
"text": "Redirect URI - present if user already consented (can be used to trigger immediate redirect)"
|
||||
"text": "Redirect URL - present if user already consented (can be used to trigger immediate redirect)"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -44279,7 +44279,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 118,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -44327,7 +44327,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 118,
|
||||
"character": 51,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -44347,7 +44347,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 118,
|
||||
"character": 49,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -44398,7 +44398,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 119,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L119"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L119"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -44428,7 +44428,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 117,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L117"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L117"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -51073,7 +51073,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 28,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -51123,7 +51123,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 111,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51139,7 +51139,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 111,
|
||||
"character": 16,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -51191,7 +51191,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 36,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51224,7 +51224,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 40,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L40"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L40"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51253,7 +51253,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 72,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L72"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L72"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51294,7 +51294,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 52,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L52"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L52"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51323,7 +51323,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 68,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L68"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L68"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51365,7 +51365,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 78,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L78"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L78"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51406,7 +51406,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 48,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L48"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L48"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51435,7 +51435,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 56,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L56"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L56"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51476,7 +51476,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 44,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L44"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51505,7 +51505,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 83,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L83"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L83"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51547,7 +51547,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 64,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L64"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L64"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51579,7 +51579,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 36,
|
||||
"character": 9,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -51614,7 +51614,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 32,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51639,7 +51639,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 33,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L33"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L33"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51662,7 +51662,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 32,
|
||||
"character": 7,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -51681,7 +51681,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 90,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51722,7 +51722,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 94,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L94"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L94"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51756,7 +51756,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L98"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L98"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51791,7 +51791,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 90,
|
||||
"character": 11,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -51818,7 +51818,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 88,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51841,7 +51841,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 89,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L89"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L89"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51866,7 +51866,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 28,
|
||||
"character": 48,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -52659,7 +52659,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 35,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L35"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L35"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -52674,7 +52674,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 35,
|
||||
"character": 28,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L35"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L35"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -52722,7 +52722,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 39,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L39"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L39"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -52742,7 +52742,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 39,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L39"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L39"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -59359,7 +59359,7 @@
|
||||
},
|
||||
"1408": {
|
||||
"sourceFileName": "../auth-js/src/lib/types.ts",
|
||||
"qualifiedName": "__type.redirect_uri"
|
||||
"qualifiedName": "__type.redirect_url"
|
||||
},
|
||||
"1409": {
|
||||
"sourceFileName": "../auth-js/src/lib/types.ts",
|
||||
|
||||
@@ -22351,7 +22351,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 112,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -22385,7 +22385,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 112,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L112"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -22433,7 +22433,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22453,7 +22453,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22803,7 +22803,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22823,7 +22823,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 24,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22904,7 +22904,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 25,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22927,7 +22927,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 47,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -22947,7 +22947,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 45,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22965,7 +22965,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 23,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23015,7 +23015,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 10,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23035,7 +23035,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23071,7 +23071,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 42,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23091,7 +23091,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 40,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23267,7 +23267,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 88,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23283,7 +23283,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 88,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -23298,7 +23298,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 88,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23349,7 +23349,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 73,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L73"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L73"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23375,7 +23375,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 81,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L81"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L81"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23402,7 +23402,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 87,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L87"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L87"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23424,7 +23424,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 86,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L86"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L86"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23653,7 +23653,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 83,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L83"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L83"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23679,7 +23679,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 90,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L90"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23713,7 +23713,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 74,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L74"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L74"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23737,7 +23737,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 80,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L80"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L80"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23763,7 +23763,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 84,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L84"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L84"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23822,7 +23822,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 78,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L78"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L78"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23848,7 +23848,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 85,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L85"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L85"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23869,7 +23869,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 82,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L82"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L82"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23903,7 +23903,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 114,
|
||||
"character": 14,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L114"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L114"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23932,7 +23932,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 113,
|
||||
"character": 14,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L113"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L113"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23951,7 +23951,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 194,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
}
|
||||
],
|
||||
"getSignature": {
|
||||
@@ -23973,7 +23973,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 194,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L194"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -23998,7 +23998,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 308,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24021,7 +24021,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 308,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L308"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -24108,19 +24108,19 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 202,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
},
|
||||
{
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 206,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
},
|
||||
{
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 214,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L214"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L214"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24135,7 +24135,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 202,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L202"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -24237,7 +24237,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 206,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L206"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -24341,7 +24341,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 315,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24364,7 +24364,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 315,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L315"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24391,7 +24391,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 332,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24414,7 +24414,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 332,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L332"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24462,7 +24462,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 325,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24485,7 +24485,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 325,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L325"
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
@@ -24554,7 +24554,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 261,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -24577,7 +24577,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 261,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L261"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -24803,7 +24803,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 275,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L275"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L275"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24853,7 +24853,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 274,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L274"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L274"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24898,7 +24898,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 273,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L273"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L273"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -24918,7 +24918,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 272,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L272"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L272"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25028,7 +25028,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 226,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -25051,7 +25051,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 226,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L226"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -25198,7 +25198,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 37,
|
||||
"character": 21,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L37"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L37"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -25278,7 +25278,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25298,7 +25298,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 44,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L44"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25768,7 +25768,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 26,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25788,7 +25788,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 59,
|
||||
"character": 24,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L59"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25869,7 +25869,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 25,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25892,7 +25892,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 47,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25912,7 +25912,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 45,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25930,7 +25930,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 62,
|
||||
"character": 23,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L62"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -25970,7 +25970,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 10,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -25990,7 +25990,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 65,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L65"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -26026,7 +26026,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 42,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -26046,7 +26046,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
|
||||
"line": 66,
|
||||
"character": 40,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/SupabaseClient.ts#L66"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -42262,7 +42262,7 @@
|
||||
},
|
||||
{
|
||||
"id": 1408,
|
||||
"name": "redirect_uri",
|
||||
"name": "redirect_url",
|
||||
"variant": "declaration",
|
||||
"kind": 1024,
|
||||
"flags": {
|
||||
@@ -42272,7 +42272,7 @@
|
||||
"summary": [
|
||||
{
|
||||
"kind": "text",
|
||||
"text": "Redirect URI - present if user already consented (can be used to trigger immediate redirect)"
|
||||
"text": "Redirect URL - present if user already consented (can be used to trigger immediate redirect)"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -44279,7 +44279,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 118,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -44327,7 +44327,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 118,
|
||||
"character": 51,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -44347,7 +44347,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 118,
|
||||
"character": 49,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L118"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -44398,7 +44398,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 119,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L119"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L119"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -44428,7 +44428,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 117,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L117"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L117"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -51073,7 +51073,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 28,
|
||||
"character": 12,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -51123,7 +51123,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 111,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51139,7 +51139,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 111,
|
||||
"character": 16,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L111"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -51191,7 +51191,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 36,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51224,7 +51224,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 40,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L40"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L40"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51253,7 +51253,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 72,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L72"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L72"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51294,7 +51294,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 52,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L52"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L52"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51323,7 +51323,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 68,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L68"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L68"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51365,7 +51365,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 78,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L78"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L78"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51406,7 +51406,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 48,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L48"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L48"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51435,7 +51435,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 56,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L56"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L56"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51476,7 +51476,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 44,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L44"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L44"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51505,7 +51505,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 83,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L83"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L83"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51547,7 +51547,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 64,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L64"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L64"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51579,7 +51579,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 36,
|
||||
"character": 9,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L36"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -51614,7 +51614,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 32,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51639,7 +51639,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 33,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L33"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L33"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51662,7 +51662,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 32,
|
||||
"character": 7,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L32"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -51681,7 +51681,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 90,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51722,7 +51722,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 94,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L94"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L94"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51756,7 +51756,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 98,
|
||||
"character": 4,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L98"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L98"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51791,7 +51791,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 90,
|
||||
"character": 11,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L90"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -51818,7 +51818,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 88,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L88"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L88"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51841,7 +51841,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 89,
|
||||
"character": 2,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L89"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L89"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -51866,7 +51866,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/lib/types.ts",
|
||||
"line": 28,
|
||||
"character": 48,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/lib/types.ts#L28"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -52659,7 +52659,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 35,
|
||||
"character": 13,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L35"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L35"
|
||||
}
|
||||
],
|
||||
"signatures": [
|
||||
@@ -52674,7 +52674,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 35,
|
||||
"character": 28,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L35"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L35"
|
||||
}
|
||||
],
|
||||
"typeParameters": [
|
||||
@@ -52722,7 +52722,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 39,
|
||||
"character": 8,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L39"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L39"
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
@@ -52742,7 +52742,7 @@
|
||||
"fileName": "packages/core/supabase-js/src/index.ts",
|
||||
"line": 39,
|
||||
"character": 6,
|
||||
"url": "https://github.com/supabase/supabase-js/blob/afdbbfd91c4150b1e5d37aae1f69e94b7882c443/packages/core/supabase-js/src/index.ts#L39"
|
||||
"url": "https://github.com/supabase/supabase-js/blob/f16f1c4120dab860301ccd46fbfd5514979b0eb2/packages/core/supabase-js/src/index.ts#L39"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -59359,7 +59359,7 @@
|
||||
},
|
||||
"1408": {
|
||||
"sourceFileName": "../auth-js/src/lib/types.ts",
|
||||
"qualifiedName": "__type.redirect_uri"
|
||||
"qualifiedName": "__type.redirect_url"
|
||||
},
|
||||
"1409": {
|
||||
"sourceFileName": "../auth-js/src/lib/types.ts",
|
||||
|
||||
@@ -7502,22 +7502,22 @@ functions:
|
||||
title: 'Overview'
|
||||
notes: |
|
||||
This section contains methods for working with Analytics Buckets.
|
||||
- id: storageanalyticsclient-createbucket
|
||||
title: Create a new analytics bucket
|
||||
- id: storageanalytics-from
|
||||
$ref: '@supabase/storage-js.packages/StorageAnalyticsClient.default.from'
|
||||
|
||||
- id: storageanalytics-createbucket
|
||||
$ref: '@supabase/storage-js.packages/StorageAnalyticsClient.default.createBucket'
|
||||
notes: |
|
||||
- Creates a new analytics bucket using Iceberg tables
|
||||
- Analytics buckets are optimized for analytical queries and data processing
|
||||
|
||||
- id: storageanalyticsclient-listbuckets
|
||||
title: List analytics buckets
|
||||
- id: storageanalytics-listbuckets
|
||||
$ref: '@supabase/storage-js.packages/StorageAnalyticsClient.default.listBuckets'
|
||||
notes: |
|
||||
- Retrieves the details of all Analytics Storage buckets within an existing project
|
||||
- Only returns buckets of type 'ANALYTICS'
|
||||
|
||||
- id: storageanalyticsclient-deletebucket
|
||||
title: Delete an analytics bucket
|
||||
- id: storageanalytics-deletebucket
|
||||
$ref: '@supabase/storage-js.packages/StorageAnalyticsClient.default.deleteBucket'
|
||||
notes: |
|
||||
- Deletes an analytics bucket
|
||||
@@ -7961,131 +7961,91 @@ functions:
|
||||
functions.setAuth(session.access_token)
|
||||
```
|
||||
|
||||
- id: storageclient-constructor
|
||||
title: new StorageClient()
|
||||
$ref: '@supabase/storage-js.StorageClient.constructor'
|
||||
|
||||
- id: storageclient-from
|
||||
title: StorageClient.from()
|
||||
$ref: '@supabase/storage-js.StorageClient.from'
|
||||
- id: storagevectorsclient-from
|
||||
title: StorageVectorsClient.from()
|
||||
|
||||
- id: create-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageClient.createBucket'
|
||||
|
||||
- id: delete-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageClient.deleteBucket'
|
||||
|
||||
- id: empty-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageClient.emptyBucket'
|
||||
|
||||
- id: get-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageClient.getBucket'
|
||||
|
||||
- id: list-buckets
|
||||
$ref: '@supabase/storage-js.index.StorageClient.listBuckets'
|
||||
|
||||
- id: update-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageClient.updateBucket'
|
||||
|
||||
- id: storagevectors-create-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageVectorsClient.createBucket'
|
||||
|
||||
- id: storagevectors-delete-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageVectorsClient.deleteBucket'
|
||||
|
||||
- id: storagevectors-get-bucket
|
||||
$ref: '@supabase/storage-js.index.StorageVectorsClient.getBucket'
|
||||
|
||||
- id: storagevectors-list-buckets
|
||||
$ref: '@supabase/storage-js.index.StorageVectorsClient.listBuckets'
|
||||
|
||||
- id: storagevectors-from
|
||||
$ref: '@supabase/storage-js.StorageVectorsClient.from'
|
||||
|
||||
- id: vectorbucket-index
|
||||
$ref: '@supabase/storage-js.index.VectorBucketScope.index'
|
||||
|
||||
- id: storagefile-exists
|
||||
$ref: '@supabase/storage-js.packages/StorageFileApi.default.exists'
|
||||
|
||||
- id: storagefile-info
|
||||
$ref: '@supabase/storage-js.packages/StorageFileApi.default.info'
|
||||
|
||||
- id: storagefile-list-v2
|
||||
$ref: '@supabase/storage-js.packages/StorageFileApi.default.listV2'
|
||||
|
||||
- id: storagefile-to-base64
|
||||
$ref: '@supabase/storage-js.packages/StorageFileApi.default.toBase64'
|
||||
|
||||
- id: vector-buckets
|
||||
title: 'Overview'
|
||||
notes: |
|
||||
This section contains methods for working with Vector Buckets.
|
||||
- id: vectorbucketapi-constructor
|
||||
title: new VectorBucketApi()
|
||||
$ref: '@supabase/storage-js.VectorBucketApi.constructor'
|
||||
|
||||
- id: vectorbucketapi-createbucket
|
||||
title: VectorBucketApi.createBucket()
|
||||
$ref: '@supabase/storage-js.VectorBucketApi.createBucket'
|
||||
|
||||
- id: vectorbucketapi-deletebucket
|
||||
title: VectorBucketApi.deleteBucket()
|
||||
$ref: '@supabase/storage-js.VectorBucketApi.deleteBucket'
|
||||
|
||||
- id: vectorbucketapi-getbucket
|
||||
title: VectorBucketApi.getBucket()
|
||||
$ref: '@supabase/storage-js.VectorBucketApi.getBucket'
|
||||
|
||||
- id: vectorbucketapi-listbuckets
|
||||
title: VectorBucketApi.listBuckets()
|
||||
$ref: '@supabase/storage-js.VectorBucketApi.listBuckets'
|
||||
|
||||
- id: vectorbucketapi-throwonerror
|
||||
title: VectorBucketApi.throwOnError()
|
||||
$ref: '@supabase/storage-js.VectorBucketApi.throwOnError'
|
||||
|
||||
- id: vectorbucketscope-createindex
|
||||
- id: vectorbucket-createindex
|
||||
title: VectorBucketScope.createIndex()
|
||||
$ref: '@supabase/storage-js.VectorBucketScope.createIndex'
|
||||
|
||||
- id: vectorbucketscope-deleteindex
|
||||
- id: vectorbucket-deleteindex
|
||||
title: VectorBucketScope.deleteIndex()
|
||||
$ref: '@supabase/storage-js.VectorBucketScope.deleteIndex'
|
||||
|
||||
- id: vectorbucketscope-getindex
|
||||
- id: vectorbucket-getindex
|
||||
title: VectorBucketScope.getIndex()
|
||||
$ref: '@supabase/storage-js.VectorBucketScope.getIndex'
|
||||
|
||||
- id: vectorbucketscope-listindexes
|
||||
- id: vectorbucket-listindexes
|
||||
title: VectorBucketScope.listIndexes()
|
||||
$ref: '@supabase/storage-js.VectorBucketScope.listIndexes'
|
||||
|
||||
- id: vector-data
|
||||
title: 'Overview'
|
||||
notes: |
|
||||
This section contains methods for working with Vector Data.
|
||||
- id: vectordataapi-deletevectors
|
||||
title: VectorDataApi.deleteVectors()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.deleteVectors'
|
||||
|
||||
- id: vectordataapi-getvectors
|
||||
title: VectorDataApi.getVectors()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.getVectors'
|
||||
|
||||
- id: vectordataapi-listvectors
|
||||
title: VectorDataApi.listVectors()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.listVectors'
|
||||
|
||||
- id: vectordataapi-putvectors
|
||||
title: VectorDataApi.putVectors()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.putVectors'
|
||||
|
||||
- id: vectordataapi-queryvectors
|
||||
title: VectorDataApi.queryVectors()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.queryVectors'
|
||||
|
||||
- id: vectordataapi-throwonerror
|
||||
title: VectorDataApi.throwOnError()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.throwOnError'
|
||||
|
||||
- id: vector-index
|
||||
title: 'Overview'
|
||||
notes: |
|
||||
This section contains methods for working with Vector Index.
|
||||
- id: vectorindexapi-createindex
|
||||
title: VectorIndexApi.createIndex()
|
||||
$ref: '@supabase/storage-js.VectorIndexApi.createIndex'
|
||||
|
||||
- id: vectorindexapi-deleteindex
|
||||
title: VectorIndexApi.deleteIndex()
|
||||
$ref: '@supabase/storage-js.VectorIndexApi.deleteIndex'
|
||||
|
||||
- id: vectorindexapi-getindex
|
||||
title: VectorIndexApi.getIndex()
|
||||
$ref: '@supabase/storage-js.VectorIndexApi.getIndex'
|
||||
|
||||
- id: vectorindexapi-listindexes
|
||||
title: VectorIndexApi.listIndexes()
|
||||
$ref: '@supabase/storage-js.VectorIndexApi.listIndexes'
|
||||
|
||||
- id: vectorindexapi-throwonerror
|
||||
title: VectorIndexApi.throwOnError()
|
||||
$ref: '@supabase/storage-js.VectorIndexApi.throwOnError'
|
||||
|
||||
- id: vectorindexscope-deletevectors
|
||||
title: VectorIndexScope.deleteVectors()
|
||||
- id: vectorindex-deletevectors
|
||||
$ref: '@supabase/storage-js.VectorIndexScope.deleteVectors'
|
||||
|
||||
- id: vectorindexscope-getvectors
|
||||
title: VectorIndexScope.getVectors()
|
||||
- id: vectorindex-getvectors
|
||||
$ref: '@supabase/storage-js.VectorIndexScope.getVectors'
|
||||
|
||||
- id: vectorindexscope-listvectors
|
||||
title: VectorIndexScope.listVectors()
|
||||
- id: vectorindex-listvectors
|
||||
$ref: '@supabase/storage-js.VectorIndexScope.listVectors'
|
||||
|
||||
- id: vectorindexscope-putvectors
|
||||
title: VectorIndexScope.putVectors()
|
||||
- id: vectorindex-putvectors
|
||||
$ref: '@supabase/storage-js.VectorIndexScope.putVectors'
|
||||
|
||||
- id: vectorindexscope-queryvectors
|
||||
title: VectorIndexScope.queryVectors()
|
||||
- id: vectorindex-queryvectors
|
||||
$ref: '@supabase/storage-js.VectorIndexScope.queryVectors'
|
||||
|
||||
- id: realtime-js-realtimechannel-constructor
|
||||
@@ -8147,25 +8107,6 @@ functions:
|
||||
- id: realtime-js-websocketlike-send
|
||||
title: WebSocketLike.send()
|
||||
$ref: '@supabase/realtime-js.WebSocketLike.send'
|
||||
- id: storagevectorsclient-constructor
|
||||
title: new StorageVectorsClient()
|
||||
$ref: '@supabase/storage-js.StorageVectorsClient.constructor'
|
||||
|
||||
- id: vectorbucketscope-constructor
|
||||
title: new VectorBucketScope()
|
||||
$ref: '@supabase/storage-js.VectorBucketScope.constructor'
|
||||
|
||||
- id: vectordataapi-constructor
|
||||
title: new VectorDataApi()
|
||||
$ref: '@supabase/storage-js.VectorDataApi.constructor'
|
||||
|
||||
- id: vectorindexapi-constructor
|
||||
title: new VectorIndexApi()
|
||||
$ref: '@supabase/storage-js.VectorIndexApi.constructor'
|
||||
|
||||
- id: vectorindexscope-constructor
|
||||
title: new VectorIndexScope()
|
||||
$ref: '@supabase/storage-js.VectorIndexScope.constructor'
|
||||
|
||||
- id: realtime-js-websocketlikeconstructor-constructor
|
||||
title: new WebSocketLikeConstructor()
|
||||
|
||||
@@ -6078,6 +6078,91 @@
|
||||
}
|
||||
],
|
||||
"x-oauth-scope": "projects:write"
|
||||
},
|
||||
"patch": {
|
||||
"operationId": "v1-update-a-project",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": {
|
||||
"minLength": 20,
|
||||
"maxLength": 20,
|
||||
"pattern": "^[a-z]+$",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 256
|
||||
}
|
||||
},
|
||||
"required": ["name"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"ref": {
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["id", "ref", "name"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"401": {
|
||||
"description": "Unauthorized"
|
||||
},
|
||||
"403": {
|
||||
"description": "Forbidden action"
|
||||
},
|
||||
"429": {
|
||||
"description": "Rate limit exceeded"
|
||||
},
|
||||
"500": {
|
||||
"description": "Failed to update project"
|
||||
}
|
||||
},
|
||||
"security": [
|
||||
{
|
||||
"bearer": []
|
||||
}
|
||||
],
|
||||
"summary": "Updates the given project",
|
||||
"tags": ["Projects"],
|
||||
"x-badges": [
|
||||
{
|
||||
"name": "OAuth scope: projects:write",
|
||||
"position": "after"
|
||||
}
|
||||
],
|
||||
"x-oauth-scope": "projects:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/secrets": {
|
||||
@@ -8440,9 +8525,38 @@
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxNamespaces": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxTables": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxCatalogs": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled"]
|
||||
"required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"]
|
||||
},
|
||||
"vectorBuckets": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxBuckets": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxIndexes": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled", "maxBuckets", "maxIndexes"]
|
||||
}
|
||||
},
|
||||
"required": ["imageTransformation", "s3Protocol"]
|
||||
@@ -8564,9 +8678,38 @@
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxNamespaces": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxTables": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxCatalogs": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled"]
|
||||
"required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"]
|
||||
},
|
||||
"vectorBuckets": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxBuckets": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxIndexes": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled", "maxBuckets", "maxIndexes"]
|
||||
}
|
||||
},
|
||||
"required": ["imageTransformation", "s3Protocol"]
|
||||
@@ -9347,6 +9490,11 @@
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
},
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"disable_signup": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
@@ -10238,6 +10386,7 @@
|
||||
"required": [
|
||||
"api_max_request_duration",
|
||||
"db_max_pool_size",
|
||||
"db_max_pool_size_unit",
|
||||
"disable_signup",
|
||||
"external_anonymous_users_enabled",
|
||||
"external_apple_additional_client_ids",
|
||||
@@ -11394,6 +11543,11 @@
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
},
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"api_max_request_duration": {
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
@@ -11467,6 +11621,11 @@
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
},
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"disable_signup": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
@@ -12358,6 +12517,7 @@
|
||||
"required": [
|
||||
"api_max_request_duration",
|
||||
"db_max_pool_size",
|
||||
"db_max_pool_size_unit",
|
||||
"disable_signup",
|
||||
"external_anonymous_users_enabled",
|
||||
"external_apple_additional_client_ids",
|
||||
@@ -12612,6 +12772,240 @@
|
||||
"x-oauth-scope": "auth:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/config/realtime": {
|
||||
"get": {
|
||||
"operationId": "v1-get-realtime-config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": {
|
||||
"minLength": 20,
|
||||
"maxLength": 20,
|
||||
"pattern": "^[a-z]+$",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Gets project's realtime configuration",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"private_only": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"description": "Whether to only allow private channels"
|
||||
},
|
||||
"connection_pool": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"nullable": true,
|
||||
"description": "Sets connection pool size for Realtime Authorization"
|
||||
},
|
||||
"max_concurrent_users": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of concurrent users rate limit"
|
||||
},
|
||||
"max_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of events per second rate per channel limit"
|
||||
},
|
||||
"max_bytes_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of bytes per second rate per channel limit"
|
||||
},
|
||||
"max_channels_per_client": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of channels per client rate limit"
|
||||
},
|
||||
"max_joins_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of joins per second rate limit"
|
||||
},
|
||||
"max_presence_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of presence events per second rate limit"
|
||||
},
|
||||
"max_payload_size_in_kb": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of payload size in KB rate limit"
|
||||
},
|
||||
"suspend": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"description": "Whether to suspend realtime"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"private_only",
|
||||
"connection_pool",
|
||||
"max_concurrent_users",
|
||||
"max_events_per_second",
|
||||
"max_bytes_per_second",
|
||||
"max_channels_per_client",
|
||||
"max_joins_per_second",
|
||||
"max_presence_events_per_second",
|
||||
"max_payload_size_in_kb",
|
||||
"suspend"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"401": {
|
||||
"description": "Unauthorized"
|
||||
},
|
||||
"403": {
|
||||
"description": "Forbidden action"
|
||||
},
|
||||
"429": {
|
||||
"description": "Rate limit exceeded"
|
||||
}
|
||||
},
|
||||
"security": [
|
||||
{
|
||||
"bearer": []
|
||||
}
|
||||
],
|
||||
"summary": "Gets realtime configuration",
|
||||
"tags": ["Realtime Config"]
|
||||
},
|
||||
"patch": {
|
||||
"operationId": "v1-update-realtime-config",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": {
|
||||
"minLength": 20,
|
||||
"maxLength": 20,
|
||||
"pattern": "^[a-z]+$",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"private_only": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to only allow private channels"
|
||||
},
|
||||
"connection_pool": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"description": "Sets connection pool size for Realtime Authorization"
|
||||
},
|
||||
"max_concurrent_users": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"description": "Sets maximum number of concurrent users rate limit"
|
||||
},
|
||||
"max_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"description": "Sets maximum number of events per second rate per channel limit"
|
||||
},
|
||||
"max_bytes_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000000,
|
||||
"description": "Sets maximum number of bytes per second rate per channel limit"
|
||||
},
|
||||
"max_channels_per_client": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"description": "Sets maximum number of channels per client rate limit"
|
||||
},
|
||||
"max_joins_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"description": "Sets maximum number of joins per second rate limit"
|
||||
},
|
||||
"max_presence_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"description": "Sets maximum number of presence events per second rate limit"
|
||||
},
|
||||
"max_payload_size_in_kb": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"description": "Sets maximum number of payload size in KB rate limit"
|
||||
},
|
||||
"suspend": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to suspend realtime"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"204": {
|
||||
"description": ""
|
||||
},
|
||||
"401": {
|
||||
"description": "Unauthorized"
|
||||
},
|
||||
"403": {
|
||||
"description": "Forbidden action"
|
||||
},
|
||||
"429": {
|
||||
"description": "Rate limit exceeded"
|
||||
}
|
||||
},
|
||||
"security": [
|
||||
{
|
||||
"bearer": []
|
||||
}
|
||||
],
|
||||
"summary": "Updates realtime configuration",
|
||||
"tags": ["Realtime Config"]
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/config/auth/third-party-auth": {
|
||||
"post": {
|
||||
"operationId": "v1-create-project-tpa-integration",
|
||||
@@ -15420,6 +15814,78 @@
|
||||
"x-oauth-scope": "database:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/query/read-only": {
|
||||
"post": {
|
||||
"description": "All entity references must be schema qualified.",
|
||||
"operationId": "v1-read-only-query",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": {
|
||||
"minLength": 20,
|
||||
"maxLength": 20,
|
||||
"pattern": "^[a-z]+$",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"parameters": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
}
|
||||
},
|
||||
"required": ["query"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": ""
|
||||
},
|
||||
"401": {
|
||||
"description": "Unauthorized"
|
||||
},
|
||||
"403": {
|
||||
"description": "Forbidden action"
|
||||
},
|
||||
"429": {
|
||||
"description": "Rate limit exceeded"
|
||||
},
|
||||
"500": {
|
||||
"description": "Failed to run read-only sql query"
|
||||
}
|
||||
},
|
||||
"security": [
|
||||
{
|
||||
"bearer": []
|
||||
}
|
||||
],
|
||||
"summary": "[Beta] Run a sql query as supabase_read_only_user",
|
||||
"tags": ["Database"],
|
||||
"x-badges": [
|
||||
{
|
||||
"name": "OAuth scope: database:read",
|
||||
"position": "after"
|
||||
}
|
||||
],
|
||||
"x-oauth-scope": "database:read"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/webhooks/enable": {
|
||||
"post": {
|
||||
"operationId": "v1-enable-database-webhook",
|
||||
@@ -15555,6 +16021,86 @@
|
||||
"x-oauth-scope": "projects:read"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/password": {
|
||||
"patch": {
|
||||
"operationId": "v1-update-database-password",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "ref",
|
||||
"required": true,
|
||||
"in": "path",
|
||||
"description": "Project ref",
|
||||
"schema": {
|
||||
"minLength": 20,
|
||||
"maxLength": 20,
|
||||
"pattern": "^[a-z]+$",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"password": {
|
||||
"type": "string",
|
||||
"minLength": 4
|
||||
}
|
||||
},
|
||||
"required": ["password"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"message": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["message"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"401": {
|
||||
"description": "Unauthorized"
|
||||
},
|
||||
"403": {
|
||||
"description": "Forbidden action"
|
||||
},
|
||||
"429": {
|
||||
"description": "Rate limit exceeded"
|
||||
},
|
||||
"500": {
|
||||
"description": "Failed to update database password"
|
||||
}
|
||||
},
|
||||
"security": [
|
||||
{
|
||||
"bearer": []
|
||||
}
|
||||
],
|
||||
"summary": "Updates the database password",
|
||||
"tags": ["Database"],
|
||||
"x-badges": [
|
||||
{
|
||||
"name": "OAuth scope: database:write",
|
||||
"position": "after"
|
||||
}
|
||||
],
|
||||
"x-oauth-scope": "database:write"
|
||||
}
|
||||
},
|
||||
"/v1/projects/{ref}/database/jit": {
|
||||
"get": {
|
||||
"description": "Mappings of roles a user can assume in the project database",
|
||||
@@ -21233,6 +21779,17 @@
|
||||
},
|
||||
"required": ["id", "ref", "name"]
|
||||
},
|
||||
"V1UpdateProjectBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 256
|
||||
}
|
||||
},
|
||||
"required": ["name"]
|
||||
},
|
||||
"SecretResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -21971,9 +22528,38 @@
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxNamespaces": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxTables": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxCatalogs": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled"]
|
||||
"required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"]
|
||||
},
|
||||
"vectorBuckets": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxBuckets": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxIndexes": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled", "maxBuckets", "maxIndexes"]
|
||||
}
|
||||
},
|
||||
"required": ["imageTransformation", "s3Protocol"]
|
||||
@@ -22051,9 +22637,38 @@
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxNamespaces": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxTables": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxCatalogs": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled"]
|
||||
"required": ["enabled", "maxNamespaces", "maxTables", "maxCatalogs"]
|
||||
},
|
||||
"vectorBuckets": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"maxBuckets": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
},
|
||||
"maxIndexes": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": ["enabled", "maxBuckets", "maxIndexes"]
|
||||
}
|
||||
},
|
||||
"required": ["imageTransformation", "s3Protocol"]
|
||||
@@ -22406,6 +23021,11 @@
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
},
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"disable_signup": {
|
||||
"type": "boolean",
|
||||
"nullable": true
|
||||
@@ -23297,6 +23917,7 @@
|
||||
"required": [
|
||||
"api_max_request_duration",
|
||||
"db_max_pool_size",
|
||||
"db_max_pool_size_unit",
|
||||
"disable_signup",
|
||||
"external_anonymous_users_enabled",
|
||||
"external_apple_additional_client_ids",
|
||||
@@ -24402,6 +25023,11 @@
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
},
|
||||
"db_max_pool_size_unit": {
|
||||
"type": "string",
|
||||
"enum": ["connections", "percent"],
|
||||
"nullable": true
|
||||
},
|
||||
"api_max_request_duration": {
|
||||
"type": "integer",
|
||||
"nullable": true
|
||||
@@ -24456,6 +25082,151 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"RealtimeConfigResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"private_only": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"description": "Whether to only allow private channels"
|
||||
},
|
||||
"connection_pool": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"nullable": true,
|
||||
"description": "Sets connection pool size for Realtime Authorization"
|
||||
},
|
||||
"max_concurrent_users": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of concurrent users rate limit"
|
||||
},
|
||||
"max_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of events per second rate per channel limit"
|
||||
},
|
||||
"max_bytes_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of bytes per second rate per channel limit"
|
||||
},
|
||||
"max_channels_per_client": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of channels per client rate limit"
|
||||
},
|
||||
"max_joins_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of joins per second rate limit"
|
||||
},
|
||||
"max_presence_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of presence events per second rate limit"
|
||||
},
|
||||
"max_payload_size_in_kb": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"nullable": true,
|
||||
"description": "Sets maximum number of payload size in KB rate limit"
|
||||
},
|
||||
"suspend": {
|
||||
"type": "boolean",
|
||||
"nullable": true,
|
||||
"description": "Whether to suspend realtime"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"private_only",
|
||||
"connection_pool",
|
||||
"max_concurrent_users",
|
||||
"max_events_per_second",
|
||||
"max_bytes_per_second",
|
||||
"max_channels_per_client",
|
||||
"max_joins_per_second",
|
||||
"max_presence_events_per_second",
|
||||
"max_payload_size_in_kb",
|
||||
"suspend"
|
||||
]
|
||||
},
|
||||
"UpdateRealtimeConfigBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"private_only": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to only allow private channels"
|
||||
},
|
||||
"connection_pool": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
"description": "Sets connection pool size for Realtime Authorization"
|
||||
},
|
||||
"max_concurrent_users": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"description": "Sets maximum number of concurrent users rate limit"
|
||||
},
|
||||
"max_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 50000,
|
||||
"description": "Sets maximum number of events per second rate per channel limit"
|
||||
},
|
||||
"max_bytes_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000000,
|
||||
"description": "Sets maximum number of bytes per second rate per channel limit"
|
||||
},
|
||||
"max_channels_per_client": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"description": "Sets maximum number of channels per client rate limit"
|
||||
},
|
||||
"max_joins_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"description": "Sets maximum number of joins per second rate limit"
|
||||
},
|
||||
"max_presence_events_per_second": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5000,
|
||||
"description": "Sets maximum number of presence events per second rate limit"
|
||||
},
|
||||
"max_payload_size_in_kb": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 10000,
|
||||
"description": "Sets maximum number of payload size in KB rate limit"
|
||||
},
|
||||
"suspend": {
|
||||
"type": "boolean",
|
||||
"description": "Whether to suspend realtime"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"CreateThirdPartyAuthBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -25310,6 +26081,20 @@
|
||||
},
|
||||
"required": ["query"]
|
||||
},
|
||||
"V1ReadOnlyQueryBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"parameters": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
}
|
||||
},
|
||||
"required": ["query"]
|
||||
},
|
||||
"GetProjectDbMetadataResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -25342,6 +26127,25 @@
|
||||
},
|
||||
"required": ["databases"]
|
||||
},
|
||||
"V1UpdatePasswordBody": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"password": {
|
||||
"type": "string",
|
||||
"minLength": 4
|
||||
}
|
||||
},
|
||||
"required": ["password"]
|
||||
},
|
||||
"V1UpdatePasswordResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"message": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["message"]
|
||||
},
|
||||
"JitAccessResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
||||
@@ -129,6 +129,7 @@ export const Pagination = ({ enableForeignRowsQuery = true }: PaginationProps) =
|
||||
|
||||
const onConfirmPreviousPage = () => {
|
||||
goToPreviousPage()
|
||||
setIsConfirmPreviousModalOpen(false)
|
||||
}
|
||||
|
||||
const onNextPage = () => {
|
||||
@@ -143,6 +144,7 @@ export const Pagination = ({ enableForeignRowsQuery = true }: PaginationProps) =
|
||||
|
||||
const onConfirmNextPage = () => {
|
||||
goToNextPage()
|
||||
setIsConfirmNextModalOpen(false)
|
||||
}
|
||||
|
||||
const goToPreviousPage = () => {
|
||||
|
||||
@@ -8,7 +8,7 @@ import { ButtonTooltip } from 'components/ui/ButtonTooltip'
|
||||
import ShimmeringLoader from 'components/ui/ShimmeringLoader'
|
||||
import { useTableEditorQuery } from 'data/table-editor/table-editor-query'
|
||||
import { isTableLike } from 'data/table-editor/table-editor-types'
|
||||
import { useTablesQuery as useTableRetrieveQuery } from 'data/tables/table-retrieve-query'
|
||||
import { useTableQuery } from 'data/tables/table-retrieve-query'
|
||||
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
|
||||
import { Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui'
|
||||
import type { SupaRow } from '../../types'
|
||||
@@ -38,21 +38,18 @@ export const ForeignKeyFormatter = (props: Props) => {
|
||||
r.source_column_name === column.name
|
||||
)
|
||||
|
||||
const { data: targetTable, isLoading: isLoadingTargetTable } =
|
||||
useTableRetrieveQuery<PostgresTable>(
|
||||
{
|
||||
projectRef: project?.ref,
|
||||
connectionString: project?.connectionString,
|
||||
schema: relationship?.target_table_schema ?? '',
|
||||
name: relationship?.target_table_name ?? '',
|
||||
},
|
||||
{
|
||||
enabled:
|
||||
!!project?.ref &&
|
||||
!!relationship?.target_table_schema &&
|
||||
!!relationship?.target_table_name,
|
||||
}
|
||||
)
|
||||
const { data: targetTable, isLoading: isLoadingTargetTable } = useTableQuery<PostgresTable>(
|
||||
{
|
||||
projectRef: project?.ref,
|
||||
connectionString: project?.connectionString,
|
||||
schema: relationship?.target_table_schema ?? '',
|
||||
name: relationship?.target_table_name ?? '',
|
||||
},
|
||||
{
|
||||
enabled:
|
||||
!!project?.ref && !!relationship?.target_table_schema && !!relationship?.target_table_name,
|
||||
}
|
||||
)
|
||||
|
||||
const value = row[column.key]
|
||||
const formattedValue =
|
||||
|
||||
@@ -11,6 +11,7 @@ import AlertError from 'components/ui/AlertError'
|
||||
import { ResourceList } from 'components/ui/Resource/ResourceList'
|
||||
import { HorizontalShimmerWithIcon } from 'components/ui/Shimmers'
|
||||
import { useAuthConfigQuery } from 'data/auth/auth-config-query'
|
||||
import { DOCS_URL } from 'lib/constants'
|
||||
import {
|
||||
Alert_Shadcn_,
|
||||
AlertDescription_Shadcn_,
|
||||
@@ -61,7 +62,7 @@ export const AuthProvidersForm = () => {
|
||||
hour.
|
||||
</p>
|
||||
<Button asChild type="default" className="w-min" icon={<ExternalLink />}>
|
||||
<Link href="https://supabase.com/docs/guides/platform/going-into-prod#security">
|
||||
<Link href={`${DOCS_URL}/guides/platform/going-into-prod#security`}>
|
||||
View security recommendations
|
||||
</Link>
|
||||
</Button>
|
||||
|
||||
@@ -37,7 +37,7 @@ const PROVIDER_EMAIL = {
|
||||
description:
|
||||
'Rejects the use of known or easy to guess passwords on sign up or password change. Powered by the HaveIBeenPwned.org Pwned Passwords API.',
|
||||
type: 'boolean',
|
||||
link: 'https://supabase.com/docs/guides/auth/password-security#password-strength-and-leaked-password-protection',
|
||||
link: `${DOCS_URL}/guides/auth/password-security#password-strength-and-leaked-password-protection`,
|
||||
isPaid: true,
|
||||
},
|
||||
PASSWORD_MIN_LENGTH: {
|
||||
|
||||
@@ -1,306 +0,0 @@
|
||||
import { zodResolver } from '@hookform/resolvers/zod'
|
||||
import type { CreateOAuthClientParams, OAuthClient } from '@supabase/supabase-js'
|
||||
import { Plus, Trash2, X } from 'lucide-react'
|
||||
import Link from 'next/link'
|
||||
import { useEffect } from 'react'
|
||||
import { useFieldArray, useForm } from 'react-hook-form'
|
||||
import { toast } from 'sonner'
|
||||
import * as z from 'zod'
|
||||
|
||||
import { useParams } from 'common'
|
||||
import { useOAuthServerAppCreateMutation } from 'data/oauth-server-apps/oauth-server-app-create-mutation'
|
||||
import { useSupabaseClientQuery } from 'hooks/use-supabase-client-query'
|
||||
import {
|
||||
Button,
|
||||
FormControl_Shadcn_,
|
||||
FormDescription_Shadcn_,
|
||||
FormField_Shadcn_,
|
||||
FormItem_Shadcn_,
|
||||
FormLabel_Shadcn_,
|
||||
FormMessage_Shadcn_,
|
||||
Form_Shadcn_,
|
||||
Input_Shadcn_,
|
||||
Separator,
|
||||
Sheet,
|
||||
SheetClose,
|
||||
SheetContent,
|
||||
SheetFooter,
|
||||
SheetHeader,
|
||||
SheetSection,
|
||||
SheetTitle,
|
||||
Switch,
|
||||
cn,
|
||||
} from 'ui'
|
||||
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
|
||||
|
||||
interface CreateOAuthAppSheetProps {
|
||||
visible: boolean
|
||||
onSuccess: (app: OAuthClient) => void
|
||||
onCancel: () => void
|
||||
}
|
||||
|
||||
const FormSchema = z.object({
|
||||
name: z
|
||||
.string()
|
||||
.min(1, 'Please provide a name for your OAuth app')
|
||||
.max(100, 'Name must be less than 100 characters'),
|
||||
type: z.enum(['manual', 'dynamic']).default('manual'),
|
||||
// scope: z.string().min(1, 'Please select a scope'),
|
||||
redirect_uris: z
|
||||
.object({
|
||||
value: z.string().trim().url('Please provide a valid URL'),
|
||||
})
|
||||
.array()
|
||||
.min(1, 'At least one redirect URI is required'),
|
||||
is_public: z.boolean().default(false),
|
||||
})
|
||||
|
||||
const FORM_ID = 'create-or-update-oauth-app-form'
|
||||
|
||||
const initialValues = {
|
||||
name: '',
|
||||
type: 'manual' as const,
|
||||
// scope: 'email',
|
||||
redirect_uris: [{ value: '' }],
|
||||
is_public: false,
|
||||
}
|
||||
|
||||
export const CreateOAuthAppSheet = ({ visible, onSuccess, onCancel }: CreateOAuthAppSheetProps) => {
|
||||
const { ref: projectRef } = useParams()
|
||||
|
||||
const form = useForm<z.infer<typeof FormSchema>>({
|
||||
resolver: zodResolver(FormSchema),
|
||||
defaultValues: initialValues,
|
||||
})
|
||||
|
||||
const {
|
||||
fields: redirectUriFields,
|
||||
append: appendRedirectUri,
|
||||
remove: removeRedirectUri,
|
||||
} = useFieldArray({
|
||||
name: 'redirect_uris',
|
||||
control: form.control,
|
||||
})
|
||||
|
||||
const { data: supabaseClientData } = useSupabaseClientQuery({ projectRef })
|
||||
|
||||
const { mutateAsync: createOAuthApp, isPending: isCreating } = useOAuthServerAppCreateMutation({
|
||||
onSuccess: (data) => {
|
||||
toast.success(`Successfully created OAuth app "${data.client_name}"`)
|
||||
onSuccess(data)
|
||||
},
|
||||
onError: (error) => {
|
||||
toast.error(error.message)
|
||||
},
|
||||
})
|
||||
|
||||
useEffect(() => {
|
||||
if (visible) {
|
||||
form.reset(initialValues)
|
||||
}
|
||||
}, [visible])
|
||||
|
||||
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
|
||||
// Filter out empty redirect URIs
|
||||
const validRedirectUris = data.redirect_uris
|
||||
.map((uri) => uri.value.trim())
|
||||
.filter((uri) => uri !== '')
|
||||
|
||||
const payload: CreateOAuthClientParams = {
|
||||
client_name: data.name,
|
||||
client_uri: '',
|
||||
// scope: data.scope,
|
||||
redirect_uris: validRedirectUris,
|
||||
}
|
||||
|
||||
createOAuthApp({
|
||||
projectRef,
|
||||
supabaseClient: supabaseClientData?.supabaseClient,
|
||||
...payload,
|
||||
})
|
||||
}
|
||||
|
||||
const onClose = () => {
|
||||
form.reset(initialValues)
|
||||
onCancel()
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Sheet open={visible} onOpenChange={() => onCancel()}>
|
||||
<SheetContent
|
||||
size="default"
|
||||
showClose={false}
|
||||
className="flex flex-col gap-0"
|
||||
tabIndex={undefined}
|
||||
>
|
||||
<SheetHeader>
|
||||
<div className="flex flex-row gap-3 items-center">
|
||||
<SheetClose
|
||||
className={cn(
|
||||
'text-muted hover:text ring-offset-background transition-opacity hover:opacity-100',
|
||||
'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',
|
||||
'disabled:pointer-events-none data-[state=open]:bg-secondary',
|
||||
'transition'
|
||||
)}
|
||||
>
|
||||
<X className="h-3 w-3" />
|
||||
<span className="sr-only">Close</span>
|
||||
</SheetClose>
|
||||
<SheetTitle className="truncate">Create a new OAuth app</SheetTitle>
|
||||
</div>
|
||||
</SheetHeader>
|
||||
<SheetSection className="overflow-auto flex-grow px-0">
|
||||
<Form_Shadcn_ {...form}>
|
||||
<form className="space-y-6" onSubmit={form.handleSubmit(onSubmit)} id={FORM_ID}>
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="name"
|
||||
render={({ field }) => (
|
||||
<FormItemLayout label="Name" className={'px-5'}>
|
||||
<FormControl_Shadcn_>
|
||||
<Input_Shadcn_ {...field} placeholder="My OAuth App" />
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
|
||||
{/* <FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="scope"
|
||||
rules={{ required: true }}
|
||||
render={({ field }) => (
|
||||
<FormItemLayout
|
||||
label="Scope"
|
||||
layout="vertical"
|
||||
description={
|
||||
<>
|
||||
Select the permissions your app will request from users.{' '}
|
||||
<Link
|
||||
href="https://supabase.com/docs/guides/auth/oauth/oauth-apps#scope"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-foreground-light underline hover:text-foreground transition"
|
||||
>
|
||||
Learn more
|
||||
</Link>
|
||||
</>
|
||||
}
|
||||
className={'px-5'}
|
||||
>
|
||||
<FormControl_Shadcn_>
|
||||
<Select_Shadcn_ value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger_Shadcn_ className="w-full">
|
||||
<SelectValue_Shadcn_ placeholder="Select scope..." />
|
||||
</SelectTrigger_Shadcn_>
|
||||
<SelectContent_Shadcn_>
|
||||
{OAUTH_APP_SCOPE_OPTIONS.map((scope) => (
|
||||
<SelectItem_Shadcn_ key={scope.value} value={scope.value}>
|
||||
{scope.name}
|
||||
</SelectItem_Shadcn_>
|
||||
))}
|
||||
</SelectContent_Shadcn_>
|
||||
</Select_Shadcn_>
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/> */}
|
||||
|
||||
<div className="px-5 gap-2 flex flex-col">
|
||||
<FormLabel_Shadcn_ className="text-foreground">Redirect URIs</FormLabel_Shadcn_>
|
||||
|
||||
<div className="space-y-2">
|
||||
{redirectUriFields.map((fieldItem, index) => (
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
key={fieldItem.id}
|
||||
name={`redirect_uris.${index}.value`}
|
||||
render={({ field: inputField }) => (
|
||||
<FormItem_Shadcn_>
|
||||
<div className="flex flex-row gap-2">
|
||||
<FormControl_Shadcn_>
|
||||
<Input_Shadcn_
|
||||
{...inputField}
|
||||
placeholder={'https://example.com/callback'}
|
||||
onChange={(e) => {
|
||||
inputField.onChange(e)
|
||||
}}
|
||||
/>
|
||||
</FormControl_Shadcn_>
|
||||
{redirectUriFields.length > 1 && (
|
||||
<Button
|
||||
type="default"
|
||||
size="tiny"
|
||||
className="h-[34px]"
|
||||
icon={<Trash2 size={14} />}
|
||||
onClick={() => removeRedirectUri(index)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<FormMessage_Shadcn_ />
|
||||
</FormItem_Shadcn_>
|
||||
)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
<div>
|
||||
<Button
|
||||
type="default"
|
||||
icon={<Plus strokeWidth={1.5} />}
|
||||
onClick={() => appendRedirectUri({ value: '' })}
|
||||
>
|
||||
Add redirect URI
|
||||
</Button>
|
||||
</div>
|
||||
<FormDescription_Shadcn_ className="text-foreground-lighter">
|
||||
URLs where users will be redirected after authentication.
|
||||
</FormDescription_Shadcn_>
|
||||
</div>
|
||||
|
||||
<Separator />
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="is_public"
|
||||
render={({ field }) => (
|
||||
<FormItemLayout
|
||||
label="Public"
|
||||
layout="flex"
|
||||
description={
|
||||
<>
|
||||
If enabled, the Authorization Code with PKCE (Proof Key for Code Exchange)
|
||||
flow can be used, particularly beneficial for applications that cannot
|
||||
securely store Client Secrets, such as native and mobile apps.{' '}
|
||||
<Link
|
||||
href="https://supabase.com/docs/guides/auth/oauth/public-oauth-apps"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-foreground-light underline hover:text-foreground transition"
|
||||
>
|
||||
Learn more
|
||||
</Link>
|
||||
</>
|
||||
}
|
||||
className={'px-5'}
|
||||
>
|
||||
<FormControl_Shadcn_>
|
||||
<Switch checked={field.value} onCheckedChange={field.onChange} />
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
</form>
|
||||
</Form_Shadcn_>
|
||||
</SheetSection>
|
||||
<SheetFooter>
|
||||
<Button type="default" disabled={isCreating} onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button htmlType="submit" form={FORM_ID} loading={isCreating}>
|
||||
Create app
|
||||
</Button>
|
||||
</SheetFooter>
|
||||
</SheetContent>
|
||||
</Sheet>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,521 @@
|
||||
import { zodResolver } from '@hookform/resolvers/zod'
|
||||
import type {
|
||||
CreateOAuthClientParams,
|
||||
OAuthClient,
|
||||
UpdateOAuthClientParams,
|
||||
} from '@supabase/supabase-js'
|
||||
import { Plus, Trash2, Upload, X } from 'lucide-react'
|
||||
import { type ChangeEvent, useEffect, useRef, useState } from 'react'
|
||||
import { useFieldArray, useForm } from 'react-hook-form'
|
||||
import { toast } from 'sonner'
|
||||
import * as z from 'zod'
|
||||
|
||||
import { useParams } from 'common'
|
||||
import { InlineLink } from 'components/ui/InlineLink'
|
||||
import Panel from 'components/ui/Panel'
|
||||
import { useProjectEndpointQuery } from 'data/config/project-endpoint-query'
|
||||
import { useOAuthServerAppCreateMutation } from 'data/oauth-server-apps/oauth-server-app-create-mutation'
|
||||
import { useOAuthServerAppRegenerateSecretMutation } from 'data/oauth-server-apps/oauth-server-app-regenerate-secret-mutation'
|
||||
import { useOAuthServerAppUpdateMutation } from 'data/oauth-server-apps/oauth-server-app-update-mutation'
|
||||
import { DOCS_URL } from 'lib/constants'
|
||||
import {
|
||||
Button,
|
||||
FormControl_Shadcn_,
|
||||
FormDescription_Shadcn_,
|
||||
FormField_Shadcn_,
|
||||
FormItem_Shadcn_,
|
||||
FormLabel_Shadcn_,
|
||||
FormMessage_Shadcn_,
|
||||
Form_Shadcn_,
|
||||
Input_Shadcn_,
|
||||
Separator,
|
||||
Sheet,
|
||||
SheetClose,
|
||||
SheetContent,
|
||||
SheetFooter,
|
||||
SheetHeader,
|
||||
SheetSection,
|
||||
SheetTitle,
|
||||
Switch,
|
||||
cn,
|
||||
} from 'ui'
|
||||
import { Input } from 'ui-patterns/DataInputs/Input'
|
||||
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
|
||||
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
|
||||
|
||||
interface CreateOrUpdateOAuthAppSheetProps {
|
||||
visible: boolean
|
||||
appToEdit?: OAuthClient
|
||||
onSuccess: (app: OAuthClient) => void
|
||||
onCancel: () => void
|
||||
}
|
||||
|
||||
const FormSchema = z.object({
|
||||
name: z
|
||||
.string()
|
||||
.min(1, 'Please provide a name for your OAuth app')
|
||||
.max(100, 'Name must be less than 100 characters'),
|
||||
type: z.enum(['manual', 'dynamic']).default('manual'),
|
||||
redirect_uris: z
|
||||
.object({
|
||||
value: z.string().trim().url('Please provide a valid URL'),
|
||||
})
|
||||
.array()
|
||||
.min(1, 'At least one redirect URI is required'),
|
||||
client_type: z.enum(['public', 'confidential']).default('confidential'),
|
||||
client_id: z.string().optional(),
|
||||
client_secret: z.string().optional(),
|
||||
logo_uri: z.string().optional(),
|
||||
})
|
||||
|
||||
const FORM_ID = 'create-or-update-oauth-app-form'
|
||||
|
||||
const initialValues = {
|
||||
name: '',
|
||||
type: 'manual' as const,
|
||||
redirect_uris: [{ value: '' }],
|
||||
client_type: 'confidential' as const,
|
||||
client_id: '',
|
||||
client_secret: '',
|
||||
logo_uri: '',
|
||||
}
|
||||
|
||||
export const CreateOrUpdateOAuthAppSheet = ({
|
||||
visible,
|
||||
appToEdit,
|
||||
onSuccess,
|
||||
onCancel,
|
||||
}: CreateOrUpdateOAuthAppSheetProps) => {
|
||||
const { ref: projectRef } = useParams()
|
||||
const isEditMode = !!appToEdit
|
||||
const [showRegenerateDialog, setShowRegenerateDialog] = useState(false)
|
||||
const uploadButtonRef = useRef<HTMLInputElement>(null)
|
||||
const [logoFile, setLogoFile] = useState<File>()
|
||||
const [logoUrl, setLogoUrl] = useState<string>()
|
||||
const [logoRemoved, setLogoRemoved] = useState(false)
|
||||
const hasLogo = logoUrl !== undefined
|
||||
const isPublicClient = appToEdit?.client_type === 'public'
|
||||
|
||||
const form = useForm<z.infer<typeof FormSchema>>({
|
||||
resolver: zodResolver(FormSchema),
|
||||
defaultValues: initialValues,
|
||||
})
|
||||
|
||||
const {
|
||||
fields: redirectUriFields,
|
||||
append: appendRedirectUri,
|
||||
remove: removeRedirectUri,
|
||||
} = useFieldArray({
|
||||
name: 'redirect_uris',
|
||||
control: form.control,
|
||||
})
|
||||
|
||||
const { data: endpointData } = useProjectEndpointQuery({ projectRef })
|
||||
|
||||
const { mutate: createOAuthApp, isPending: isCreating } = useOAuthServerAppCreateMutation({
|
||||
onSuccess: (data) => {
|
||||
toast.success(`Successfully created OAuth app "${data.client_name}"`)
|
||||
onSuccess(data)
|
||||
},
|
||||
})
|
||||
const { mutate: updateOAuthApp, isPending: isUpdating } = useOAuthServerAppUpdateMutation({
|
||||
onSuccess: (data) => {
|
||||
toast.success(`Successfully updated OAuth app "${data.client_name}"`)
|
||||
onSuccess(data)
|
||||
},
|
||||
})
|
||||
const { mutate: regenerateSecret, isPending: isRegenerating } =
|
||||
useOAuthServerAppRegenerateSecretMutation({
|
||||
onSuccess: (data) => {
|
||||
if (data) {
|
||||
toast.success(`Successfully regenerated client secret for "${appToEdit?.client_name}"`)
|
||||
onSuccess(data)
|
||||
setShowRegenerateDialog(false)
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
useEffect(() => {
|
||||
if (visible) {
|
||||
setLogoFile(undefined)
|
||||
setLogoRemoved(false)
|
||||
if (appToEdit) {
|
||||
form.reset({
|
||||
name: appToEdit.client_name,
|
||||
type: 'manual' as const,
|
||||
redirect_uris:
|
||||
appToEdit.redirect_uris && appToEdit.redirect_uris.length > 0
|
||||
? appToEdit.redirect_uris.map((uri) => ({ value: uri }))
|
||||
: [{ value: '' }],
|
||||
client_type: appToEdit.client_type,
|
||||
client_id: appToEdit.client_id,
|
||||
client_secret: '****************************************************************',
|
||||
logo_uri: appToEdit.logo_uri || undefined,
|
||||
})
|
||||
setLogoUrl(appToEdit.logo_uri || undefined)
|
||||
} else {
|
||||
form.reset(initialValues)
|
||||
setLogoUrl(undefined)
|
||||
}
|
||||
}
|
||||
}, [visible, appToEdit, form])
|
||||
|
||||
const onFileUpload = async (event: ChangeEvent<HTMLInputElement>) => {
|
||||
event.persist()
|
||||
const files = event.target.files
|
||||
if (files && files.length > 0) {
|
||||
const file = files[0]
|
||||
setLogoFile(file)
|
||||
setLogoUrl(URL.createObjectURL(file))
|
||||
setLogoRemoved(false)
|
||||
event.target.value = ''
|
||||
}
|
||||
}
|
||||
|
||||
const onSubmit = async (data: z.infer<typeof FormSchema>) => {
|
||||
const validRedirectUris = data.redirect_uris
|
||||
.map((uri) => uri.value.trim())
|
||||
.filter((uri) => uri !== '')
|
||||
|
||||
let uploadedLogoUri: string | undefined = undefined
|
||||
|
||||
if (logoRemoved) {
|
||||
uploadedLogoUri = ''
|
||||
} else if (logoFile) {
|
||||
const reader = new FileReader()
|
||||
uploadedLogoUri = await new Promise<string>((resolve) => {
|
||||
reader.onloadend = () => resolve(reader.result as string)
|
||||
reader.readAsDataURL(logoFile)
|
||||
})
|
||||
} else if (logoUrl) {
|
||||
uploadedLogoUri = logoUrl
|
||||
}
|
||||
|
||||
if (isEditMode && appToEdit) {
|
||||
const payload: UpdateOAuthClientParams = {
|
||||
client_name: data.name,
|
||||
redirect_uris: validRedirectUris,
|
||||
logo_uri: uploadedLogoUri,
|
||||
}
|
||||
|
||||
updateOAuthApp({
|
||||
projectRef,
|
||||
clientId: appToEdit.client_id,
|
||||
clientEndpoint: endpointData?.endpoint,
|
||||
...payload,
|
||||
})
|
||||
} else {
|
||||
const payload: CreateOAuthClientParams & { logo_uri?: string; client_type?: string } = {
|
||||
client_name: data.name,
|
||||
client_uri: '',
|
||||
client_type: data.client_type,
|
||||
redirect_uris: validRedirectUris,
|
||||
logo_uri: uploadedLogoUri || undefined,
|
||||
}
|
||||
|
||||
createOAuthApp({
|
||||
projectRef,
|
||||
clientEndpoint: endpointData?.endpoint,
|
||||
...payload,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const onClose = () => {
|
||||
form.reset(initialValues)
|
||||
onCancel()
|
||||
}
|
||||
|
||||
const handleRegenerateSecret = () => {
|
||||
setShowRegenerateDialog(true)
|
||||
}
|
||||
|
||||
const handleConfirmRegenerate = () => {
|
||||
regenerateSecret({
|
||||
projectRef,
|
||||
clientId: appToEdit?.client_id,
|
||||
clientEndpoint: endpointData?.endpoint,
|
||||
})
|
||||
}
|
||||
|
||||
const handleUploadLogo = () => uploadButtonRef.current?.click()
|
||||
const handleRemoveLogo = () => {
|
||||
setLogoFile(undefined)
|
||||
setLogoUrl(undefined)
|
||||
setLogoRemoved(true)
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Sheet open={visible} onOpenChange={() => onCancel()}>
|
||||
<SheetContent
|
||||
size="lg"
|
||||
showClose={false}
|
||||
className="flex flex-col gap-0"
|
||||
tabIndex={undefined}
|
||||
>
|
||||
<SheetHeader>
|
||||
<div className="flex flex-row gap-3 items-center">
|
||||
<SheetClose
|
||||
className={cn(
|
||||
'text-muted hover:text ring-offset-background transition-opacity hover:opacity-100',
|
||||
'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',
|
||||
'disabled:pointer-events-none data-[state=open]:bg-secondary',
|
||||
'transition'
|
||||
)}
|
||||
>
|
||||
<X className="h-3 w-3" />
|
||||
<span className="sr-only">Close</span>
|
||||
</SheetClose>
|
||||
<SheetTitle className="truncate">
|
||||
{isEditMode ? 'Update OAuth app' : 'Create a new OAuth app'}
|
||||
</SheetTitle>
|
||||
</div>
|
||||
</SheetHeader>
|
||||
<SheetSection className="overflow-auto flex-grow px-0">
|
||||
<Form_Shadcn_ {...form}>
|
||||
<form className="space-y-6" onSubmit={form.handleSubmit(onSubmit)} id={FORM_ID}>
|
||||
<div className="px-5 flex items-start justify-between gap-4">
|
||||
<div className="flex-grow space-y-4">
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="name"
|
||||
render={({ field }) => (
|
||||
<FormItemLayout label="Name">
|
||||
<FormControl_Shadcn_>
|
||||
<Input_Shadcn_ {...field} placeholder="My OAuth App" />
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="logo_uri"
|
||||
render={() => (
|
||||
<FormItemLayout label="Logo" description="Upload a logo for your OAuth app">
|
||||
<FormControl_Shadcn_>
|
||||
<div className="flex gap-4 items-center">
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleUploadLogo}
|
||||
className={cn(
|
||||
'flex items-center justify-center h-10 w-10 shrink-0 text-foreground-lighter hover:text-foreground-light overflow-hidden rounded-full bg-cover border hover:border-strong'
|
||||
)}
|
||||
style={{
|
||||
backgroundImage: logoUrl ? `url("${logoUrl}")` : 'none',
|
||||
}}
|
||||
>
|
||||
{!hasLogo && <Upload size={14} />}
|
||||
</button>
|
||||
<div className="flex gap-2 items-center">
|
||||
<Button
|
||||
type="default"
|
||||
size="tiny"
|
||||
icon={<Upload size={14} />}
|
||||
onClick={handleUploadLogo}
|
||||
>
|
||||
Upload
|
||||
</Button>
|
||||
{hasLogo && (
|
||||
<Button
|
||||
type="default"
|
||||
size="tiny"
|
||||
icon={<Trash2 size={12} />}
|
||||
onClick={handleRemoveLogo}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<input
|
||||
type="file"
|
||||
ref={uploadButtonRef}
|
||||
className="hidden"
|
||||
accept="image/png, image/jpeg"
|
||||
onChange={onFileUpload}
|
||||
/>
|
||||
</div>
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{isEditMode && appToEdit && (
|
||||
<>
|
||||
<Separator />
|
||||
<div className="px-5">
|
||||
<Panel>
|
||||
<Panel.Content className="space-y-2">
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="client_id"
|
||||
render={() => (
|
||||
<FormItemLayout label="Client ID">
|
||||
<FormControl_Shadcn_>
|
||||
<Input
|
||||
copy
|
||||
readOnly
|
||||
className="input-mono"
|
||||
value={appToEdit.client_id}
|
||||
onChange={() => {}}
|
||||
onCopy={() => toast.success('Client ID copied to clipboard')}
|
||||
/>
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
|
||||
{!isPublicClient && (
|
||||
<>
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="client_secret"
|
||||
render={() => (
|
||||
<FormItemLayout
|
||||
label="Client Secret"
|
||||
description="Client secret is hidden for security. Use the regenerate button to create a new one."
|
||||
>
|
||||
<FormControl_Shadcn_>
|
||||
<Input
|
||||
readOnly
|
||||
type="password"
|
||||
className="input-mono"
|
||||
value="****************************************************************"
|
||||
onChange={() => {}}
|
||||
/>
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
|
||||
<Button
|
||||
type="default"
|
||||
onClick={handleRegenerateSecret}
|
||||
className="w-full"
|
||||
disabled={isRegenerating}
|
||||
>
|
||||
Regenerate Client Secret
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
</Panel.Content>
|
||||
</Panel>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
<div className="px-5 gap-2 flex flex-col">
|
||||
<FormLabel_Shadcn_ className="text-foreground">Redirect URIs</FormLabel_Shadcn_>
|
||||
|
||||
<div className="space-y-2">
|
||||
{redirectUriFields.map((fieldItem, index) => (
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
key={fieldItem.id}
|
||||
name={`redirect_uris.${index}.value`}
|
||||
render={({ field: inputField }) => (
|
||||
<FormItem_Shadcn_>
|
||||
<div className="flex flex-row gap-2">
|
||||
<FormControl_Shadcn_>
|
||||
<Input_Shadcn_
|
||||
{...inputField}
|
||||
placeholder={'https://example.com/callback'}
|
||||
onChange={(e) => {
|
||||
inputField.onChange(e)
|
||||
}}
|
||||
/>
|
||||
</FormControl_Shadcn_>
|
||||
{redirectUriFields.length > 1 && (
|
||||
<Button
|
||||
type="default"
|
||||
size="tiny"
|
||||
className="h-[34px]"
|
||||
icon={<Trash2 size={12} />}
|
||||
onClick={() => removeRedirectUri(index)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<FormMessage_Shadcn_ />
|
||||
</FormItem_Shadcn_>
|
||||
)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
<div>
|
||||
<Button
|
||||
type="default"
|
||||
icon={<Plus strokeWidth={1.5} />}
|
||||
onClick={() => appendRedirectUri({ value: '' })}
|
||||
>
|
||||
Add redirect URI
|
||||
</Button>
|
||||
</div>
|
||||
<FormDescription_Shadcn_ className="text-foreground-lighter">
|
||||
URLs where users will be redirected after authentication.
|
||||
</FormDescription_Shadcn_>
|
||||
</div>
|
||||
|
||||
<Separator />
|
||||
<FormField_Shadcn_
|
||||
control={form.control}
|
||||
name="client_type"
|
||||
render={({ field }) => (
|
||||
<FormItemLayout
|
||||
label="Public Client"
|
||||
layout="flex"
|
||||
description={
|
||||
<>
|
||||
If enabled, the Authorization Code with PKCE (Proof Key for Code Exchange)
|
||||
flow can be used, particularly beneficial for applications that cannot
|
||||
securely store Client Secrets, such as native and mobile apps. This cannot
|
||||
be changed after creation.{' '}
|
||||
<InlineLink href={`${DOCS_URL}/guides/auth/oauth/public-oauth-apps`}>
|
||||
Learn more
|
||||
</InlineLink>
|
||||
</>
|
||||
}
|
||||
className={'px-5'}
|
||||
>
|
||||
<FormControl_Shadcn_>
|
||||
<Switch
|
||||
checked={field.value === 'public'}
|
||||
onCheckedChange={(checked) =>
|
||||
field.onChange(checked ? 'public' : 'confidential')
|
||||
}
|
||||
disabled={isEditMode}
|
||||
/>
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
</form>
|
||||
</Form_Shadcn_>
|
||||
</SheetSection>
|
||||
<SheetFooter>
|
||||
<Button type="default" disabled={isCreating || isUpdating} onClick={onClose}>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button htmlType="submit" form={FORM_ID} loading={isCreating || isUpdating}>
|
||||
{isEditMode ? 'Update app' : 'Create app'}
|
||||
</Button>
|
||||
</SheetFooter>
|
||||
</SheetContent>
|
||||
</Sheet>
|
||||
|
||||
<ConfirmationModal
|
||||
variant="warning"
|
||||
visible={showRegenerateDialog}
|
||||
loading={isRegenerating}
|
||||
title="Confirm regenerating client secret"
|
||||
confirmLabel="Confirm"
|
||||
onCancel={() => setShowRegenerateDialog(false)}
|
||||
onConfirm={handleConfirmRegenerate}
|
||||
>
|
||||
<p className="text-sm text-foreground-light">
|
||||
Are you sure you wish to regenerate the client secret for "{appToEdit?.client_name}"?
|
||||
You'll need to update it in all applications that use it. This action cannot be undone.
|
||||
</p>
|
||||
</ConfirmationModal>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
import type { OAuthClient } from '@supabase/supabase-js'
|
||||
import { useParams } from 'common'
|
||||
import type { OAuthServerAppDeleteVariables } from 'data/oauth-server-apps/oauth-server-app-delete-mutation'
|
||||
import { useSupabaseClientQuery } from 'hooks/use-supabase-client-query'
|
||||
|
||||
import { useProjectEndpointQuery } from 'data/config/project-endpoint-query'
|
||||
import type { OAuthServerAppDeleteVariables } from 'data/oauth-server-apps/oauth-server-app-delete-mutation'
|
||||
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
|
||||
|
||||
interface DeleteOAuthAppModalProps {
|
||||
@@ -22,15 +22,12 @@ export const DeleteOAuthAppModal = ({
|
||||
}: DeleteOAuthAppModalProps) => {
|
||||
const { ref: projectRef } = useParams()
|
||||
|
||||
const { data: supabaseClientData } = useSupabaseClientQuery({ projectRef })
|
||||
|
||||
const { data: endpointData } = useProjectEndpointQuery({ projectRef })
|
||||
const onConfirmDeleteApp = () => {
|
||||
if (!selectedApp) return
|
||||
|
||||
onDelete({
|
||||
projectRef,
|
||||
supabaseClient: supabaseClientData?.supabaseClient,
|
||||
clientId: selectedApp.client_id,
|
||||
clientId: selectedApp?.client_id,
|
||||
clientEndpoint: endpointData?.endpoint,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -23,23 +23,23 @@ export const NewOAuthAppBanner = ({ oauthApp, onClose }: NewOAuthAppBannerProps)
|
||||
Do copy this client id and client secret and store it in a secure place - you will not
|
||||
be able to see it again.
|
||||
</p>
|
||||
<div className="max-w-xl">
|
||||
<div className="">
|
||||
<Input
|
||||
copy
|
||||
readOnly
|
||||
size="small"
|
||||
className="max-w-xl input-mono"
|
||||
className="input-mono"
|
||||
value={oauthApp?.client_id}
|
||||
onChange={() => {}}
|
||||
onCopy={() => toast.success('Client Id copied to clipboard')}
|
||||
/>
|
||||
</div>
|
||||
<div className="max-w-xl">
|
||||
<div className="">
|
||||
<Input
|
||||
copy
|
||||
readOnly
|
||||
size="small"
|
||||
className="max-w-xl input-mono"
|
||||
className=" input-mono"
|
||||
value={oauthApp?.client_secret}
|
||||
onChange={() => {}}
|
||||
onCopy={() => toast.success('Client secret copied to clipboard')}
|
||||
@@ -51,7 +51,7 @@ export const NewOAuthAppBanner = ({ oauthApp, onClose }: NewOAuthAppBannerProps)
|
||||
<Button
|
||||
type="text"
|
||||
icon={<X />}
|
||||
className="w-7 h-7 absolute top-3 right-3"
|
||||
className="w-7 h-7 absolute top-0 right-0"
|
||||
onClick={onClose}
|
||||
/>
|
||||
</Admonition>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import type { OAuthClient } from '@supabase/supabase-js'
|
||||
import { MoreVertical, Plus, RotateCw, Search, Trash } from 'lucide-react'
|
||||
import { Edit, MoreVertical, Plus, RotateCw, Search, Trash, X } from 'lucide-react'
|
||||
import Link from 'next/link'
|
||||
import { useRef, useState } from 'react'
|
||||
import { parseAsBoolean, useQueryState } from 'nuqs'
|
||||
import { useRef, useState } from 'react'
|
||||
import { toast } from 'sonner'
|
||||
|
||||
import { useParams } from 'common'
|
||||
@@ -11,11 +11,11 @@ import { ButtonTooltip } from 'components/ui/ButtonTooltip'
|
||||
import { FilterPopover } from 'components/ui/FilterPopover'
|
||||
import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader'
|
||||
import { useAuthConfigQuery } from 'data/auth/auth-config-query'
|
||||
import { useProjectEndpointQuery } from 'data/config/project-endpoint-query'
|
||||
import { useOAuthServerAppDeleteMutation } from 'data/oauth-server-apps/oauth-server-app-delete-mutation'
|
||||
import { useOAuthServerAppRegenerateSecretMutation } from 'data/oauth-server-apps/oauth-server-app-regenerate-secret-mutation'
|
||||
import { useOAuthServerAppsQuery } from 'data/oauth-server-apps/oauth-server-apps-query'
|
||||
import { useSupabaseClientQuery } from 'hooks/use-supabase-client-query'
|
||||
import { useQueryStateWithSelect, handleErrorOnDelete } from 'hooks/misc/useQueryStateWithSelect'
|
||||
import { handleErrorOnDelete, useQueryStateWithSelect } from 'hooks/misc/useQueryStateWithSelect'
|
||||
import {
|
||||
Badge,
|
||||
Button,
|
||||
@@ -35,20 +35,14 @@ import {
|
||||
} from 'ui'
|
||||
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
|
||||
import { TimestampInfo } from 'ui-patterns/TimestampInfo'
|
||||
import { CreateOAuthAppSheet } from './CreateOAuthAppSheet'
|
||||
import { CreateOrUpdateOAuthAppSheet } from './CreateOrUpdateOAuthAppSheet'
|
||||
import { DeleteOAuthAppModal } from './DeleteOAuthAppModal'
|
||||
import { NewOAuthAppBanner } from './NewOAuthAppBanner'
|
||||
|
||||
export const OAUTH_APP_SCOPE_OPTIONS = [
|
||||
{ name: 'email', value: 'email' },
|
||||
{ name: 'profile', value: 'profile' },
|
||||
{ name: 'openid', value: 'openid' },
|
||||
]
|
||||
|
||||
export const OAUTH_APP_TYPE_OPTIONS = [
|
||||
{ name: 'Manual', value: 'manual' },
|
||||
{ name: 'Dynamic', value: 'dynamic' },
|
||||
]
|
||||
import {
|
||||
filterOAuthApps,
|
||||
OAUTH_APP_CLIENT_TYPE_OPTIONS,
|
||||
OAUTH_APP_REGISTRATION_TYPE_OPTIONS,
|
||||
} from './oauthApps.utils'
|
||||
|
||||
export const OAuthAppsList = () => {
|
||||
const { ref: projectRef } = useParams()
|
||||
@@ -57,17 +51,12 @@ export const OAuthAppsList = () => {
|
||||
const [newOAuthApp, setNewOAuthApp] = useState<OAuthClient | undefined>(undefined)
|
||||
const [showRegenerateDialog, setShowRegenerateDialog] = useState(false)
|
||||
const [selectedApp, setSelectedApp] = useState<OAuthClient>()
|
||||
const [filteredAppTypes, setFilteredAppTypes] = useState<string[]>([])
|
||||
const [filteredAppScopes, setFilteredAppScopes] = useState<string[]>([])
|
||||
const [filteredRegistrationTypes, setFilteredRegistrationTypes] = useState<string[]>([])
|
||||
const [filteredClientTypes, setFilteredClientTypes] = useState<string[]>([])
|
||||
const deletingOAuthAppIdRef = useRef<string | null>(null)
|
||||
|
||||
const { data: supabaseClientData } = useSupabaseClientQuery({ projectRef })
|
||||
|
||||
const { data, isLoading, isError, error } = useOAuthServerAppsQuery(
|
||||
{
|
||||
projectRef,
|
||||
supabaseClient: supabaseClientData?.supabaseClient,
|
||||
},
|
||||
{ projectRef },
|
||||
{ enabled: isOAuthServerEnabled }
|
||||
)
|
||||
|
||||
@@ -80,6 +69,8 @@ export const OAuthAppsList = () => {
|
||||
},
|
||||
})
|
||||
|
||||
const { data: endpointData } = useProjectEndpointQuery({ projectRef })
|
||||
|
||||
const oAuthApps = data?.clients || []
|
||||
|
||||
const [showCreateSheet, setShowCreateSheet] = useQueryState(
|
||||
@@ -87,6 +78,15 @@ export const OAuthAppsList = () => {
|
||||
parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true })
|
||||
)
|
||||
|
||||
const { setValue: setSelectedAppToEdit, value: appToEdit } = useQueryStateWithSelect({
|
||||
urlKey: 'edit',
|
||||
select: (client_id: string) =>
|
||||
client_id ? oAuthApps?.find((app) => app.client_id === client_id) : undefined,
|
||||
enabled: !!oAuthApps?.length,
|
||||
onError: (_error, selectedId) =>
|
||||
handleErrorOnDelete(deletingOAuthAppIdRef, selectedId, `OAuth App not found`),
|
||||
})
|
||||
|
||||
const { setValue: setSelectedAppToDelete, value: appToDelete } = useQueryStateWithSelect({
|
||||
urlKey: 'delete',
|
||||
select: (client_id: string) =>
|
||||
@@ -106,12 +106,26 @@ export const OAuthAppsList = () => {
|
||||
},
|
||||
})
|
||||
|
||||
const handleDeleteClick = (app: OAuthClient) => {
|
||||
setSelectedAppToDelete(app.client_id)
|
||||
}
|
||||
|
||||
const [filterString, setFilterString] = useState<string>('')
|
||||
|
||||
const filteredOAuthApps = filterOAuthApps({
|
||||
apps: oAuthApps,
|
||||
searchString: filterString,
|
||||
registrationTypes: filteredRegistrationTypes,
|
||||
clientTypes: filteredClientTypes,
|
||||
})
|
||||
|
||||
const hasActiveFilters =
|
||||
filterString.length > 0 ||
|
||||
filteredRegistrationTypes.length > 0 ||
|
||||
filteredClientTypes.length > 0
|
||||
|
||||
const handleResetFilters = () => {
|
||||
setFilterString('')
|
||||
setFilteredRegistrationTypes([])
|
||||
setFilteredClientTypes([])
|
||||
}
|
||||
|
||||
if (isAuthConfigLoading || (isOAuthServerEnabled && isLoading)) {
|
||||
return <GenericSkeletonLoader />
|
||||
}
|
||||
@@ -123,7 +137,7 @@ export const OAuthAppsList = () => {
|
||||
return (
|
||||
<>
|
||||
<div className="space-y-4">
|
||||
{newOAuthApp && (
|
||||
{newOAuthApp?.client_secret && (
|
||||
<NewOAuthAppBanner oauthApp={newOAuthApp} onClose={() => setNewOAuthApp(undefined)} />
|
||||
)}
|
||||
{!isOAuthServerEnabled && (
|
||||
@@ -151,35 +165,44 @@ export const OAuthAppsList = () => {
|
||||
<Input
|
||||
placeholder="Search oAuth apps"
|
||||
size="tiny"
|
||||
icon={<Search size="14" />}
|
||||
icon={<Search />}
|
||||
value={filterString}
|
||||
className="w-full lg:w-52"
|
||||
onChange={(e) => setFilterString(e.target.value)}
|
||||
/>
|
||||
<FilterPopover
|
||||
name="Type"
|
||||
options={OAUTH_APP_TYPE_OPTIONS}
|
||||
name="Registration Type"
|
||||
options={OAUTH_APP_REGISTRATION_TYPE_OPTIONS}
|
||||
labelKey="name"
|
||||
valueKey="value"
|
||||
iconKey="icon"
|
||||
activeOptions={filteredAppTypes}
|
||||
activeOptions={filteredRegistrationTypes}
|
||||
labelClass="text-xs text-foreground-light"
|
||||
maxHeightClass="h-[190px]"
|
||||
className="w-52"
|
||||
onSaveFilters={setFilteredAppTypes}
|
||||
onSaveFilters={setFilteredRegistrationTypes}
|
||||
/>
|
||||
<FilterPopover
|
||||
name="Scope"
|
||||
options={OAUTH_APP_SCOPE_OPTIONS}
|
||||
name="Client Type"
|
||||
options={OAUTH_APP_CLIENT_TYPE_OPTIONS}
|
||||
labelKey="name"
|
||||
valueKey="value"
|
||||
iconKey="icon"
|
||||
activeOptions={filteredAppScopes}
|
||||
activeOptions={filteredClientTypes}
|
||||
labelClass="text-xs text-foreground-light"
|
||||
maxHeightClass="h-[190px]"
|
||||
className="w-52"
|
||||
onSaveFilters={setFilteredAppScopes}
|
||||
onSaveFilters={setFilteredClientTypes}
|
||||
/>
|
||||
{hasActiveFilters && (
|
||||
<Button
|
||||
type="default"
|
||||
size="tiny"
|
||||
className="px-1"
|
||||
icon={<X />}
|
||||
onClick={handleResetFilters}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<ButtonTooltip
|
||||
@@ -202,70 +225,86 @@ export const OAuthAppsList = () => {
|
||||
</div>
|
||||
|
||||
<div className="w-full overflow-hidden overflow-x-auto">
|
||||
<Card>
|
||||
<Table>
|
||||
<Card className="@container">
|
||||
<Table containerProps={{ stickyLastColumn: true }}>
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
<TableHead>Name</TableHead>
|
||||
<TableHead>Client ID</TableHead>
|
||||
<TableHead>Type</TableHead>
|
||||
<TableHead>Scope</TableHead>
|
||||
<TableHead>Client Type</TableHead>
|
||||
<TableHead>Registration Type</TableHead>
|
||||
<TableHead>Created</TableHead>
|
||||
<TableHead className="w-8"></TableHead>
|
||||
<TableHead className="w-8 px-0">
|
||||
<div className="!bg-200 px-4 w-full h-full flex items-center border-l @[944px]:border-l-0" />
|
||||
</TableHead>
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{oAuthApps.length === 0 && (
|
||||
{filteredOAuthApps.length === 0 && (
|
||||
<TableRow>
|
||||
<TableCell colSpan={6}>
|
||||
<p className="text-foreground-lighter">No OAuth apps found</p>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
)}
|
||||
{oAuthApps.length > 0 &&
|
||||
oAuthApps.map((app) => (
|
||||
{filteredOAuthApps.length > 0 &&
|
||||
filteredOAuthApps.map((app) => (
|
||||
<TableRow key={app.client_id} className="w-full">
|
||||
<TableCell className="w-100 max-w-64 truncate" title={app.client_name}>
|
||||
{app.client_name}
|
||||
<TableCell className="w-48 max-w-48 flex" title={app.client_name}>
|
||||
<Button
|
||||
type="text"
|
||||
className="text-link-table-cell text-sm p-0 hover:bg-transparent title [&>span]:!w-full"
|
||||
onClick={() => setSelectedAppToEdit(app.client_id)}
|
||||
title={app.client_name}
|
||||
>
|
||||
{app.client_name}
|
||||
</Button>
|
||||
</TableCell>
|
||||
<TableCell className="max-w-40" title={app.client_id}>
|
||||
<TableCell title={app.client_id}>
|
||||
<Badge className="font-mono">{app.client_id}</Badge>
|
||||
</TableCell>
|
||||
<TableCell className="max-w-40">
|
||||
{app.client_type === 'public' ? 'Public' : 'Private'}
|
||||
<TableCell className="text-xs text-foreground-light max-w-28 capitalize">
|
||||
{app.client_type}
|
||||
</TableCell>
|
||||
<TableCell className="max-w-40">
|
||||
{app.scope ? (
|
||||
<Badge>{app.scope}</Badge>
|
||||
) : (
|
||||
<span className="text-xs text-foreground-light">N/A</span>
|
||||
)}
|
||||
<TableCell className="text-xs text-foreground-light max-w-28 capitalize">
|
||||
{app.registration_type}
|
||||
</TableCell>
|
||||
<TableCell className="text-xs text-foreground-light w-1/6">
|
||||
<TableCell className="text-xs text-foreground-light min-w-28 max-w-40 w-1/6">
|
||||
<TimestampInfo utcTimestamp={app.created_at} labelFormat="D MMM, YYYY" />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="flex justify-end items-center">
|
||||
<TableCell className="max-w-20 bg-surface-100 @[944px]:hover:bg-surface-200 px-6">
|
||||
<div className="absolute top-0 right-0 left-0 bottom-0 flex items-center justify-center border-l @[944px]:border-l-0">
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button type="default" className="px-1" icon={<MoreVertical />} />
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent side="bottom" align="end" className="w-52">
|
||||
<DropdownMenuContent side="bottom" align="end" className="w-48">
|
||||
<DropdownMenuItem
|
||||
className="space-x-2"
|
||||
onClick={() => {
|
||||
setSelectedApp(app)
|
||||
setShowRegenerateDialog(true)
|
||||
setSelectedAppToEdit(app.client_id)
|
||||
}}
|
||||
>
|
||||
<RotateCw size={14} />
|
||||
<p>Regenerate client secret</p>
|
||||
<Edit size={12} />
|
||||
<p>Update</p>
|
||||
</DropdownMenuItem>
|
||||
{app.client_type === 'confidential' && (
|
||||
<DropdownMenuItem
|
||||
className="space-x-2"
|
||||
onClick={() => {
|
||||
setSelectedApp(app)
|
||||
setShowRegenerateDialog(true)
|
||||
}}
|
||||
>
|
||||
<RotateCw size={12} />
|
||||
<p>Regenerate client secret</p>
|
||||
</DropdownMenuItem>
|
||||
)}
|
||||
<DropdownMenuItem
|
||||
className="space-x-2"
|
||||
onClick={() => handleDeleteClick(app)}
|
||||
onClick={() => setSelectedAppToDelete(app.client_id)}
|
||||
>
|
||||
<Trash size={14} />
|
||||
<Trash size={12} />
|
||||
<p>Delete</p>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
@@ -280,15 +319,22 @@ export const OAuthAppsList = () => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<CreateOAuthAppSheet
|
||||
visible={showCreateSheet}
|
||||
<CreateOrUpdateOAuthAppSheet
|
||||
visible={showCreateSheet || !!appToEdit}
|
||||
appToEdit={appToEdit}
|
||||
onSuccess={(app) => {
|
||||
const isCreating = !appToEdit
|
||||
setShowCreateSheet(false)
|
||||
setSelectedAppToEdit(null)
|
||||
setSelectedApp(undefined)
|
||||
setNewOAuthApp(app)
|
||||
// Only show banner for new apps or regenerated secrets, not for simple edits
|
||||
if (isCreating || app.client_secret) {
|
||||
setNewOAuthApp(app)
|
||||
}
|
||||
}}
|
||||
onCancel={() => {
|
||||
setShowCreateSheet(false)
|
||||
setSelectedAppToEdit(null)
|
||||
setSelectedApp(undefined)
|
||||
}}
|
||||
/>
|
||||
@@ -312,13 +358,11 @@ export const OAuthAppsList = () => {
|
||||
confirmLabel="Confirm"
|
||||
onCancel={() => setShowRegenerateDialog(false)}
|
||||
onConfirm={() => {
|
||||
if (selectedApp?.client_id) {
|
||||
regenerateSecret({
|
||||
projectRef,
|
||||
supabaseClient: supabaseClientData?.supabaseClient,
|
||||
clientId: selectedApp.client_id,
|
||||
})
|
||||
}
|
||||
regenerateSecret({
|
||||
projectRef,
|
||||
clientId: selectedApp?.client_id,
|
||||
clientEndpoint: endpointData?.endpoint,
|
||||
})
|
||||
setShowRegenerateDialog(false)
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -12,13 +12,14 @@ import {
|
||||
ScaffoldSectionContent,
|
||||
ScaffoldSectionTitle,
|
||||
} from 'components/layouts/Scaffold'
|
||||
import { InlineLink } from 'components/ui/InlineLink'
|
||||
import NoPermission from 'components/ui/NoPermission'
|
||||
import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader'
|
||||
import { useAuthConfigQuery } from 'data/auth/auth-config-query'
|
||||
import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation'
|
||||
import { useOAuthServerAppsQuery } from 'data/oauth-server-apps/oauth-server-apps-query'
|
||||
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
|
||||
import { useSupabaseClientQuery } from 'hooks/use-supabase-client-query'
|
||||
import { DOCS_URL } from 'lib/constants'
|
||||
import {
|
||||
Button,
|
||||
Card,
|
||||
@@ -100,12 +101,7 @@ export const OAuthServerSettingsForm = () => {
|
||||
isSuccess: isPermissionsLoaded,
|
||||
} = useAsyncCheckPermissions(PermissionAction.READ, 'custom_config_gotrue')
|
||||
|
||||
const { data: supabaseClientData } = useSupabaseClientQuery({ projectRef })
|
||||
|
||||
const { data: oAuthAppsData } = useOAuthServerAppsQuery({
|
||||
projectRef,
|
||||
supabaseClient: supabaseClientData?.supabaseClient,
|
||||
})
|
||||
const { data: oAuthAppsData } = useOAuthServerAppsQuery({ projectRef })
|
||||
|
||||
const oauthApps = oAuthAppsData?.clients || []
|
||||
|
||||
@@ -222,14 +218,9 @@ export const OAuthServerSettingsForm = () => {
|
||||
<>
|
||||
Enable OAuth server functionality for your project to create and manage
|
||||
OAuth applications.{' '}
|
||||
<Link
|
||||
href="https://supabase.com/docs/guides/auth/oauth-server"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-foreground-light underline hover:text-foreground transition"
|
||||
>
|
||||
<InlineLink href={`${DOCS_URL}/guides/auth/oauth-server`}>
|
||||
Learn more
|
||||
</Link>
|
||||
</InlineLink>
|
||||
</>
|
||||
}
|
||||
>
|
||||
@@ -320,14 +311,11 @@ export const OAuthServerSettingsForm = () => {
|
||||
<>
|
||||
Enable dynamic OAuth app registration. Apps can be registered
|
||||
programmatically via APIs.{' '}
|
||||
<Link
|
||||
href="https://supabase.com/docs/guides/auth/oauth-server/mcp-authentication#dynamic-client-registration"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-foreground-light underline hover:text-foreground transition"
|
||||
<InlineLink
|
||||
href={`${DOCS_URL}/guides/auth/oauth-server/mcp-authentication#oauth-client-setup`}
|
||||
>
|
||||
Learn more
|
||||
</Link>
|
||||
</InlineLink>
|
||||
</>
|
||||
}
|
||||
>
|
||||
@@ -369,31 +357,27 @@ export const OAuthServerSettingsForm = () => {
|
||||
variant="warning"
|
||||
visible={showDynamicAppsConfirmation}
|
||||
size="large"
|
||||
title="Enable dynamic client registration"
|
||||
confirmLabel="Enable dynamic registration"
|
||||
title="Enable dynamic OAuth app registration"
|
||||
confirmLabel="Enable dynamic app registration"
|
||||
onConfirm={confirmDynamicApps}
|
||||
onCancel={cancelDynamicApps}
|
||||
alert={{
|
||||
title:
|
||||
'By confirming, you acknowledge the risks and would like to move forward with enabling dynamic client registration.',
|
||||
'By confirming, you acknowledge the risks and would like to move forward with enabling dynamic OAuth app registration.',
|
||||
}}
|
||||
>
|
||||
<p className="text-sm text-foreground-lighter pb-4">
|
||||
Enabling dynamic client registration will open up a public API endpoint that anyone can
|
||||
use to register OAuth applications with your app. This can be a security concern, as
|
||||
attackers could register OAuth applications with legitimate-sounding names and send them
|
||||
to your users for approval.
|
||||
Dynamic OAuth apps (also known as dynamic client registration) exposes a public endpoint
|
||||
allowing anyone to register OAuth clients. Bad actors could create malicious apps with
|
||||
legitimate-sounding names to phish your users for authorization.
|
||||
</p>
|
||||
<p className="text-sm text-foreground-lighter pb-4">
|
||||
If your users don't look carefully and accept, the attacker could potentially take over
|
||||
the user's account. Attackers can also flood your application with thousands of OAuth
|
||||
applications that cannot be attributed to anyone (as it's a public endpoint), and make it
|
||||
difficult for you to find and shut them down, or even find legitimate ones.
|
||||
You may also see spam registrations that are difficult to trace or moderate, making it
|
||||
harder to identify trustworthy applications in your OAuth apps list.
|
||||
</p>
|
||||
<p className="text-sm text-foreground-lighter pb-4">
|
||||
If dynamic client registration is enabled, the consent screen is forced to be enabled for
|
||||
all OAuth flows and can no longer be disabled. Disabling the consent screen opens up a
|
||||
CSRF vulnerability in your app.
|
||||
Only enable this if you have a specific use case requiring programmatic client
|
||||
registration and understand the security implications.
|
||||
</p>
|
||||
</ConfirmationModal>
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import type { OAuthClient } from '@supabase/supabase-js'
|
||||
|
||||
export const OAUTH_APP_REGISTRATION_TYPE_OPTIONS = [
|
||||
{ name: 'Manual', value: 'manual' },
|
||||
{ name: 'Dynamic', value: 'dynamic' },
|
||||
]
|
||||
|
||||
export const OAUTH_APP_CLIENT_TYPE_OPTIONS = [
|
||||
{ name: 'Public', value: 'public' },
|
||||
{ name: 'Confidential', value: 'confidential' },
|
||||
]
|
||||
|
||||
interface FilterOAuthAppsParams {
|
||||
apps: OAuthClient[]
|
||||
searchString?: string
|
||||
registrationTypes?: string[]
|
||||
clientTypes?: string[]
|
||||
}
|
||||
|
||||
export function filterOAuthApps({
|
||||
apps,
|
||||
searchString,
|
||||
registrationTypes = [],
|
||||
clientTypes = [],
|
||||
}: FilterOAuthAppsParams): OAuthClient[] {
|
||||
return apps.filter((app) => {
|
||||
// Filter by search string
|
||||
if (searchString) {
|
||||
const searchLower = searchString.toLowerCase()
|
||||
const matchesName = app.client_name.toLowerCase().includes(searchLower)
|
||||
const matchesClientId = app.client_id.toLowerCase().includes(searchLower)
|
||||
if (!matchesName && !matchesClientId) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Filter by registration type
|
||||
if (registrationTypes.length > 0) {
|
||||
if (!registrationTypes.includes(app.registration_type)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Filter by client type
|
||||
if (clientTypes.length > 0) {
|
||||
if (!clientTypes.includes(app.client_type)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold'
|
||||
import { Card, CardContent, CardHeader, CardTitle, Button, AiIconAnimation, Image } from 'ui'
|
||||
import Link from 'next/link'
|
||||
import { BookOpen } from 'lucide-react'
|
||||
import { Logs } from 'icons'
|
||||
import { BASE_PATH } from 'lib/constants'
|
||||
import { useParams } from 'common'
|
||||
import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state'
|
||||
import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
|
||||
import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state'
|
||||
import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold'
|
||||
import { Logs } from 'icons'
|
||||
import { BASE_PATH, DOCS_URL } from 'lib/constants'
|
||||
import { BookOpen } from 'lucide-react'
|
||||
import { useTheme } from 'next-themes'
|
||||
import Link from 'next/link'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state'
|
||||
import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state'
|
||||
import { AiIconAnimation, Button, Card, CardContent, CardHeader, CardTitle, Image } from 'ui'
|
||||
|
||||
export const OverviewLearnMore = () => {
|
||||
const [isMounted, setIsMounted] = useState(false)
|
||||
@@ -35,7 +35,7 @@ export const OverviewLearnMore = () => {
|
||||
actions: [
|
||||
{
|
||||
label: 'Docs',
|
||||
href: 'https://supabase.com/docs/guides/auth',
|
||||
href: `${DOCS_URL}/guides/auth`,
|
||||
icon: <BookOpen />,
|
||||
},
|
||||
],
|
||||
|
||||
@@ -59,7 +59,7 @@ export const PolicyTemplates = ({
|
||||
<Input
|
||||
size="small"
|
||||
id="template-search"
|
||||
icon={<Search size={16} className="text-foreground-muted" />}
|
||||
icon={<Search className="text-foreground-muted" />}
|
||||
placeholder="Search templates"
|
||||
value={search}
|
||||
onChange={(event) => setSearch(event.target.value)}
|
||||
|
||||
@@ -25,6 +25,7 @@ import {
|
||||
Input_Shadcn_,
|
||||
PrePostTab,
|
||||
Switch,
|
||||
cn,
|
||||
} from 'ui'
|
||||
import { Admonition } from 'ui-patterns'
|
||||
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
|
||||
@@ -444,20 +445,45 @@ export const SmtpForm = () => {
|
||||
</>
|
||||
)}
|
||||
|
||||
<CardFooter className="justify-end space-x-2">
|
||||
<CardFooter
|
||||
className={cn(form.formState.isDirty ? 'justify-between' : 'justify-end', 'gap-x-2')}
|
||||
>
|
||||
{form.formState.isDirty && (
|
||||
<Button type="default" onClick={() => form.reset()}>
|
||||
Cancel
|
||||
</Button>
|
||||
<p className="text-sm text-foreground-light">
|
||||
{enableSmtp ? (
|
||||
<>
|
||||
Rate limit for sending emails will be increased to 30 and{' '}
|
||||
<InlineLink href={`/project/${projectRef}/auth/rate-limits`}>
|
||||
can be adjusted
|
||||
</InlineLink>{' '}
|
||||
after enabling custom SMTP
|
||||
</>
|
||||
) : (
|
||||
'Rate limit for sending emails will be reduced to 2 after disabling custom SMTP'
|
||||
)}
|
||||
</p>
|
||||
)}
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
loading={isUpdatingConfig}
|
||||
disabled={!canUpdateConfig || !form.formState.isDirty}
|
||||
>
|
||||
Save changes
|
||||
</Button>
|
||||
<div className="flex items-center gap-x-2">
|
||||
{form.formState.isDirty && (
|
||||
<Button
|
||||
type="default"
|
||||
onClick={() => {
|
||||
form.reset()
|
||||
setEnableSmtp(isSmtpEnabled(authConfig))
|
||||
}}
|
||||
>
|
||||
Cancel
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
type="primary"
|
||||
htmlType="submit"
|
||||
loading={isUpdatingConfig}
|
||||
disabled={!canUpdateConfig || !form.formState.isDirty}
|
||||
>
|
||||
Save changes
|
||||
</Button>
|
||||
</div>
|
||||
</CardFooter>
|
||||
</Card>
|
||||
</form>
|
||||
|
||||
@@ -20,9 +20,9 @@ import { User, useUsersInfiniteQuery } from 'data/auth/users-infinite-query'
|
||||
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
|
||||
import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled'
|
||||
import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage'
|
||||
import { useQueryStateWithSelect } from 'hooks/misc/useQueryStateWithSelect'
|
||||
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
|
||||
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
|
||||
import { useQueryStateWithSelect } from 'hooks/misc/useQueryStateWithSelect'
|
||||
import { cleanPointerEventsNoneOnBody, isAtBottom } from 'lib/helpers'
|
||||
import { parseAsArrayOf, parseAsString, parseAsStringEnum, useQueryState } from 'nuqs'
|
||||
import {
|
||||
@@ -365,7 +365,7 @@ export const UsersV2 = () => {
|
||||
isCountLoaded &&
|
||||
isCountWithinThresholdForSortBy
|
||||
) {
|
||||
if (specificFilterColumn === 'id' && localStorageFilter !== 'id') {
|
||||
if (specificFilterColumn === 'email' && localStorageFilter !== 'email') {
|
||||
setSpecificFilterColumn(localStorageFilter)
|
||||
}
|
||||
if (sortByValue === 'id:asc' && localStorageSortByValue !== 'id:asc') {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { InlineLink } from 'components/ui/InlineLink'
|
||||
import { DOCS_URL } from 'lib/constants'
|
||||
import { Badge, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
|
||||
import { InvoiceStatus } from './Invoices.types'
|
||||
|
||||
@@ -72,7 +73,7 @@ const InvoiceStatusBadge = ({
|
||||
|
||||
<p className="text-xs text-foreground">
|
||||
If you run into this, we recommend{' '}
|
||||
<InlineLink href="https://supabase.com/docs/guides/platform/credits#credit-top-ups">
|
||||
<InlineLink href={`${DOCS_URL}/guides/platform/credits#credit-top-ups`}>
|
||||
topping up your credits
|
||||
</InlineLink>{' '}
|
||||
in advance to avoid running into this in the future.
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { BookOpen, ChevronDown, ExternalLink } from 'lucide-react'
|
||||
import { parseAsString, useQueryState } from 'nuqs'
|
||||
import { HTMLAttributes, ReactNode, useEffect, useMemo, useState } from 'react'
|
||||
import Link from 'next/link'
|
||||
|
||||
import { useParams } from 'common'
|
||||
import { getAddons } from 'components/interfaces/Billing/Subscription/Subscription.utils'
|
||||
@@ -15,7 +14,7 @@ import { useReadReplicasQuery } from 'data/read-replicas/replicas-query'
|
||||
import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query'
|
||||
import { useSendEventMutation } from 'data/telemetry/send-event-mutation'
|
||||
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
|
||||
import { IS_PLATFORM } from 'lib/constants'
|
||||
import { DOCS_URL, IS_PLATFORM } from 'lib/constants'
|
||||
import { pluckObjectFields } from 'lib/helpers'
|
||||
import { useDatabaseSelectorStateSnapshot } from 'state/database-selector'
|
||||
import {
|
||||
@@ -335,15 +334,13 @@ export const DatabaseConnectionString = () => {
|
||||
<p className="text-xs inline-flex items-center gap-1 text-foreground-lighter">
|
||||
<BookOpen size={12} strokeWidth={1.5} className="-mb-px" /> Learn how to connect to your
|
||||
Postgres databases.
|
||||
<Link
|
||||
href="https://supabase.com/docs/guides/database/connecting-to-postgres"
|
||||
className="underline transition hover:text-foreground inline-flex items-center gap-1"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
<InlineLink
|
||||
title="Read docs"
|
||||
className="flex items-center gap-x-1"
|
||||
href={`${DOCS_URL}/guides/database/connecting-to-postgres`}
|
||||
>
|
||||
Read docs <ExternalLink size={12} strokeWidth={1.5} />
|
||||
</Link>
|
||||
</InlineLink>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import { Info } from 'lucide-react'
|
||||
import { DatabaseBackup } from 'lucide-react'
|
||||
|
||||
import { EmptyStatePresentational } from 'ui-patterns'
|
||||
|
||||
export const BackupsEmpty = () => {
|
||||
return (
|
||||
<div className="block w-full rounded border border-muted border-opacity-50 bg-gray-300 p-3">
|
||||
<div className="flex space-x-3">
|
||||
<Info size={20} strokeWidth={1.5} />
|
||||
<p className="text-sm">No backups created yet - check again tomorrow.</p>
|
||||
</div>
|
||||
</div>
|
||||
<EmptyStatePresentational
|
||||
icon={DatabaseBackup}
|
||||
title="No backups yet"
|
||||
description="Check again tomorrow."
|
||||
/>
|
||||
)
|
||||
}
|
||||
@@ -90,7 +90,7 @@ export const EnumeratedTypes = () => {
|
||||
className="w-full lg:w-52"
|
||||
onChange={(e) => setSearch(e.target.value)}
|
||||
placeholder="Search for a type"
|
||||
icon={<Search size={14} />}
|
||||
icon={<Search />}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ export const Extensions = () => {
|
||||
value={filterString}
|
||||
onChange={(e) => setFilterString(e.target.value)}
|
||||
className="w-52"
|
||||
icon={<Search size={14} />}
|
||||
icon={<Search />}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||