Merge branch 'master' into chore/move-policies

This commit is contained in:
Saxon Fletcher committed 2026-04-27 15:16:57 +10:00
commit f4428b7147
83 files changed
+13570 -10840

No files matched your search

+1 -1
View File
@@ -138,7 +138,7 @@ const selfHostingOptions = [
const clientLibraries = [
{
title: 'Javascript',
title: 'JavaScript',
icon: 'reference-javascript',
href: '/reference/javascript/introduction',
enabled: true,
@@ -62,7 +62,7 @@ Create a [Supabase project](/dashboard) and database by following the instructio
export OPENAI_API_KEY=<open_ai_api_key>
export DATASTORE=supabase
export SUPABASE_URL=<supabase_url>
export SUPABASE_SERVICE_ROLE_KEY=<supabase_key>
export SUPABASE_SECRET_KEY=<supabase_secret_key>
```
For Postgres datastore, you'll need to export these environment variables instead:
@@ -65,12 +65,12 @@ jobs:
- uses: supabase/embeddings-generator@v0.0.x # Update this to the latest version.
with:
supabase-url: 'https://your-project-ref.supabase.co' # Update this to your project URL.
supabase-service-role-key: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
supabase-secret-key: ${{ secrets.SUPABASE_SECRET_KEY }}
openai-key: ${{ secrets.OPENAI_API_KEY }}
docs-root-path: 'docs' # the path to the root of your md(x) files
```
Make sure to choose the latest version, and set your `SUPABASE_SERVICE_ROLE_KEY` and `OPENAI_API_KEY` as repository secrets in your repo settings (settings > secrets > actions).
Make sure to choose the latest version, and set your `SUPABASE_SECRET_KEY` and `OPENAI_API_KEY` as repository secrets in your repo settings (settings > secrets > actions).
### Add a search interface
@@ -284,7 +284,7 @@ With our database set up, we need to process and store all `.mdx` files in the `
```bash
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=
SUPABASE_SERVICE_ROLE_KEY=
SUPABASE_SECRET_KEY=
# Get your key at https://platform.openai.com/account/api-keys
OPENAI_API_KEY=
@@ -168,7 +168,7 @@ import { createClient } from 'npm:@supabase/supabase-js@2'
import OpenAI from 'npm:openai'
const supabaseUrl = Deno.env.get('SUPABASE_URL')!
const supabaseServiceRoleKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
const supabaseSecretKey = Deno.env.get('SUPABASE_SECRET_KEY')!
const openaiApiKey = Deno.env.get('OPENAI_API_KEY')!
Deno.serve(async (req) => {
+6 -6
View File
@@ -82,8 +82,8 @@ import { SupabaseVectorStore } from '@langchain/community/vectorstores/supabase'
import { OpenAIEmbeddings } from '@langchain/openai'
import { createClient } from '@supabase/supabase-js'
const supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY
if (!supabaseKey) throw new Error(`Expected SUPABASE_SERVICE_ROLE_KEY`)
const supabaseKey = process.env.SUPABASE_SECRET_KEY
if (!supabaseKey) throw new Error(`Expected SUPABASE_SECRET_KEY`)
const url = process.env.SUPABASE_URL
if (!url) throw new Error(`Expected env var SUPABASE_URL`)
@@ -119,8 +119,8 @@ import { createClient } from '@supabase/supabase-js'
// First, follow set-up instructions above
const privateKey = process.env.SUPABASE_SERVICE_ROLE_KEY
if (!privateKey) throw new Error(`Expected env var SUPABASE_SERVICE_ROLE_KEY`)
const privateKey = process.env.SUPABASE_SECRET_KEY
if (!privateKey) throw new Error(`Expected env var SUPABASE_SECRET_KEY`)
const url = process.env.SUPABASE_URL
if (!url) throw new Error(`Expected env var SUPABASE_URL`)
@@ -158,8 +158,8 @@ import { createClient } from '@supabase/supabase-js'
// First, follow set-up instructions above
const privateKey = process.env.SUPABASE_SERVICE_ROLE_KEY
if (!privateKey) throw new Error(`Expected env var SUPABASE_SERVICE_ROLE_KEY`)
const privateKey = process.env.SUPABASE_SECRET_KEY
if (!privateKey) throw new Error(`Expected env var SUPABASE_SECRET_KEY`)
const url = process.env.SUPABASE_URL
if (!url) throw new Error(`Expected env var SUPABASE_URL`)
@@ -138,12 +138,12 @@ Let's build an Edge Function that will accept an input string and generate an em
```shell
curl --request POST 'http://localhost:54321/functions/v1/embed' \
--header 'Authorization: Bearer ANON_KEY' \
--header 'Content-Type: application/json' \
--header 'apikey: SUPABASE_PUBLISHABLE_KEY' \
--data '{ "input": "hello world" }'
```
Be sure to replace `ANON_KEY` with your project's anonymous key. You can get this key by running `supabase status`.
Be sure to replace `SUPABASE_PUBLISHABLE_KEY` with your project's publishable key. You can get this key by running `supabase status`.
</StepHikeCompact.Details>
@@ -97,7 +97,7 @@ using the API URL (`SUPABASE_URL`) and Key (`SUPABASE_PUBLISHABLE_KEY`) we provi
defaultActiveId="javascript"
queryGroup="language"
>
<TabPanel id="javascript" label="Javascript">
<TabPanel id="javascript" label="JavaScript">
```javascript
// Initialize the JS client
@@ -11,7 +11,7 @@ Supabase provides client libraries for the REST and Realtime APIs. Some librarie
| `Language` | `Source Code` | `Documentation` |
| --------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
| Javascript/Typescript | [supabase-js](https://github.com/supabase/supabase-js) | [Docs](/docs/reference/javascript/introduction) |
| JavaScript/TypeScript | [supabase-js](https://github.com/supabase/supabase-js) | [Docs](/docs/reference/javascript/introduction) |
| Dart/Flutter | [supabase-flutter](https://github.com/supabase/supabase-flutter/tree/main/packages/supabase_flutter) | [Docs](/docs/reference/dart/introduction) |
| Swift | [supabase-swift](https://github.com/supabase/supabase-swift) | [Docs](/docs/reference/swift/introduction) |
| Python | [supabase-py](https://github.com/supabase/supabase-py) | [Docs](/docs/reference/python/initializing) |
@@ -727,7 +727,7 @@ import { createClient } from 'https://esm.sh/@supabase/supabase-js'
const whSecret = Deno.env.get('BEFORE_USER_CREATED_HOOK_SECRET')?.replace('v1,whsec_', '')
const supabaseUrl = Deno.env.get('SUPABASE_URL')
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')
const supabaseKey = Deno.env.get('SUPABASE_SECRET_KEY')
const wh = new Webhook(whSecret)
const supabase = createClient(supabaseUrl, supabaseKey)
@@ -172,8 +172,6 @@ The following fields support the `encrypted:` syntax:
- `auth.publishable_key`
- `auth.secret_key`
- `auth.jwt_secret`
- `auth.anon_key`
- `auth.service_role_key`
**Auth - Email (SMTP)**
@@ -6,7 +6,7 @@ tocVideo: 'AE7dKIKMJy4'
<$Partial path="quickstart_intro.mdx" />
![Supabase User Management example](/docs/img/supabase-flutter-demo.png)
![Supabase User Management example](/docs/img/supabase-expo-react-native-demo.png)
<Admonition type="note">
@@ -37,7 +37,7 @@ cd expo-user-management
Then install the additional dependencies:
```bash
npx expo install @supabase/supabase-js @rneui/themed expo-sqlite
npx expo install @supabase/supabase-js @react-native-async-storage/async-storage
```
Now create a helper file to initialize the Supabase client using the API URL and the key that you copied [earlier](#get-api-details).
@@ -75,7 +75,7 @@ These variables are safe to expose in your Expo app since Supabase has
```bash
npm install @supabase/supabase-js
npm install @rneui/themed @react-native-async-storage/async-storage
npm install @react-native-async-storage/async-storage
npm install aes-js react-native-get-random-values
npm install --save-dev @types/aes-js
npx expo install expo-secure-store
@@ -156,6 +156,16 @@ These variables are safe to expose in your Expo app since Supabase has
</TabPanel>
</Tabs>
### App styling
You can use the following `StyleSheet` component in `styles/styles.ts` to add style to the app:
<$CodeSample
path="/user-management/expo-user-management/styles/styles.ts"
lines={[[1, -1]]}
meta="name=styles/styles.ts"
/>
### Set up a login component
Set up a React Native component to manage logins and sign ups.
@@ -177,7 +187,7 @@ While testing, you can disable email confirmation in your [project's email auth
### Account page
After a user signs in, you can let them to edit their profile details and manage their account.
After a user signs in, let them edit their profile details and manage their account.
Create a new component for that called `Account.tsx`.
@@ -46,7 +46,7 @@ POSTGRES_USER
POSTGRES_HOST
POSTGRES_PASSWORD
POSTGRES_DATABASE
SUPABASE_SERVICE_ROLE_KEY
SUPABASE_SECRET_KEY
SUPABASE_PUBLISHABLE_KEY
SUPABASE_URL
SUPABASE_JWT_SECRET
@@ -21,7 +21,7 @@ Supabase provides several [tools](https://github.com/supabase-community/firebase
1. In the `/storage` directory, rename [supabase-keys-sample.js](https://github.com/supabase-community/firebase-to-supabase/blob/main/storage/supabase-keys-sample.js) to `supabase-keys.js`.
1. Go to your Supabase project's [API settings](/dashboard/project/_/settings/api) in the Dashboard.
1. Copy the **Project URL** and update the `SUPABASE_URL` value in `supabase-keys.js`.
1. Under **Project API keys**, copy the **service_role** key and update the `SUPABASE_KEY` value in `supabase-keys.js`.
1. Under **Project API keys**, copy the **secret** key and update the `SUPABASE_KEY` value in `supabase-keys.js`.
## Generate a Firebase private key [#generate-firebase-private-key]
@@ -19,7 +19,7 @@ S3 access keys provide full access to all S3 operations across all buckets and b
</Admonition>
To authenticate with S3, generate a pair of credentials (Access Key ID and Secret Access Key), copy the endpoint and region from the [project settings page](/dashboard/project/_/storage/settings).
To authenticate with S3, generate a pair of credentials (Access Key ID and Secret Access Key), copy the endpoint and region from the [S3 configuration page](/dashboard/project/_/storage/s3).
This is all the information you need to connect to Supabase Storage using any S3-compatible service.
@@ -79,7 +79,7 @@ All S3 operations performed with the Session Token are scoped to the authenticat
To authenticate with S3 using a Session Token, use the following credentials:
- access_key_id: `project_ref`
- secret_access_key: `anonKey`
- secret_access_key: `publishableKey`
- session_token: `valid jwt token`
For example, using the `aws-sdk` library:
@@ -136,8 +136,8 @@ Instead of `https://project-id.supabase.co` use `https://project-id.storage.supa
export const useUppyWithSupabase = ({ bucketName }: { bucketName: string }) => {
// Initialize Uppy instance only once
const [uppy] = useState(() => new Uppy());
// Initialize Supabase client with project URL and anon key
const supabase = createClient(`https://${projectId}.supabase.co`, anonKey);
// Initialize Supabase client with project URL and publishable key
const supabase = createClient(`https://${projectId}.supabase.co`, publishableKey);
useEffect(() => {
const initializeUppy = async () => {
@@ -47,7 +47,7 @@ Unsigned requests to HTTP endpoints are temporary and all requests will signed i
1. Create and deploy the edge function
Generate a new edge function template and update it to log out the received JSON payload. For simplicity, we will accept any request with an Anon Key.
Generate a new edge function template and update it to log out the received JSON payload. For simplicity, we will accept any request with a Publishable Key.
```bash
supabase functions new hello-world
@@ -86,7 +86,7 @@ Create an HTTP drain under the [Project Settings > Log Drains](/dashboard/projec
- Disable the Gzip, as we want to receive the payload without compression.
- Under URL, set it to your edge function URL `https://[PROJECT REF].supabase.co/functions/v1/hello-world`
- Under Headers, set the `Authorization: Bearer [ANON KEY]`
- Under Headers, set the `Authorization: Bearer [PUBLISHABLE KEY]`
<ProjectConfigVariables variable="publishableKey" />
@@ -31,7 +31,7 @@ Grafana maintains a [Supabase integration guide](https://grafana.com/docs/grafan
2. Provide:
- Your Supabase project ref (e.g. `abcd1234`).
- The Metrics API endpoint: `https://<project-ref>.supabase.co/customer/v1/privileged/metrics`.
- HTTP Basic Auth credentials (`service_role` / `sb_secret_...`).
- HTTP Basic Auth credentials (`sb_secret_...`).
3. Choose the scrape interval (1 minute recommended) and test the connection. Grafana Cloud will deploy an agent in the background that scrapes the Metrics API and forwards the data to Prometheus.
If you prefer to reuse an existing Grafana Agent deployment, configure an [integration pipeline](https://grafana.com/docs/grafana-cloud/send-data/agent/integrations/integration-reference/integration-supabase/) with the same URL and credentials.
@@ -31,7 +31,7 @@ scrape_configs:
metrics_path: /customer/v1/privileged/metrics
scheme: https
basic_auth:
username: service_role
username: username
password: '<secret API key (sb_secret_...)>'
static_configs:
- targets:
@@ -24,7 +24,7 @@ No matter which collector you use, you need to hit the Metrics API once per minu
metrics_path: /customer/v1/privileged/metrics
scheme: https
basic_auth:
username: service_role
username: username
password: '<secret API key (sb_secret_...)>'
static_configs:
- targets:
@@ -2,10 +2,9 @@
title = "PostgREST not recognizing the objects(tables/functions/views) in a schema even after adding it to the exposed schemas"
topics = [
"database",
"rest-api",
"platform"
]
keywords = []
keywords = ["REST API"]
---
PostgREST is returning errors by not recognizing the objects(tables/functions/views) in a schema and logging errors similar to:
@@ -2,9 +2,9 @@
title = "schema \"pg_pgrst_no_exposed_schemas\" does not exist"
topics = [
"database",
"rest-api",
"platform"
]
keywords = ["REST API"]
[[errors]]
message = "schema pg_pgrst_no_exposed_schemas does not exist"
---
+2 -2
View File
@@ -107,11 +107,11 @@ const levelsData = {
},
reference_javascript_v1: {
icon: 'reference-javascript',
name: 'Javascript Reference v1.0',
name: 'JavaScript Reference v1.0',
},
reference_javascript_v2: {
icon: 'reference-javascript',
name: 'Javascript Reference v2.0',
name: 'JavaScript Reference v2.0',
},
reference_dart_v1: {
icon: 'reference-dart',
+3
View File
@@ -91,6 +91,7 @@ Felipe Stival
Ferhat Elmas
Firas El Rachidi
Francesco Sansalvadore
Gabriel Claudino
Garrett Crowell
Gerardo Estaba
Gildas Garcia
@@ -182,6 +183,7 @@ Natalie Roberge
Nick B
Nick Littman
Nick Nowlan
Nicolas Nosenzo
Nyannyacha
Oli R
Pamela Chia
@@ -208,6 +210,7 @@ Ronan Lehane
Rory Wilding
Ryan Goulet
Ruan Maia
Saba Pochkhua
Sam Meech-Ward
Sam Rome
Sam Rose
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

+30 -99
View File
@@ -429,7 +429,7 @@
},
"/v1/projects": {
"get": {
"description": "Returns a list of all projects you've previously created.\n\nUse `/v1/organizations/{slug}/projects` instead when possible to get more precise results and pagination support.",
"description": "Returns a list of all projects you've previously created.",
"operationId": "v1-list-all-projects",
"parameters": [],
"responses": {
@@ -443,7 +443,10 @@
}
}
}
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["projects_read"] }],
"summary": "List all projects",
@@ -467,7 +470,10 @@
"content": {
"application/json": { "schema": { "$ref": "#/components/schemas/V1ProjectResponse" } }
}
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["organization_projects_create"] }],
"summary": "Create a project",
@@ -563,6 +569,9 @@
}
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Unexpected error listing organizations" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["organizations_read"] }],
@@ -592,6 +601,9 @@
}
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Unexpected error creating an organization" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["organizations_create"] }],
@@ -802,7 +814,12 @@
"schema": { "example": "S256", "type": "string", "enum": ["plain", "sha256", "S256"] }
}
],
"responses": { "204": { "description": "" } },
"responses": {
"204": { "description": "" },
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" }
},
"security": [
{ "bearer": [] },
{ "fga_permissions": ["organization_admin_write", "project_admin_write"] }
@@ -856,6 +873,9 @@
"application/json": { "schema": { "$ref": "#/components/schemas/SnippetList" } }
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Failed to list user's SQL snippets" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["snippets_read"] }],
@@ -888,6 +908,9 @@
"application/json": { "schema": { "$ref": "#/components/schemas/SnippetResponse" } }
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Failed to retrieve SQL snippet" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["snippets_read"] }],
@@ -1540,9 +1563,6 @@
}
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Failed to retrieve database branches" }
},
"security": [
@@ -1587,9 +1607,6 @@
"application/json": { "schema": { "$ref": "#/components/schemas/BranchResponse" } }
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Failed to create database branch" }
},
"security": [
@@ -1668,9 +1685,6 @@
"application/json": { "schema": { "$ref": "#/components/schemas/BranchResponse" } }
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Failed to fetch database branch" }
},
"security": [
@@ -7141,6 +7155,9 @@
}
}
},
"401": { "description": "Unauthorized" },
"403": { "description": "Forbidden action" },
"429": { "description": "Rate limit exceeded" },
"500": { "description": "Failed to retrieve projects" }
},
"security": [{ "bearer": [] }, { "fga_permissions": ["organization_projects_read"] }],
@@ -7351,92 +7368,6 @@
"properties": { "message": { "type": "string", "enum": ["Branch restoration initiated"] } },
"required": ["message"]
},
"V1ListProjectsPaginatedResponse": {
"type": "object",
"properties": {
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "number" },
"cloud_provider": { "type": "string" },
"inserted_at": { "type": "string", "nullable": true },
"name": { "type": "string" },
"organization_id": { "type": "number" },
"organization_slug": { "type": "string" },
"ref": { "type": "string" },
"region": { "type": "string" },
"status": { "type": "string" },
"subscription_id": { "type": "string", "nullable": true },
"is_branch_enabled": { "type": "boolean" },
"is_physical_backups_enabled": { "type": "boolean", "nullable": true },
"preview_branch_refs": { "type": "array", "items": { "type": "string" } },
"disk_volume_size_gb": { "type": "number" },
"infra_compute_size": {
"type": "string",
"enum": [
"pico",
"nano",
"micro",
"small",
"medium",
"large",
"xlarge",
"2xlarge",
"4xlarge",
"8xlarge",
"12xlarge",
"16xlarge",
"24xlarge",
"24xlarge_optimized_memory",
"24xlarge_optimized_cpu",
"24xlarge_high_memory",
"48xlarge",
"48xlarge_optimized_memory",
"48xlarge_optimized_cpu",
"48xlarge_high_memory"
]
}
},
"required": [
"id",
"cloud_provider",
"inserted_at",
"name",
"organization_id",
"organization_slug",
"ref",
"region",
"status",
"subscription_id",
"is_branch_enabled",
"is_physical_backups_enabled",
"preview_branch_refs"
]
}
},
"pagination": {
"type": "object",
"properties": {
"count": {
"type": "number",
"description": "Total number of projects. Use this to calculate the total number of pages."
},
"limit": {
"type": "number",
"description": "Maximum number of projects per page (actual number may be less)"
},
"offset": {
"type": "number",
"description": "Number of projects skipped in this response"
}
},
"required": ["count", "limit", "offset"]
}
},
"required": ["projects", "pagination"]
},
"V1ProjectWithDatabaseResponse": {
"type": "object",
"properties": {
File diff suppressed because it is too large. Load diff
@@ -23,7 +23,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 96,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L96"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L96"
}
],
"type": {
@@ -42,7 +42,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 97,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L97"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L97"
}
],
"type": {
@@ -61,7 +61,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 98,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L98"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L98"
}
],
"type": {
@@ -80,7 +80,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 99,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L99"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L99"
}
],
"type": {
@@ -99,7 +99,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 100,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L100"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L100"
}
],
"type": {
@@ -118,7 +118,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 101,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L101"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L101"
}
],
"type": {
@@ -137,7 +137,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 102,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L102"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L102"
}
],
"type": {
@@ -156,7 +156,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 103,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L103"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L103"
}
],
"type": {
@@ -175,7 +175,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 104,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L104"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L104"
}
],
"type": {
@@ -194,7 +194,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 105,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L105"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L105"
}
],
"type": {
@@ -213,7 +213,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 106,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L106"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L106"
}
],
"type": {
@@ -232,7 +232,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 107,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L107"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L107"
}
],
"type": {
@@ -251,7 +251,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 108,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L108"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L108"
}
],
"type": {
@@ -270,7 +270,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 109,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L109"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L109"
}
],
"type": {
@@ -289,7 +289,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 110,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L110"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L110"
}
],
"type": {
@@ -309,7 +309,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 95,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L95"
}
]
},
@@ -339,7 +339,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 44,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L44"
}
],
"signatures": [
@@ -393,7 +393,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 44,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L44"
}
],
"parameters": [
@@ -436,7 +436,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 52,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L52"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L52"
}
],
"type": {
@@ -665,7 +665,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 51,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L51"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L51"
}
],
"type": {
@@ -702,7 +702,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 53,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L53"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L53"
}
],
"type": {
@@ -725,7 +725,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 50,
"character": 7,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L50"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L50"
}
]
}
@@ -755,7 +755,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 19,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L19"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L19"
}
],
"type": {
@@ -984,7 +984,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 17,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L17"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L17"
}
],
"type": {
@@ -1020,7 +1020,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 18,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L18"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L18"
}
],
"type": {
@@ -1043,7 +1043,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 16,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L16"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L16"
}
],
"type": {
@@ -1062,7 +1062,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 202,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L202"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L202"
}
],
"signatures": [
@@ -1505,7 +1505,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 202,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L202"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L202"
}
],
"typeParameters": [
@@ -1604,7 +1604,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 73,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L73"
}
],
"signatures": [
@@ -1648,7 +1648,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 73,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L73"
}
],
"parameters": [
@@ -1709,7 +1709,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 15,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L15"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L15"
}
]
},
@@ -1750,7 +1750,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 32,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L32"
}
],
"signatures": [
@@ -1765,7 +1765,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 32,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L32"
}
],
"parameters": [
@@ -1836,7 +1836,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -1855,7 +1855,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -1870,7 +1870,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1893,7 +1893,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1912,7 +1912,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1931,7 +1931,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1951,7 +1951,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -1979,7 +1979,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 30,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L30"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L30"
}
],
"extendedTypes": [
@@ -2048,7 +2048,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 58,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L58"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L58"
}
],
"signatures": [
@@ -2063,7 +2063,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 58,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L58"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L58"
}
],
"parameters": [
@@ -2111,7 +2111,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -2137,7 +2137,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -2154,7 +2154,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2177,7 +2177,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2196,7 +2196,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2215,7 +2215,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2235,7 +2235,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -2273,7 +2273,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 57,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L57"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L57"
}
],
"extendedTypes": [
@@ -2322,7 +2322,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 90,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L90"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L90"
}
],
"signatures": [
@@ -2337,7 +2337,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 90,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L90"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L90"
}
],
"parameters": [
@@ -2385,7 +2385,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -2411,7 +2411,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -2428,7 +2428,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2451,7 +2451,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2470,7 +2470,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2489,7 +2489,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2509,7 +2509,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -2547,7 +2547,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 89,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L89"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L89"
}
],
"extendedTypes": [
@@ -2596,7 +2596,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 74,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L74"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L74"
}
],
"signatures": [
@@ -2611,7 +2611,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 74,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L74"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L74"
}
],
"parameters": [
@@ -2659,7 +2659,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -2685,7 +2685,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -2702,7 +2702,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2725,7 +2725,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2744,7 +2744,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2763,7 +2763,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2783,7 +2783,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -2821,7 +2821,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 73,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L73"
}
],
"extendedTypes": [
@@ -2844,7 +2844,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 113,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L113"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L113"
}
],
"type": {
@@ -2877,7 +2877,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 129,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L129"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L129"
}
],
"type": {
@@ -2986,7 +2986,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 117,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L117"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L117"
}
],
"type": {
@@ -3002,7 +3002,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 117,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L117"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L117"
}
],
"indexSignatures": [
@@ -3017,7 +3017,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 117,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L117"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L117"
}
],
"parameters": [
@@ -3063,7 +3063,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 121,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L121"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L121"
}
],
"type": {
@@ -3113,7 +3113,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 125,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L125"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L125"
}
],
"type": {
@@ -3144,7 +3144,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 140,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L140"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L140"
}
],
"type": {
@@ -3178,7 +3178,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 145,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L145"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L145"
}
],
"type": {
@@ -3198,7 +3198,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 113,
"character": 36,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L113"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L113"
}
]
}
@@ -3215,7 +3215,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 16,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L16"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L16"
}
],
"typeParameters": [
@@ -23,7 +23,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 96,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L96"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L96"
}
],
"type": {
@@ -42,7 +42,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 97,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L97"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L97"
}
],
"type": {
@@ -61,7 +61,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 98,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L98"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L98"
}
],
"type": {
@@ -80,7 +80,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 99,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L99"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L99"
}
],
"type": {
@@ -99,7 +99,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 100,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L100"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L100"
}
],
"type": {
@@ -118,7 +118,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 101,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L101"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L101"
}
],
"type": {
@@ -137,7 +137,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 102,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L102"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L102"
}
],
"type": {
@@ -156,7 +156,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 103,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L103"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L103"
}
],
"type": {
@@ -175,7 +175,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 104,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L104"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L104"
}
],
"type": {
@@ -194,7 +194,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 105,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L105"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L105"
}
],
"type": {
@@ -213,7 +213,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 106,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L106"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L106"
}
],
"type": {
@@ -232,7 +232,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 107,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L107"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L107"
}
],
"type": {
@@ -251,7 +251,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 108,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L108"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L108"
}
],
"type": {
@@ -270,7 +270,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 109,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L109"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L109"
}
],
"type": {
@@ -289,7 +289,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 110,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L110"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L110"
}
],
"type": {
@@ -309,7 +309,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 95,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L95"
}
]
},
@@ -339,7 +339,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 44,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L44"
}
],
"signatures": [
@@ -393,7 +393,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 44,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L44"
}
],
"parameters": [
@@ -436,7 +436,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 52,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L52"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L52"
}
],
"type": {
@@ -665,7 +665,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 51,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L51"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L51"
}
],
"type": {
@@ -702,7 +702,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 53,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L53"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L53"
}
],
"type": {
@@ -725,7 +725,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 50,
"character": 7,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L50"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L50"
}
]
}
@@ -755,7 +755,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 19,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L19"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L19"
}
],
"type": {
@@ -984,7 +984,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 17,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L17"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L17"
}
],
"type": {
@@ -1020,7 +1020,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 18,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L18"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L18"
}
],
"type": {
@@ -1043,7 +1043,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 16,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L16"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L16"
}
],
"type": {
@@ -1062,7 +1062,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 202,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L202"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L202"
}
],
"signatures": [
@@ -1505,7 +1505,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 202,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L202"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L202"
}
],
"typeParameters": [
@@ -1604,7 +1604,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 73,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L73"
}
],
"signatures": [
@@ -1648,7 +1648,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 73,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L73"
}
],
"parameters": [
@@ -1709,7 +1709,7 @@
"fileName": "packages/core/functions-js/src/FunctionsClient.ts",
"line": 15,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/FunctionsClient.ts#L15"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/FunctionsClient.ts#L15"
}
]
},
@@ -1750,7 +1750,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 32,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L32"
}
],
"signatures": [
@@ -1765,7 +1765,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 32,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L32"
}
],
"parameters": [
@@ -1836,7 +1836,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -1855,7 +1855,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -1870,7 +1870,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1893,7 +1893,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1912,7 +1912,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1931,7 +1931,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -1951,7 +1951,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -1979,7 +1979,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 30,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L30"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L30"
}
],
"extendedTypes": [
@@ -2048,7 +2048,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 58,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L58"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L58"
}
],
"signatures": [
@@ -2063,7 +2063,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 58,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L58"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L58"
}
],
"parameters": [
@@ -2111,7 +2111,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -2137,7 +2137,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -2154,7 +2154,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2177,7 +2177,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2196,7 +2196,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2215,7 +2215,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2235,7 +2235,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -2273,7 +2273,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 57,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L57"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L57"
}
],
"extendedTypes": [
@@ -2322,7 +2322,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 90,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L90"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L90"
}
],
"signatures": [
@@ -2337,7 +2337,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 90,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L90"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L90"
}
],
"parameters": [
@@ -2385,7 +2385,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -2411,7 +2411,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -2428,7 +2428,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2451,7 +2451,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2470,7 +2470,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2489,7 +2489,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2509,7 +2509,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -2547,7 +2547,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 89,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L89"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L89"
}
],
"extendedTypes": [
@@ -2596,7 +2596,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 74,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L74"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L74"
}
],
"signatures": [
@@ -2611,7 +2611,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 74,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L74"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L74"
}
],
"parameters": [
@@ -2659,7 +2659,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 31,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L31"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L31"
}
],
"type": {
@@ -2685,7 +2685,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"signatures": [
@@ -2702,7 +2702,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2725,7 +2725,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2744,7 +2744,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2763,7 +2763,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
],
"type": {
@@ -2783,7 +2783,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 38,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L38"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L38"
}
]
}
@@ -2821,7 +2821,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 73,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L73"
}
],
"extendedTypes": [
@@ -2844,7 +2844,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 113,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L113"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L113"
}
],
"type": {
@@ -2877,7 +2877,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 129,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L129"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L129"
}
],
"type": {
@@ -2986,7 +2986,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 117,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L117"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L117"
}
],
"type": {
@@ -3002,7 +3002,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 117,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L117"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L117"
}
],
"indexSignatures": [
@@ -3017,7 +3017,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 117,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L117"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L117"
}
],
"parameters": [
@@ -3063,7 +3063,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 121,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L121"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L121"
}
],
"type": {
@@ -3113,7 +3113,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 125,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L125"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L125"
}
],
"type": {
@@ -3144,7 +3144,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 140,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L140"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L140"
}
],
"type": {
@@ -3178,7 +3178,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 145,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L145"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L145"
}
],
"type": {
@@ -3198,7 +3198,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 113,
"character": 36,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L113"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L113"
}
]
}
@@ -3215,7 +3215,7 @@
"fileName": "packages/core/functions-js/src/types.ts",
"line": 16,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/functions-js/src/types.ts#L16"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/functions-js/src/types.ts#L16"
}
],
"typeParameters": [
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+134 -134
View File
@@ -51,7 +51,7 @@
"fileName": "packages/core/supabase-js/src/cors.ts",
"line": 54,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/cors.ts#L54"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/cors.ts#L54"
}
],
"type": {
@@ -107,7 +107,7 @@
"fileName": "packages/core/supabase-js/src/cors.ts",
"line": 78,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/cors.ts#L78"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/cors.ts#L78"
}
],
"type": {
@@ -134,7 +134,7 @@
"fileName": "packages/core/supabase-js/src/cors.ts",
"line": 1,
"character": 0,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/cors.ts#L1"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/cors.ts#L1"
}
]
},
@@ -55346,7 +55346,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 279,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
}
],
"signatures": [
@@ -55624,7 +55624,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 279,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
}
],
"typeParameters": [
@@ -55672,7 +55672,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
],
"type": {
@@ -55692,7 +55692,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
]
}
@@ -56042,7 +56042,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
],
"type": {
@@ -56062,7 +56062,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 24,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
]
}
@@ -56143,7 +56143,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 25,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -56166,7 +56166,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 47,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -56186,7 +56186,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -56204,7 +56204,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 23,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -56254,7 +56254,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 10,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
],
"type": {
@@ -56274,7 +56274,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
]
}
@@ -56310,7 +56310,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 42,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
],
"type": {
@@ -56330,7 +56330,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 40,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
]
}
@@ -56506,7 +56506,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 88,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
}
],
"type": {
@@ -56522,7 +56522,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 88,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
}
],
"signatures": [
@@ -56537,7 +56537,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 88,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
}
],
"type": {
@@ -56588,7 +56588,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 73,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L73"
}
],
"type": {
@@ -56614,7 +56614,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 81,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L81"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L81"
}
],
"type": {
@@ -56641,7 +56641,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 87,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L87"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L87"
}
],
"type": {
@@ -56663,7 +56663,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 86,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L86"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L86"
}
],
"type": {
@@ -56892,7 +56892,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 83,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L83"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L83"
}
],
"type": {
@@ -56918,7 +56918,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 90,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L90"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L90"
}
],
"type": {
@@ -56952,7 +56952,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 74,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L74"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L74"
}
],
"type": {
@@ -56976,7 +56976,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 80,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L80"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L80"
}
],
"type": {
@@ -57002,7 +57002,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 84,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L84"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L84"
}
],
"type": {
@@ -57060,7 +57060,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 78,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L78"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L78"
}
],
"type": {
@@ -57086,7 +57086,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 85,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L85"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L85"
}
],
"type": {
@@ -57107,7 +57107,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 82,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L82"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L82"
}
],
"type": {
@@ -57141,7 +57141,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 281,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L281"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L281"
}
],
"type": {
@@ -57170,7 +57170,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 280,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L280"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L280"
}
],
"type": {
@@ -57187,9 +57187,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 364,
"line": 365,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L364"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L365"
}
],
"getSignature": {
@@ -57209,9 +57209,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 364,
"line": 365,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L364"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L365"
}
],
"type": {
@@ -57234,9 +57234,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 478,
"line": 479,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L478"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L479"
}
],
"signatures": [
@@ -57257,9 +57257,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 478,
"line": 479,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L478"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L479"
}
],
"parameters": [
@@ -57344,21 +57344,21 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 372,
"line": 373,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L372"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L373"
},
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 376,
"line": 377,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L376"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L377"
},
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 384,
"line": 385,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L384"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L385"
}
],
"signatures": [
@@ -57371,9 +57371,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 372,
"line": 373,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L372"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L373"
}
],
"typeParameters": [
@@ -57469,9 +57469,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 376,
"line": 377,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L376"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L377"
}
],
"typeParameters": [
@@ -57569,9 +57569,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 492,
"line": 493,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L492"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L493"
}
],
"signatures": [
@@ -57613,9 +57613,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 492,
"line": 493,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L492"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L493"
}
],
"type": {
@@ -57640,9 +57640,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 529,
"line": 530,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L529"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L530"
}
],
"signatures": [
@@ -57693,9 +57693,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 529,
"line": 530,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L529"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L530"
}
],
"type": {
@@ -57741,9 +57741,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 512,
"line": 513,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L512"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L513"
}
],
"signatures": [
@@ -57794,9 +57794,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 512,
"line": 513,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L512"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L513"
}
],
"parameters": [
@@ -57863,9 +57863,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 431,
"line": 432,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L431"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L432"
}
],
"signatures": [
@@ -57886,9 +57886,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 431,
"line": 432,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L431"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L432"
}
],
"typeParameters": [
@@ -58112,9 +58112,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 445,
"line": 446,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L445"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L446"
}
],
"type": {
@@ -58162,9 +58162,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 444,
"line": 445,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L444"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L445"
}
],
"type": {
@@ -58207,9 +58207,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 443,
"line": 444,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L443"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L444"
}
],
"type": {
@@ -58227,9 +58227,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 442,
"line": 443,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L442"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L443"
}
]
}
@@ -58333,9 +58333,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 396,
"line": 397,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L396"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L397"
}
],
"signatures": [
@@ -58356,9 +58356,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 396,
"line": 397,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L396"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L397"
}
],
"typeParameters": [
@@ -58519,7 +58519,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 37,
"character": 21,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L37"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L37"
}
],
"typeParameters": [
@@ -58599,7 +58599,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
],
"type": {
@@ -58619,7 +58619,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
]
}
@@ -59089,7 +59089,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
],
"type": {
@@ -59109,7 +59109,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 24,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
]
}
@@ -59190,7 +59190,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 25,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -59213,7 +59213,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 47,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -59233,7 +59233,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -59251,7 +59251,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 23,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -59291,7 +59291,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 10,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
],
"type": {
@@ -59311,7 +59311,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
]
}
@@ -59347,7 +59347,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 42,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
],
"type": {
@@ -59367,7 +59367,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 40,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
]
}
@@ -72862,7 +72862,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 173,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L173"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L173"
}
],
"typeParameters": [
@@ -79982,7 +79982,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 161,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L161"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L161"
}
],
"typeParameters": [
@@ -80030,7 +80030,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 161,
"character": 51,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L161"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L161"
}
],
"type": {
@@ -80050,7 +80050,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 161,
"character": 49,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L161"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L161"
}
]
}
@@ -80101,7 +80101,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 162,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L162"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L162"
}
],
"type": {
@@ -80130,7 +80130,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 160,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L160"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L160"
}
],
"typeParameters": [
@@ -86905,7 +86905,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 28,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L28"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L28"
}
],
"typeParameters": [
@@ -86955,7 +86955,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 154,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L154"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L154"
}
],
"type": {
@@ -86971,7 +86971,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 154,
"character": 16,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L154"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L154"
}
],
"signatures": [
@@ -87023,7 +87023,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 61,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L61"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L61"
}
],
"type": {
@@ -87056,7 +87056,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 65,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L65"
}
],
"type": {
@@ -87085,7 +87085,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 115,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L115"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L115"
}
],
"type": {
@@ -87138,7 +87138,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"type": {
@@ -87161,7 +87161,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 36,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"signatures": [
@@ -87207,7 +87207,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 55,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"indexSignatures": [
@@ -87222,7 +87222,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 57,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"parameters": [
@@ -87280,7 +87280,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 111,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L111"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L111"
}
],
"type": {
@@ -87322,7 +87322,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 121,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L121"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L121"
}
],
"type": {
@@ -87363,7 +87363,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 73,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L73"
}
],
"type": {
@@ -87392,7 +87392,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 99,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L99"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L99"
}
],
"type": {
@@ -87433,7 +87433,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 69,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L69"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L69"
}
],
"type": {
@@ -87462,7 +87462,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 126,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L126"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L126"
}
],
"type": {
@@ -87504,7 +87504,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 107,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L107"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L107"
}
],
"type": {
@@ -87536,7 +87536,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 61,
"character": 9,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L61"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L61"
}
]
}
@@ -87571,7 +87571,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 32,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L32"
}
],
"type": {
@@ -87596,7 +87596,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 33,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L33"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L33"
}
],
"type": {
@@ -87640,7 +87640,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 45,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L45"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L45"
}
],
"type": {
@@ -87681,7 +87681,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 58,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L58"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L58"
}
],
"type": {
@@ -87701,7 +87701,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 32,
"character": 7,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L32"
}
]
}
@@ -87720,7 +87720,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 133,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L133"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L133"
}
],
"type": {
@@ -87761,7 +87761,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 137,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L137"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L137"
}
],
"type": {
@@ -87795,7 +87795,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 141,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L141"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L141"
}
],
"type": {
@@ -87830,7 +87830,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 133,
"character": 11,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L133"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L133"
}
]
}
@@ -87857,7 +87857,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 131,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L131"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L131"
}
],
"type": {
@@ -87880,7 +87880,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 132,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L132"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L132"
}
],
"type": {
@@ -87905,7 +87905,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 28,
"character": 48,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L28"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L28"
}
]
}
@@ -89419,7 +89419,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 46,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L46"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L46"
}
],
"signatures": [
@@ -89434,7 +89434,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 46,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L46"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L46"
}
],
"typeParameters": [
@@ -89482,7 +89482,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 50,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L50"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L50"
}
],
"type": {
@@ -89502,7 +89502,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 50,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L50"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L50"
}
]
}
@@ -90715,7 +90715,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 1,
"character": 0,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L1"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L1"
}
]
}
@@ -51,7 +51,7 @@
"fileName": "packages/core/supabase-js/src/cors.ts",
"line": 54,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/cors.ts#L54"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/cors.ts#L54"
}
],
"type": {
@@ -107,7 +107,7 @@
"fileName": "packages/core/supabase-js/src/cors.ts",
"line": 78,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/cors.ts#L78"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/cors.ts#L78"
}
],
"type": {
@@ -134,7 +134,7 @@
"fileName": "packages/core/supabase-js/src/cors.ts",
"line": 1,
"character": 0,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/cors.ts#L1"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/cors.ts#L1"
}
]
},
@@ -55346,7 +55346,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 279,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
}
],
"signatures": [
@@ -55624,7 +55624,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 279,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L279"
}
],
"typeParameters": [
@@ -55672,7 +55672,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
],
"type": {
@@ -55692,7 +55692,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
]
}
@@ -56042,7 +56042,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
],
"type": {
@@ -56062,7 +56062,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 24,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
]
}
@@ -56143,7 +56143,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 25,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -56166,7 +56166,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 47,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -56186,7 +56186,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -56204,7 +56204,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 23,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -56254,7 +56254,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 10,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
],
"type": {
@@ -56274,7 +56274,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
]
}
@@ -56310,7 +56310,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 42,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
],
"type": {
@@ -56330,7 +56330,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 40,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
]
}
@@ -56506,7 +56506,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 88,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
}
],
"type": {
@@ -56522,7 +56522,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 88,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
}
],
"signatures": [
@@ -56537,7 +56537,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 88,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L88"
}
],
"type": {
@@ -56588,7 +56588,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 73,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L73"
}
],
"type": {
@@ -56614,7 +56614,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 81,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L81"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L81"
}
],
"type": {
@@ -56641,7 +56641,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 87,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L87"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L87"
}
],
"type": {
@@ -56663,7 +56663,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 86,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L86"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L86"
}
],
"type": {
@@ -56892,7 +56892,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 83,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L83"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L83"
}
],
"type": {
@@ -56918,7 +56918,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 90,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L90"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L90"
}
],
"type": {
@@ -56952,7 +56952,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 74,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L74"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L74"
}
],
"type": {
@@ -56976,7 +56976,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 80,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L80"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L80"
}
],
"type": {
@@ -57002,7 +57002,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 84,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L84"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L84"
}
],
"type": {
@@ -57060,7 +57060,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 78,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L78"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L78"
}
],
"type": {
@@ -57086,7 +57086,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 85,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L85"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L85"
}
],
"type": {
@@ -57107,7 +57107,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 82,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L82"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L82"
}
],
"type": {
@@ -57141,7 +57141,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 281,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L281"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L281"
}
],
"type": {
@@ -57170,7 +57170,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 280,
"character": 14,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L280"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L280"
}
],
"type": {
@@ -57187,9 +57187,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 364,
"line": 365,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L364"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L365"
}
],
"getSignature": {
@@ -57209,9 +57209,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 364,
"line": 365,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L364"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L365"
}
],
"type": {
@@ -57234,9 +57234,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 478,
"line": 479,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L478"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L479"
}
],
"signatures": [
@@ -57257,9 +57257,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 478,
"line": 479,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L478"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L479"
}
],
"parameters": [
@@ -57344,21 +57344,21 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 372,
"line": 373,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L372"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L373"
},
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 376,
"line": 377,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L376"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L377"
},
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 384,
"line": 385,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L384"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L385"
}
],
"signatures": [
@@ -57371,9 +57371,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 372,
"line": 373,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L372"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L373"
}
],
"typeParameters": [
@@ -57469,9 +57469,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 376,
"line": 377,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L376"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L377"
}
],
"typeParameters": [
@@ -57569,9 +57569,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 492,
"line": 493,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L492"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L493"
}
],
"signatures": [
@@ -57613,9 +57613,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 492,
"line": 493,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L492"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L493"
}
],
"type": {
@@ -57640,9 +57640,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 529,
"line": 530,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L529"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L530"
}
],
"signatures": [
@@ -57693,9 +57693,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 529,
"line": 530,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L529"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L530"
}
],
"type": {
@@ -57741,9 +57741,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 512,
"line": 513,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L512"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L513"
}
],
"signatures": [
@@ -57794,9 +57794,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 512,
"line": 513,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L512"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L513"
}
],
"parameters": [
@@ -57863,9 +57863,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 431,
"line": 432,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L431"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L432"
}
],
"signatures": [
@@ -57886,9 +57886,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 431,
"line": 432,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L431"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L432"
}
],
"typeParameters": [
@@ -58112,9 +58112,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 445,
"line": 446,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L445"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L446"
}
],
"type": {
@@ -58162,9 +58162,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 444,
"line": 445,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L444"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L445"
}
],
"type": {
@@ -58207,9 +58207,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 443,
"line": 444,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L443"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L444"
}
],
"type": {
@@ -58227,9 +58227,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 442,
"line": 443,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L442"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L443"
}
]
}
@@ -58333,9 +58333,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 396,
"line": 397,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L396"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L397"
}
],
"signatures": [
@@ -58356,9 +58356,9 @@
"sources": [
{
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 396,
"line": 397,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L396"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L397"
}
],
"typeParameters": [
@@ -58519,7 +58519,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 37,
"character": 21,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L37"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L37"
}
],
"typeParameters": [
@@ -58599,7 +58599,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
],
"type": {
@@ -58619,7 +58619,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 44,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L44"
}
]
}
@@ -59089,7 +59089,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 26,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
],
"type": {
@@ -59109,7 +59109,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 59,
"character": 24,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L59"
}
]
}
@@ -59190,7 +59190,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 25,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -59213,7 +59213,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 47,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
],
"type": {
@@ -59233,7 +59233,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 45,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -59251,7 +59251,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 62,
"character": 23,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L62"
}
]
}
@@ -59291,7 +59291,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 10,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
],
"type": {
@@ -59311,7 +59311,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 65,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L65"
}
]
}
@@ -59347,7 +59347,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 42,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
],
"type": {
@@ -59367,7 +59367,7 @@
"fileName": "packages/core/supabase-js/src/SupabaseClient.ts",
"line": 66,
"character": 40,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/SupabaseClient.ts#L66"
}
]
}
@@ -72862,7 +72862,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 173,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L173"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L173"
}
],
"typeParameters": [
@@ -79982,7 +79982,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 161,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L161"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L161"
}
],
"typeParameters": [
@@ -80030,7 +80030,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 161,
"character": 51,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L161"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L161"
}
],
"type": {
@@ -80050,7 +80050,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 161,
"character": 49,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L161"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L161"
}
]
}
@@ -80101,7 +80101,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 162,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L162"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L162"
}
],
"type": {
@@ -80130,7 +80130,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 160,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L160"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L160"
}
],
"typeParameters": [
@@ -86905,7 +86905,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 28,
"character": 12,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L28"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L28"
}
],
"typeParameters": [
@@ -86955,7 +86955,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 154,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L154"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L154"
}
],
"type": {
@@ -86971,7 +86971,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 154,
"character": 16,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L154"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L154"
}
],
"signatures": [
@@ -87023,7 +87023,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 61,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L61"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L61"
}
],
"type": {
@@ -87056,7 +87056,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 65,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L65"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L65"
}
],
"type": {
@@ -87085,7 +87085,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 115,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L115"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L115"
}
],
"type": {
@@ -87138,7 +87138,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"type": {
@@ -87161,7 +87161,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 36,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"signatures": [
@@ -87207,7 +87207,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 55,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"indexSignatures": [
@@ -87222,7 +87222,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 95,
"character": 57,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L95"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L95"
}
],
"parameters": [
@@ -87280,7 +87280,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 111,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L111"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L111"
}
],
"type": {
@@ -87322,7 +87322,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 121,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L121"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L121"
}
],
"type": {
@@ -87363,7 +87363,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 73,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L73"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L73"
}
],
"type": {
@@ -87392,7 +87392,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 99,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L99"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L99"
}
],
"type": {
@@ -87433,7 +87433,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 69,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L69"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L69"
}
],
"type": {
@@ -87462,7 +87462,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 126,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L126"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L126"
}
],
"type": {
@@ -87504,7 +87504,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 107,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L107"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L107"
}
],
"type": {
@@ -87536,7 +87536,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 61,
"character": 9,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L61"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L61"
}
]
}
@@ -87571,7 +87571,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 32,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L32"
}
],
"type": {
@@ -87596,7 +87596,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 33,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L33"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L33"
}
],
"type": {
@@ -87640,7 +87640,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 45,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L45"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L45"
}
],
"type": {
@@ -87681,7 +87681,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 58,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L58"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L58"
}
],
"type": {
@@ -87701,7 +87701,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 32,
"character": 7,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L32"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L32"
}
]
}
@@ -87720,7 +87720,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 133,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L133"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L133"
}
],
"type": {
@@ -87761,7 +87761,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 137,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L137"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L137"
}
],
"type": {
@@ -87795,7 +87795,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 141,
"character": 4,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L141"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L141"
}
],
"type": {
@@ -87830,7 +87830,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 133,
"character": 11,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L133"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L133"
}
]
}
@@ -87857,7 +87857,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 131,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L131"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L131"
}
],
"type": {
@@ -87880,7 +87880,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 132,
"character": 2,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L132"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L132"
}
],
"type": {
@@ -87905,7 +87905,7 @@
"fileName": "packages/core/supabase-js/src/lib/types.ts",
"line": 28,
"character": 48,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/lib/types.ts#L28"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/lib/types.ts#L28"
}
]
}
@@ -89419,7 +89419,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 46,
"character": 13,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L46"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L46"
}
],
"signatures": [
@@ -89434,7 +89434,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 46,
"character": 28,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L46"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L46"
}
],
"typeParameters": [
@@ -89482,7 +89482,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 50,
"character": 8,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L50"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L50"
}
],
"type": {
@@ -89502,7 +89502,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 50,
"character": 6,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L50"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L50"
}
]
}
@@ -90715,7 +90715,7 @@
"fileName": "packages/core/supabase-js/src/index.ts",
"line": 1,
"character": 0,
"url": "https://github.com/supabase/supabase-js/blob/897fb8e9d288e74dd47e765b5d6ec647e765a3cb/packages/core/supabase-js/src/index.ts#L1"
"url": "https://github.com/supabase/supabase-js/blob/116fe12c648f156d2748487abbf82a7e662d35bb/packages/core/supabase-js/src/index.ts#L1"
}
]
}
+7 -1
View File
@@ -740,6 +740,7 @@
"application/json": {
"schema": {
"type": "object",
"minProperties": 1,
"properties": {
"public": { "type": "boolean", "example": false },
"file_size_limit": {
@@ -753,7 +754,12 @@
"nullable": true,
"items": { "type": "string", "example": ["image/png", "image/jpg"] }
}
}
},
"anyOf": [
{ "required": ["public"] },
{ "required": ["file_size_limit"] },
{ "required": ["allowed_mime_types"] }
]
}
}
}
@@ -947,7 +947,7 @@
},
"/v1/projects": {
"get": {
"description": "Returns a list of all projects you've previously created.\n\nUse `/v1/organizations/{slug}/projects` instead when possible to get more precise results and pagination support.",
"description": "Returns a list of all projects you've previously created.",
"operationId": "v1-list-all-projects",
"parameters": [],
"responses": {
@@ -1054,6 +1054,15 @@
}
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
}
},
"security": [
@@ -1321,6 +1330,15 @@
}
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
}
},
"security": [
@@ -1610,6 +1628,15 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Unexpected error listing organizations"
}
@@ -1685,6 +1712,15 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Unexpected error creating an organization"
}
@@ -2050,6 +2086,15 @@
"responses": {
"204": {
"description": ""
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
}
},
"security": [
@@ -2220,6 +2265,15 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Failed to list user's SQL snippets"
}
@@ -2366,6 +2420,15 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Failed to retrieve SQL snippet"
}
@@ -4010,15 +4073,6 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Failed to retrieve database branches"
}
@@ -4258,15 +4312,6 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Failed to create database branch"
}
@@ -4486,15 +4531,6 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Failed to fetch database branch"
}
@@ -22362,6 +22398,15 @@
}
}
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden action"
},
"429": {
"description": "Rate limit exceeded"
},
"500": {
"description": "Failed to retrieve projects"
}
@@ -22650,126 +22695,6 @@
},
"required": ["message"]
},
"V1ListProjectsPaginatedResponse": {
"type": "object",
"properties": {
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"cloud_provider": {
"type": "string"
},
"inserted_at": {
"type": "string",
"nullable": true
},
"name": {
"type": "string"
},
"organization_id": {
"type": "number"
},
"organization_slug": {
"type": "string"
},
"ref": {
"type": "string"
},
"region": {
"type": "string"
},
"status": {
"type": "string"
},
"subscription_id": {
"type": "string",
"nullable": true
},
"is_branch_enabled": {
"type": "boolean"
},
"is_physical_backups_enabled": {
"type": "boolean",
"nullable": true
},
"preview_branch_refs": {
"type": "array",
"items": {
"type": "string"
}
},
"disk_volume_size_gb": {
"type": "number"
},
"infra_compute_size": {
"type": "string",
"enum": [
"pico",
"nano",
"micro",
"small",
"medium",
"large",
"xlarge",
"2xlarge",
"4xlarge",
"8xlarge",
"12xlarge",
"16xlarge",
"24xlarge",
"24xlarge_optimized_memory",
"24xlarge_optimized_cpu",
"24xlarge_high_memory",
"48xlarge",
"48xlarge_optimized_memory",
"48xlarge_optimized_cpu",
"48xlarge_high_memory"
]
}
},
"required": [
"id",
"cloud_provider",
"inserted_at",
"name",
"organization_id",
"organization_slug",
"ref",
"region",
"status",
"subscription_id",
"is_branch_enabled",
"is_physical_backups_enabled",
"preview_branch_refs"
]
}
},
"pagination": {
"type": "object",
"properties": {
"count": {
"type": "number",
"description": "Total number of projects. Use this to calculate the total number of pages."
},
"limit": {
"type": "number",
"description": "Maximum number of projects per page (actual number may be less)"
},
"offset": {
"type": "number",
"description": "Number of projects skipped in this response"
}
},
"required": ["count", "limit", "offset"]
}
},
"required": ["projects", "pagination"]
},
"V1ProjectWithDatabaseResponse": {
"type": "object",
"properties": {
@@ -1215,6 +1215,7 @@
"application/json": {
"schema": {
"type": "object",
"minProperties": 1,
"properties": {
"public": {
"type": "boolean",
@@ -1243,7 +1244,18 @@
"example": ["image/png", "image/jpg"]
}
}
}
},
"anyOf": [
{
"required": ["public"]
},
{
"required": ["file_size_limit"]
},
{
"required": ["allowed_mime_types"]
}
]
}
}
}
@@ -0,0 +1,58 @@
import { cn } from 'ui'
import { formatCurrency } from '@/lib/helpers'
export interface ChargeBreakdownProps {
subtotal: number
total: number
tax?: { amount: number; percentage: number }
taxStatus?: 'calculated' | 'failed' | 'not_applicable'
isFetching: boolean
}
export const ChargeBreakdown = ({
subtotal,
total,
tax,
taxStatus,
isFetching,
}: ChargeBreakdownProps) => {
return (
<div
className={cn('text-foreground-light text-sm transition-opacity', isFetching && 'opacity-50')}
>
{total !== subtotal && (
<div className="flex items-center justify-between gap-2 border-b border-muted text-sm">
<div className="py-2">Subtotal</div>
<div className="py-2 text-right tabular-nums" translate="no">
{formatCurrency(subtotal)}
</div>
</div>
)}
{taxStatus === 'calculated' && tax && tax.amount > 0 && (
<div className="flex items-center justify-between gap-2 border-b border-muted text-sm">
<div className="py-2">Tax ({tax.percentage}%)</div>
<div className="py-2 text-right tabular-nums" translate="no">
{formatCurrency(tax.amount)}
</div>
</div>
)}
{taxStatus === 'failed' && (
<div className="flex items-center justify-between gap-2 border-b border-muted text-sm">
<div className="py-2 text-foreground-lighter">
Tax could not be estimated and may be applied separately
</div>
</div>
)}
<div className="flex items-center justify-between gap-2 text-foreground text-base">
<div className="py-2">Total due today</div>
<div className="py-2 text-right tabular-nums" translate="no">
{formatCurrency(total)}
</div>
</div>
</div>
)
}
@@ -92,7 +92,6 @@ export const RestoreToNewProject = () => {
enabled: PHYSICAL_BACKUPS_ENABLED || PITR_ENABLED,
}
)
const IS_CLONED_PROJECT = cloneStatus?.cloned_from?.source_project?.ref ? true : false
const isLoading = !isPermissionsLoaded || cloneBackupsLoading || cloneStatusLoading
useEffect(() => {
@@ -186,22 +185,6 @@ export const RestoreToNewProject = () => {
return <GenericSkeletonLoader />
}
if (IS_CLONED_PROJECT) {
return (
<Admonition type="default" title="This project cannot be restored to a new project">
<Markdown
className="max-w-full [&>p]:!leading-normal"
content={`This is a temporary limitation whereby projects that were originally restored from another project cannot be restored to yet another project.`}
/>
<Button asChild type="default">
<Link href={`/project/${cloneStatus?.cloned_from?.source_project?.ref || ''}`}>
Go to original project
</Link>
</Button>
</Admonition>
)
}
if (isError) {
return <AlertError error={error} subject="Failed to retrieve backups" />
}
@@ -319,7 +319,9 @@ export const QueuesSettings = () => {
</FormPanelContent>
<FormPanelFooter className="flex px-8 py-4 flex items-center justify-between">
<DocsButton href="https://github.com/tembo-io/pgmq?tab=readme-ov-file#sql-examples" />
<DocsButton
href={`${DOCS_URL}/guides/queues/quickstart#expose-queues-to-client-side-consumers`}
/>
<div className="flex items-center gap-x-2">
<Button
type="default"
@@ -5,7 +5,7 @@ import type {
StripeAddressElementOptions,
} from '@stripe/stripe-js'
import { Check, ChevronsUpDown, Info, X } from 'lucide-react'
import { useId, useMemo, useState } from 'react'
import { useEffect, useId, useMemo, useRef, useState } from 'react'
import { UseFormReturn } from 'react-hook-form'
import {
Button,
@@ -87,6 +87,23 @@ export const BillingCustomerDataForm = ({
)
}, [addressCountry])
// Clear tax ID fields when the billing country changes so a stale tax ID
// from the previous country doesn't persist under the new one.
const prevCountryRef = useRef(addressCountry)
useEffect(() => {
if (!addressCountry) return
const isCountryChange =
prevCountryRef.current !== undefined && prevCountryRef.current !== addressCountry
prevCountryRef.current = addressCountry
if (isCountryChange) {
form.setValue('tax_id_type', '', { shouldDirty: true })
form.setValue('tax_id_value', '', { shouldDirty: true })
form.setValue('tax_id_name', '', { shouldDirty: true })
}
}, [addressCountry, form])
return (
<div className={cn('flex flex-col space-y-4', className)}>
<div className={cn('relative', disabled && 'opacity-50')}>
@@ -4,6 +4,7 @@ import { Elements } from '@stripe/react-stripe-js'
import { loadStripe, PaymentIntentResult } from '@stripe/stripe-js'
import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants'
import { useQueryClient } from '@tanstack/react-query'
import { useDebounce } from '@uidotdev/usehooks'
import { AlertCircle, Info } from 'lucide-react'
import { useTheme } from 'next-themes'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
@@ -32,12 +33,15 @@ import { z } from 'zod'
import type { PaymentMethodElementRef } from '../../Billing/Payment/PaymentMethods/NewPaymentMethodElement'
import PaymentMethodSelection from './Subscription/PaymentMethodSelection'
import { ChargeBreakdown } from '@/components/interfaces/Billing/ChargeBreakdown'
import { getStripeElementsAppearanceOptions } from '@/components/interfaces/Billing/Payment/Payment.utils'
import { PaymentConfirmation } from '@/components/interfaces/Billing/Payment/PaymentConfirmation'
import { NO_PROJECT_MARKER } from '@/components/interfaces/Support/SupportForm.utils'
import { SupportLink } from '@/components/interfaces/Support/SupportLink'
import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
import { useOrganizationCreditTopUpMutation } from '@/data/organizations/organization-credit-top-up-mutation'
import { useCreditTopUpPreview } from '@/data/organizations/organization-credit-top-up-preview'
import type { CustomerAddress, CustomerTaxId } from '@/data/organizations/types'
import { subscriptionKeys } from '@/data/subscriptions/keys'
import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
import { STRIPE_PUBLIC_KEY } from '@/lib/constants'
@@ -45,12 +49,14 @@ import { STRIPE_PUBLIC_KEY } from '@/lib/constants'
const stripePromise = loadStripe(STRIPE_PUBLIC_KEY)
const FORM_ID = 'credit-top-up'
const MIN_TOP_UP_AMOUNT = 300
const MAX_TOP_UP_AMOUNT = 2000
const FormSchema = z.object({
amount: z.coerce
.number()
.gte(300, 'Amount must be between $300 - $2000.')
.lte(2000, 'Amount must be between $300 - $2000.')
.gte(MIN_TOP_UP_AMOUNT, `Amount must be between $${MIN_TOP_UP_AMOUNT} - $${MAX_TOP_UP_AMOUNT}.`)
.lte(MAX_TOP_UP_AMOUNT, `Amount must be between $${MIN_TOP_UP_AMOUNT} - $${MAX_TOP_UP_AMOUNT}.`)
.int('Amount must be a whole number.'),
paymentMethod: z.string(),
})
@@ -87,6 +93,52 @@ export const CreditTopUp = ({ slug }: { slug: string | undefined }) => {
const [topUpModalVisible, setTopUpModalVisible] = useState(false)
const [useAsDefaultBillingAddress, setUseAsDefaultBillingAddress] = useState(true)
const [paymentConfirmationLoading, setPaymentConfirmationLoading] = useState(false)
const [latestAddress, setLatestAddress] = useState<CustomerAddress>()
const [latestTaxId, setLatestTaxId] = useState<CustomerTaxId | null>()
const billingAddress = useAsDefaultBillingAddress ? latestAddress : undefined
const billingTaxId = useAsDefaultBillingAddress ? latestTaxId : null
const debouncedAddress = useDebounce(billingAddress, 1000)
const debouncedTaxId = useDebounce(billingTaxId, 1000)
const watchedAmount = form.watch('amount')
const debouncedAmount = useDebounce(watchedAmount, 1000)
const parsedAmount = Number(debouncedAmount)
const validAmount =
!Number.isNaN(parsedAmount) &&
Number.isInteger(parsedAmount) &&
parsedAmount >= MIN_TOP_UP_AMOUNT &&
parsedAmount <= MAX_TOP_UP_AMOUNT
? parsedAmount
: undefined
const isPreviewStale =
watchedAmount !== debouncedAmount ||
billingAddress !== debouncedAddress ||
billingTaxId !== debouncedTaxId
const handleAddressChange = useCallback((address: CustomerAddress) => {
setLatestAddress(address)
}, [])
const handleTaxIdChange = useCallback((taxId: CustomerTaxId | null) => {
setLatestTaxId(taxId)
}, [])
const {
data: creditPreview,
isFetching: creditPreviewIsFetching,
isSuccess: creditPreviewInitialized,
} = useCreditTopUpPreview(
{
slug,
amount: validAmount,
address: debouncedAddress,
taxId: debouncedTaxId ?? undefined,
},
{ enabled: topUpModalVisible && !!validAmount }
)
const [captchaToken, setCaptchaToken] = useState<string | null>(null)
const [captchaRef, setCaptchaRef] = useState<HCaptcha | null>(null)
@@ -175,6 +227,8 @@ export const CreditTopUp = ({ slug }: { slug: string | undefined }) => {
setCaptchaRef(null)
setPaymentIntentConfirmation(undefined)
setPaymentIntentSecret('')
setLatestAddress(undefined)
setLatestTaxId(null)
}
}
@@ -288,6 +342,8 @@ export const CreditTopUp = ({ slug }: { slug: string | undefined }) => {
readOnly={executingTopUp || paymentConfirmationLoading}
useAsDefaultBillingAddress={useAsDefaultBillingAddress}
onUseAsDefaultBillingAddressChange={setUseAsDefaultBillingAddress}
onAddressChange={handleAddressChange}
onTaxIdChange={handleTaxIdChange}
/>
)}
/>
@@ -324,6 +380,25 @@ export const CreditTopUp = ({ slug }: { slug: string | undefined }) => {
</AlertDescription_Shadcn_>
</Alert_Shadcn_>
)}
{creditPreviewInitialized && !!validAmount && (
<div className="mt-4">
<ChargeBreakdown
subtotal={creditPreview.amount}
total={creditPreview.total}
tax={
creditPreview.tax
? {
amount: creditPreview.tax.tax_amount,
percentage: creditPreview.tax.tax_rate_percentage,
}
: undefined
}
taxStatus={creditPreview.tax_status}
isFetching={creditPreviewIsFetching}
/>
</div>
)}
</DialogSection>
{!paymentIntentConfirmation?.paymentIntent && (
@@ -332,6 +407,7 @@ export const CreditTopUp = ({ slug }: { slug: string | undefined }) => {
htmlType="submit"
type="primary"
loading={executingTopUp || paymentConfirmationLoading}
disabled={isPreviewStale || creditPreviewIsFetching}
>
Top Up
</Button>
@@ -31,6 +31,14 @@ import { Admonition } from 'ui-patterns/admonition'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import * as z from 'zod'
import {
BatchInvitationResult,
buildProjectPayload,
buildSsoPayload,
categorizeInviteEmails,
emailSchema,
parseEmails,
} from './InviteMemberButton.utils'
import { useGetRolesManagementPermissions } from './TeamSettings.utils'
import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog'
import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
@@ -50,13 +58,6 @@ import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose'
import { DOCS_URL } from '@/lib/constants'
import { useProfile } from '@/lib/profile'
function parseEmails(value: string): string[] {
return value
.split(',')
.map((e) => e.trim())
.filter(Boolean)
}
export const InviteMemberButton = () => {
const { slug } = useParams()
const { profile } = useProfile()
@@ -115,33 +116,23 @@ export const InviteMemberButton = () => {
const { mutateAsync: inviteMemberAsync, isPending: isInviting } =
useOrganizationCreateInvitationMutation()
const emailSchema = z
.string()
.min(1, 'At least one email address is required')
.refine(
(val) => {
const emails = parseEmails(val)
if (emails.length === 0) return false
return emails.every((e) => z.string().email().safeParse(e).success)
},
(val) => {
const emails = parseEmails(val)
const invalid = emails.find((e) => !z.string().email().safeParse(e).success)
return {
message: invalid
? `Invalid email address: ${invalid}`
: 'At least one email address is required',
}
const FormSchema = z
.object({
email: emailSchema,
role: z.string().min(1, 'Role is required'),
applyToOrg: z.boolean(),
projectRef: z.string(),
requireSso: z.enum(['auto', 'sso', 'non-sso']),
})
.superRefine((data, ctx) => {
if (!data.applyToOrg && !data.projectRef) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'A project must be selected',
path: ['projectRef'],
})
}
)
const FormSchema = z.object({
email: emailSchema,
role: z.string().min(1, 'Role is required'),
applyToOrg: z.boolean(),
projectRef: z.string(),
requireSso: z.enum(['auto', 'sso', 'non-sso']),
})
})
const form = useForm<z.infer<typeof FormSchema>>({
mode: 'onSubmit',
@@ -159,22 +150,10 @@ export const InviteMemberButton = () => {
if (profile?.id === undefined) return console.error('Profile ID required')
const emails = parseEmails(values.email).map((e) => e.toLowerCase())
const alreadyInvited: string[] = []
const alreadyMembers: string[] = []
const toInvite: string[] = []
for (const emailAddress of emails) {
const existingMember = (members ?? []).find((member) => member.primary_email === emailAddress)
if (existingMember !== undefined) {
if (existingMember.invited_id) {
alreadyInvited.push(emailAddress)
} else {
alreadyMembers.push(emailAddress)
}
} else {
toInvite.push(emailAddress)
}
}
const { alreadyInvited, alreadyMembers, toInvite } = categorizeInviteEmails(
emails,
members ?? []
)
if (alreadyInvited.length > 0) {
toast.error(
@@ -194,47 +173,39 @@ export const InviteMemberButton = () => {
if (toInvite.length === 0) return
}
const projectPayload =
!values.applyToOrg && values.projectRef ? { projects: [values.projectRef] } : {}
const projectPayload = buildProjectPayload(values.applyToOrg, values.projectRef)
const ssoPayload = buildSsoPayload(values.requireSso)
// Transform SSO preference to backend format
const ssoPayload =
values.requireSso === 'sso'
? { requireSso: true }
: values.requireSso === 'non-sso'
? { requireSso: false }
: {} // 'auto' - let backend use automatic behavior
const results = await Promise.allSettled(
toInvite.map((emailAddress) =>
inviteMemberAsync({
slug,
email: emailAddress,
roleId: Number(values.role),
...projectPayload,
...ssoPayload,
})
)
)
const successCount = results.filter((r) => r.status === 'fulfilled').length
const failedEmails = toInvite.filter((_, i) => results[i].status === 'rejected')
if (successCount > 0) {
toast.success(
successCount === 1
? 'Successfully sent invitation to new member'
: `Successfully sent invitations to ${successCount} new members`
)
closeInviteDialog()
let result: BatchInvitationResult
try {
result = (await inviteMemberAsync({
slug,
emails: toInvite,
roleId: Number(values.role),
...projectPayload,
...ssoPayload,
})) as BatchInvitationResult
} catch {
return // onError callback already showed the toast
}
if (failedEmails.length > 0) {
toast.error(
failedEmails.length === 1
? `Failed to send invitation to ${failedEmails[0]}`
: `Failed to send invitations to ${failedEmails.length} emails`
const { succeeded, failed } = result
if (succeeded.length > 0) {
toast.success(
succeeded.length === 1
? 'Successfully sent invitation to new member'
: `Successfully sent invitations to ${succeeded.length} new members`
)
}
for (const { email, error } of failed) {
toast.error(`Failed to invite ${email}: ${error}`)
}
if (succeeded.length > 0) {
closeInviteDialog()
}
}
useEffect(() => {
@@ -0,0 +1,109 @@
import * as z from 'zod'
import type { OrganizationMember } from '@/data/organizations/organization-members-query'
export const MAX_BATCH_INVITE_SIZE = 50
/** Max characters to show when an invalid token is long (e.g. comma-less paste of many addresses). */
const MAX_INVALID_EMAIL_SNIPPET_LENGTH = 120
function formatInvalidEmailSnippet(token: string): string {
if (token.length <= MAX_INVALID_EMAIL_SNIPPET_LENGTH) return token
return `${token.slice(0, MAX_INVALID_EMAIL_SNIPPET_LENGTH)}…`
}
export const emailSchema = z
.string()
.min(1, 'At least one email address is required')
.refine(
(val) => {
const emails = parseEmails(val)
if (emails.length === 0) return false
return emails.every((e) => z.string().email().safeParse(e).success)
},
(val) => {
const emails = parseEmails(val)
const invalid = emails.find((e) => !z.string().email().safeParse(e).success)
return {
message: invalid
? `Invalid email address: "${formatInvalidEmailSnippet(invalid)}"`
: 'At least one email address is required',
}
}
)
.refine(
(val) => parseEmails(val).length <= MAX_BATCH_INVITE_SIZE,
(val) => {
const count = parseEmails(val).length
return {
message: `You can invite up to ${MAX_BATCH_INVITE_SIZE} members at a time. Remove ${count - MAX_BATCH_INVITE_SIZE} email ${count - MAX_BATCH_INVITE_SIZE === 1 ? 'address' : 'addresses'} to continue.`,
}
}
)
export function parseEmails(value: string): string[] {
const emails = value
.split(/[\s,]+/)
.map((e) => e.trim().toLowerCase())
.filter(Boolean)
return [...new Set(emails)]
}
export type CategorizedEmails = {
alreadyInvited: string[]
alreadyMembers: string[]
toInvite: string[]
}
export type BatchInvitationFailure = {
email: string
error: string
}
export type BatchInvitationResult = {
succeeded: string[]
failed: BatchInvitationFailure[]
}
export function categorizeInviteEmails(
emails: string[],
members: OrganizationMember[]
): CategorizedEmails {
const alreadyInvited: string[] = []
const alreadyMembers: string[] = []
const toInvite: string[] = []
for (const email of emails) {
const existingMember = members.find((m) => m.primary_email === email)
if (existingMember !== undefined) {
if (existingMember.invited_id) {
alreadyInvited.push(email)
} else {
alreadyMembers.push(email)
}
} else {
toInvite.push(email)
}
}
return { alreadyInvited, alreadyMembers, toInvite }
}
export function buildProjectPayload(
applyToOrg: boolean,
projectRef: string
): { projects: string[] } | Record<string, never> {
if (applyToOrg) return {}
if (!projectRef) {
throw new Error('projectRef is required when applyToOrg is false')
}
return { projects: [projectRef] }
}
export function buildSsoPayload(
requireSso: 'auto' | 'sso' | 'non-sso'
): { requireSso: boolean } | Record<string, never> {
if (requireSso === 'sso') return { requireSso: true }
if (requireSso === 'non-sso') return { requireSso: false }
return {}
}
@@ -128,12 +128,12 @@ export const MemberActions = ({ member }: MemberActionsProps) => {
const projects = projectScopedRole.projects.map(({ ref }) => ref)
inviteMember({
slug,
email: member.primary_email,
emails: [member.primary_email],
roleId: projectScopedRole.base_role_id,
projects,
})
} else {
inviteMember({ slug, email: member.primary_email, roleId })
inviteMember({ slug, emails: [member.primary_email], roleId })
}
},
}
@@ -137,6 +137,13 @@ export const GitHubIntegrationConnectionForm = ({
onSuccess: () => {
toast.success('GitHub integration successfully updated')
},
onError: (error) => {
// Don't show error toast when connection already exists - the branch
// settings update will still proceed and show its own success toast
if (!error.message?.includes('already exists')) {
toast.error(`Failed to create GitHub connection: ${error.message}`)
}
},
})
const { mutateAsync: deleteConnection, isPending: isDeletingConnection } =
+39 -11
View File
@@ -27,6 +27,7 @@ import {
useSidebar,
} from 'ui'
import { Shortcut } from '../ui/Shortcut'
import { Route } from '../ui/ui.types'
import {
useIsPlatformWebhooksEnabled,
@@ -47,6 +48,7 @@ import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage'
import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
import { useAppStateSnapshot } from '@/state/app-state'
import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
export const ICON_SIZE = 32
export const ICON_STROKE_WIDTH = 1.5
@@ -167,14 +169,23 @@ export function SideBarNavLink({
active?: boolean
onClick?: () => void
} & ComponentPropsWithoutRef<typeof SidebarMenuButton>) {
const router = useRouter()
const { state: sidebarState } = useSidebar()
const [sidebarBehaviour] = useLocalStorageQuery(
LOCAL_STORAGE_KEYS.SIDEBAR_BEHAVIOR,
DEFAULT_SIDEBAR_BEHAVIOR
)
const isActiveLink = !!(route.link && !route.disabled)
const hasShortcut = !!(route.shortcutId && isActiveLink)
// Collapsed: show immediately (replaces the old label-only tooltip
// that used to surface the name of an icon-only item). Expanded:
// slight delay so the tooltip doesn't flash while skimming the nav.
const shortcutPopoverDelay = sidebarState === 'collapsed' ? 0 : 1000
const buttonProps = {
disabled: route.disabled,
tooltip: sidebarBehaviour === 'closed' ? route.label : '',
isActive: active,
className: cn('text-sm', sidebarBehaviour === 'open' ? '!px-2' : ''),
size: 'default' as const,
@@ -190,14 +201,27 @@ export function SideBarNavLink({
</>
)
const button = isActiveLink ? (
<SidebarMenuButton {...buttonProps} asChild>
<Link href={route.link!}>{content}</Link>
</SidebarMenuButton>
) : (
<SidebarMenuButton {...buttonProps}>{content}</SidebarMenuButton>
)
return (
<SidebarMenuItem>
{route.link && !route.disabled ? (
<SidebarMenuButton {...buttonProps} asChild>
<Link href={route.link}>{content}</Link>
</SidebarMenuButton>
{hasShortcut ? (
<Shortcut
id={route.shortcutId!}
onTrigger={() => router.push(route.link!)}
side="right"
delayDuration={shortcutPopoverDelay}
>
{button}
</Shortcut>
) : (
<SidebarMenuButton {...buttonProps}>{content}</SidebarMenuButton>
button
)}
</SidebarMenuItem>
)
@@ -218,13 +242,9 @@ const ProjectLinks = () => {
const router = useRouter()
const { ref } = useParams()
const { data: project } = useSelectedProjectQuery()
const { data: org } = useSelectedOrganizationQuery()
const snap = useAppStateSnapshot()
const { securityLints, errorLints } = useLints()
const showReports = useIsFeatureEnabled('reports:all')
const { mutate: sendEvent } = useSendEventMutation()
const platformWebhooksEnabled = useIsPlatformWebhooksEnabled()
const { isEnabled: isUnifiedLogsEnabled } = useUnifiedLogsPreview()
const activeRoute = router.pathname.split('/')[3]
@@ -269,6 +289,7 @@ const ProjectLinks = () => {
icon: <Home size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: `/project/${ref}`,
linkElement: <ProjectIndexPageLink projectRef={ref} />,
shortcutId: SHORTCUT_IDS.NAV_HOME,
}}
/>
{toolRoutes.map((route, i) => (
@@ -291,7 +312,7 @@ const ProjectLinks = () => {
</SidebarGroup>
<Separator className="w-[calc(100%-1rem)] mx-auto" />
<SidebarGroup className="gap-0.5">
{otherRoutes.map((route, i) => {
{otherRoutes.map((route) => {
if (route.key === 'advisors') {
return (
<div className="relative" key={route.key}>
@@ -354,24 +375,28 @@ const OrganizationLinks = () => {
href: `/org/${organizationSlug}`,
key: 'projects',
icon: <Boxes size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
shortcutId: SHORTCUT_IDS.NAV_ORG_PROJECTS,
},
{
label: 'Team',
href: `/org/${organizationSlug}/team`,
key: 'team',
icon: <Users size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
shortcutId: SHORTCUT_IDS.NAV_ORG_TEAM,
},
{
label: 'Integrations',
href: `/org/${organizationSlug}/integrations`,
key: 'integrations',
icon: <Blocks size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
shortcutId: SHORTCUT_IDS.NAV_ORG_INTEGRATIONS,
},
{
label: 'Usage',
href: `/org/${organizationSlug}/usage`,
key: 'usage',
icon: <ChartArea size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
shortcutId: SHORTCUT_IDS.NAV_ORG_USAGE,
},
...(showBilling
? [
@@ -380,6 +405,7 @@ const OrganizationLinks = () => {
href: `/org/${organizationSlug}/billing`,
key: 'billing',
icon: <Receipt size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
shortcutId: SHORTCUT_IDS.NAV_ORG_BILLING,
},
]
: []),
@@ -388,6 +414,7 @@ const OrganizationLinks = () => {
href: `/org/${organizationSlug}/general`,
key: 'settings',
icon: <Settings size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
shortcutId: SHORTCUT_IDS.NAV_ORG_SETTINGS,
},
]
@@ -412,6 +439,7 @@ const OrganizationLinks = () => {
key: item.label,
icon: item.icon,
disabled: disableAccessMfa,
shortcutId: item.shortcutId,
}}
/>
))}
@@ -6,6 +6,7 @@ import type { Route } from '@/components/ui/ui.types'
import { EditorIndexPageLink } from '@/data/prefetchers/project.$ref.editor'
import type { Project } from '@/data/projects/project-detail-query'
import { IS_PLATFORM, PROJECT_STATUS } from '@/lib/constants'
import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
interface RouteContext {
ref?: string
@@ -52,6 +53,7 @@ export const generateToolRoutes = (ref?: string, project?: Project): Route[] =>
icon: <TableEditor size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/editor`),
linkElement: <EditorIndexPageLink projectRef={ref} />,
shortcutId: SHORTCUT_IDS.NAV_TABLE_EDITOR,
},
{
key: 'sql',
@@ -59,6 +61,7 @@ export const generateToolRoutes = (ref?: string, project?: Project): Route[] =>
disabled: !isProjectActive,
icon: <SqlEditor size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/sql`),
shortcutId: SHORTCUT_IDS.NAV_SQL_EDITOR,
},
]
}
@@ -89,6 +92,7 @@ export const generateProductRoutes = (
: isProjectActive
? `/project/${ref}/database/schemas`
: `/project/${ref}/database/backups/scheduled`),
shortcutId: SHORTCUT_IDS.NAV_DATABASE,
},
...(authEnabled
? [
@@ -104,6 +108,7 @@ export const generateProductRoutes = (
: authOverviewPageEnabled
? `/project/${ref}/auth/overview`
: `/project/${ref}/auth/users`),
shortcutId: SHORTCUT_IDS.NAV_AUTH,
},
]
: []),
@@ -115,6 +120,7 @@ export const generateProductRoutes = (
disabled: !isProjectActive,
icon: <Storage size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/storage/files`),
shortcutId: SHORTCUT_IDS.NAV_STORAGE,
},
]
: []),
@@ -126,6 +132,7 @@ export const generateProductRoutes = (
disabled: false,
icon: <EdgeFunctions size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && `/project/${ref}/functions`,
shortcutId: SHORTCUT_IDS.NAV_FUNCTIONS,
},
]
: []),
@@ -137,6 +144,7 @@ export const generateProductRoutes = (
disabled: !isProjectActive,
icon: <Realtime size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/realtime/inspector`),
shortcutId: SHORTCUT_IDS.NAV_REALTIME,
},
]
: []),
@@ -160,6 +168,7 @@ export const generateOtherRoutes = (
disabled: !isProjectActive,
icon: <Lightbulb size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/advisors/security`),
shortcutId: SHORTCUT_IDS.NAV_ADVISORS,
},
// Observability is only available on the platform, not for self-hosted/CLI
...(isPlatform && reportsEnabled
@@ -170,6 +179,7 @@ export const generateOtherRoutes = (
disabled: !isProjectActive,
icon: <Telescope size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/observability`),
shortcutId: SHORTCUT_IDS.NAV_OBSERVABILITY,
},
]
: []),
@@ -179,6 +189,7 @@ export const generateOtherRoutes = (
disabled: false,
icon: <List size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (unifiedLogsEnabled ? `/project/${ref}/logs` : `/project/${ref}/logs/explorer`),
shortcutId: SHORTCUT_IDS.NAV_LOGS,
},
{
key: 'integrations',
@@ -186,6 +197,7 @@ export const generateOtherRoutes = (
disabled: !isProjectActive,
icon: <Blocks size={ICON_SIZE} strokeWidth={ICON_STROKE_WIDTH} />,
link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/integrations`),
shortcutId: SHORTCUT_IDS.NAV_INTEGRATIONS,
},
]
}
@@ -202,6 +214,7 @@ export const generateSettingsRoutes = (ref?: string, features?: SettingsFeatures
ref &&
(isPlatform ? `/project/${ref}/settings/general` : `/project/${ref}/settings/log-drains`),
disabled: false,
shortcutId: SHORTCUT_IDS.NAV_SETTINGS,
},
]
}
+197
View File
@@ -0,0 +1,197 @@
import { fireEvent, render, screen } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { Shortcut } from './Shortcut'
import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
const { mockUseShortcut, mockShortcutTooltip } = vi.hoisted(() => ({
mockUseShortcut: vi.fn(),
mockShortcutTooltip: vi.fn((props: any) => (
<div data-testid="shortcut-tooltip">{props.children}</div>
)),
}))
vi.mock('@/state/shortcuts/useShortcut', () => ({
useShortcut: mockUseShortcut,
}))
vi.mock('./ShortcutTooltip', () => ({
ShortcutTooltip: mockShortcutTooltip,
}))
describe('Shortcut', () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe('rendering', () => {
it('renders the wrapped child', () => {
render(
<Shortcut id={SHORTCUT_IDS.COMMAND_MENU_OPEN} onTrigger={() => {}}>
<button>Open</button>
</Shortcut>
)
expect(screen.getByRole('button', { name: 'Open' })).toBeInTheDocument()
})
it('wraps the child in ShortcutTooltip', () => {
render(
<Shortcut id={SHORTCUT_IDS.COMMAND_MENU_OPEN} onTrigger={() => {}}>
<button>Open</button>
</Shortcut>
)
const tooltip = screen.getByTestId('shortcut-tooltip')
expect(tooltip).toContainElement(screen.getByRole('button', { name: 'Open' }))
})
})
describe('useShortcut wiring', () => {
it('forwards id and onTrigger to useShortcut', () => {
const handler = vi.fn()
render(
<Shortcut id={SHORTCUT_IDS.ACTION_BAR_SAVE} onTrigger={handler}>
<button>Save</button>
</Shortcut>
)
expect(mockUseShortcut).toHaveBeenCalledWith(SHORTCUT_IDS.ACTION_BAR_SAVE, handler, undefined)
})
it('forwards options to useShortcut', () => {
const handler = vi.fn()
const options = { enabled: true, registerInCommandMenu: true }
render(
<Shortcut id={SHORTCUT_IDS.ACTION_BAR_SAVE} onTrigger={handler} options={options}>
<button>Save</button>
</Shortcut>
)
expect(mockUseShortcut).toHaveBeenCalledWith(SHORTCUT_IDS.ACTION_BAR_SAVE, handler, options)
})
it('passes updated options to useShortcut on rerender', () => {
const handler = vi.fn()
const { rerender } = render(
<Shortcut
id={SHORTCUT_IDS.ACTION_BAR_SAVE}
onTrigger={handler}
options={{ enabled: false }}
>
<button>Save</button>
</Shortcut>
)
expect(mockUseShortcut).toHaveBeenLastCalledWith(SHORTCUT_IDS.ACTION_BAR_SAVE, handler, {
enabled: false,
})
rerender(
<Shortcut id={SHORTCUT_IDS.ACTION_BAR_SAVE} onTrigger={handler} options={{ enabled: true }}>
<button>Save</button>
</Shortcut>
)
expect(mockUseShortcut).toHaveBeenLastCalledWith(SHORTCUT_IDS.ACTION_BAR_SAVE, handler, {
enabled: true,
})
})
it('passes updated id to useShortcut on rerender', () => {
const handler = vi.fn()
const { rerender } = render(
<Shortcut id={SHORTCUT_IDS.NAV_HOME} onTrigger={handler}>
<button>Go</button>
</Shortcut>
)
expect(mockUseShortcut).toHaveBeenLastCalledWith(SHORTCUT_IDS.NAV_HOME, handler, undefined)
rerender(
<Shortcut id={SHORTCUT_IDS.NAV_TABLE_EDITOR} onTrigger={handler}>
<button>Go</button>
</Shortcut>
)
expect(mockUseShortcut).toHaveBeenLastCalledWith(
SHORTCUT_IDS.NAV_TABLE_EDITOR,
handler,
undefined
)
})
})
describe('ShortcutTooltip wiring', () => {
it('forwards shortcutId to ShortcutTooltip', () => {
render(
<Shortcut id={SHORTCUT_IDS.NAV_HOME} onTrigger={() => {}}>
<button>Home</button>
</Shortcut>
)
expect(mockShortcutTooltip).toHaveBeenCalled()
expect(mockShortcutTooltip.mock.calls.at(-1)![0].shortcutId).toBe(SHORTCUT_IDS.NAV_HOME)
})
it('forwards tooltip positioning props', () => {
render(
<Shortcut
id={SHORTCUT_IDS.NAV_HOME}
onTrigger={() => {}}
side="right"
align="start"
sideOffset={8}
delayDuration={100}
>
<button>Home</button>
</Shortcut>
)
const props = mockShortcutTooltip.mock.calls.at(-1)![0]
expect(props.side).toBe('right')
expect(props.align).toBe('start')
expect(props.sideOffset).toBe(8)
expect(props.delayDuration).toBe(100)
})
it('forwards label override to ShortcutTooltip', () => {
render(
<Shortcut id={SHORTCUT_IDS.NAV_HOME} onTrigger={() => {}} label="Go home">
<button>Home</button>
</Shortcut>
)
expect(mockShortcutTooltip.mock.calls.at(-1)![0].label).toBe('Go home')
})
it('omits undefined positioning props rather than fabricating them', () => {
render(
<Shortcut id={SHORTCUT_IDS.NAV_HOME} onTrigger={() => {}}>
<button>Home</button>
</Shortcut>
)
const props = mockShortcutTooltip.mock.calls.at(-1)![0]
expect(props.side).toBeUndefined()
expect(props.align).toBeUndefined()
expect(props.sideOffset).toBeUndefined()
expect(props.delayDuration).toBeUndefined()
expect(props.label).toBeUndefined()
})
})
describe('child interactivity', () => {
it('does not intercept clicks on the wrapped child', () => {
const onClick = vi.fn()
const onTrigger = vi.fn()
render(
<Shortcut id={SHORTCUT_IDS.COMMAND_MENU_OPEN} onTrigger={onTrigger}>
<button onClick={onClick}>Open</button>
</Shortcut>
)
fireEvent.click(screen.getByRole('button', { name: 'Open' }))
expect(onClick).toHaveBeenCalledTimes(1)
expect(onTrigger).not.toHaveBeenCalled()
})
it('does not invoke onTrigger during render — only the hotkey should trigger it', () => {
const onTrigger = vi.fn()
render(
<Shortcut id={SHORTCUT_IDS.COMMAND_MENU_OPEN} onTrigger={onTrigger}>
<button>Open</button>
</Shortcut>
)
expect(onTrigger).not.toHaveBeenCalled()
})
})
})
+77
View File
@@ -0,0 +1,77 @@
import { TooltipContentProps } from '@ui/components/shadcn/ui/tooltip'
import type { ReactNode } from 'react'
import { ShortcutTooltip } from './ShortcutTooltip'
import type { ShortcutId } from '@/state/shortcuts/registry'
import type { ShortcutOptions } from '@/state/shortcuts/types'
import { useShortcut } from '@/state/shortcuts/useShortcut'
interface ShortcutProps {
/** Registered shortcut id — drives both the hotkey binding and the tooltip. */
id: ShortcutId
/** Fires on the hotkey. Usually the same handler wired to the child's `onClick`. */
onTrigger: () => void
/** Element to bind the shortcut to and wrap in the tooltip. */
children: ReactNode
/** Per-mount overrides for the shortcut — see `ShortcutOptions`. */
options?: ShortcutOptions
side?: TooltipContentProps['side']
align?: TooltipContentProps['align']
sideOffset?: number
delayDuration?: number
/**
* Override the label from the registry. Use when the wrapped element's
* action is a narrower/contextual variant of the registered shortcut.
*/
label?: string
}
/**
* Bind a registered shortcut to an element AND show its keybind on hover,
* Linear-style. Single source of truth: one `id` drives both the hotkey
* listener and the tooltip, so they can't drift.
*
* The wrapped child stays fully interactive — Radix `asChild` passes clicks,
* focus, and refs through untouched.
*
* @example
* <Shortcut id={SHORTCUT_IDS.RESULTS_COPY_MARKDOWN} onTrigger={handleCopy}>
* <Button onClick={handleCopy}>Copy</Button>
* </Shortcut>
*
* @example
* // Gate the hotkey on local state; tooltip still renders:
* <Shortcut
* id={SHORTCUT_IDS.ACTION_BAR_SAVE}
* onTrigger={handleSave}
* options={{ enabled: hasUnsavedChanges }}
* >
* <Button onClick={handleSave} disabled={!hasUnsavedChanges}>Save</Button>
* </Shortcut>
*/
export const Shortcut = ({
id,
onTrigger,
children,
options,
side,
align,
sideOffset,
delayDuration,
label,
}: ShortcutProps) => {
useShortcut(id, onTrigger, options)
return (
<ShortcutTooltip
shortcutId={id}
side={side}
align={align}
sideOffset={sideOffset}
delayDuration={delayDuration}
label={label}
>
{children}
</ShortcutTooltip>
)
}
@@ -0,0 +1,67 @@
import { TooltipContentProps } from '@ui/components/shadcn/ui/tooltip'
import { Fragment, type ReactNode } from 'react'
import { KeyboardShortcut, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
import { hotkeyToKeys } from '@/state/shortcuts/formatShortcut'
import { SHORTCUT_DEFINITIONS, type ShortcutId } from '@/state/shortcuts/registry'
interface ShortcutTooltipProps {
shortcutId: ShortcutId
children: ReactNode
side?: TooltipContentProps['side']
align?: TooltipContentProps['align']
sideOffset?: number
delayDuration?: number
/**
* Override the label from the registry. Use when the wrapped element's
* action is a narrower/contextual variant of the registered shortcut.
*/
label?: string
}
/**
* Wraps any element to show its bound keyboard shortcut on hover/focus, in the
* style of Linear's shortcut tooltips: `"<label> <key> [then <key>]"`.
*
* Uses Radix's `asChild` trigger, so the wrapped element remains fully
* interactive — clicks, focus, and event handlers pass through untouched.
*
* @example
* <ShortcutTooltip shortcutId={SHORTCUT_IDS.RESULTS_COPY_MARKDOWN}>
* <Button onClick={handleCopy}>Copy</Button>
* </ShortcutTooltip>
*/
export const ShortcutTooltip = ({
shortcutId,
children,
side,
align,
sideOffset,
delayDuration,
label: labelOverride,
}: ShortcutTooltipProps) => {
const def = SHORTCUT_DEFINITIONS[shortcutId]
const label = labelOverride ?? def.label
return (
<Tooltip delayDuration={delayDuration}>
<TooltipTrigger asChild>{children}</TooltipTrigger>
<TooltipContent
side={side}
align={align}
sideOffset={sideOffset}
className="flex items-center gap-2"
>
<span>{label}</span>
<span className="flex items-center gap-1">
{def.sequence.map((step, i) => (
<Fragment key={i}>
{i > 0 && <span className="text-foreground-lighter text-[11px]">then</span>}
<KeyboardShortcut keys={hotkeyToKeys(step)} />
</Fragment>
))}
</span>
</TooltipContent>
</Tooltip>
)
}
+8
View File
@@ -1,5 +1,7 @@
import { ReactNode } from 'react'
import type { ShortcutId } from '@/state/shortcuts/registry'
export interface Route {
key: string
label: string
@@ -8,4 +10,10 @@ export interface Route {
disabled?: boolean
linkElement?: ReactNode
items?: any | Route[]
/**
* Binds a registered keyboard shortcut to this route when set. The sidebar
* entry shows the keybind on hover and jumps to `link` when the shortcut
* fires. Ignored if `link` is not set.
*/
shortcutId?: ShortcutId
}
@@ -9,7 +9,7 @@ import type { ResponseError, UseCustomMutationOptions } from '@/types'
export type OrganizationCreateInvitationVariables = {
slug: string
email: string
emails: string[]
roleId: number
projects?: string[]
requireSso?: boolean
@@ -17,12 +17,12 @@ export type OrganizationCreateInvitationVariables = {
export async function createOrganizationInvitation({
slug,
email,
emails,
roleId,
projects,
requireSso,
}: OrganizationCreateInvitationVariables) {
const payload: components['schemas']['CreateInvitationBody'] = { email, role_id: roleId }
const payload: components['schemas']['CreateInvitationBody'] = { emails, role_id: roleId }
if (projects !== undefined) payload.role_scoped_projects = projects
if (requireSso !== undefined) payload.require_sso = requireSso
@@ -69,7 +69,7 @@ export const useOrganizationCreateInvitationMutation = ({
},
async onError(data, variables, context) {
if (onError === undefined) {
toast.error(`Failed to update member role: ${data.message}`)
toast.error(`Failed to send invitation${data.message ? ': ' + data.message : ''}`)
} else {
onError(data, variables, context)
}
+4
View File
@@ -32,4 +32,8 @@ export const organizationKeys = {
) => ['organizations', 'creation-preview', tier, params] as const,
previewCreditCode: (slug: string | undefined, code: string) =>
['organizations', slug, 'preview-credit-code', code] as const,
creditTopUpPreview: (
slug: string | undefined,
params?: { amount?: number; address?: Record<string, unknown>; taxId?: Record<string, unknown> }
) => ['organizations', slug, 'credits', 'preview', params] as const,
}
@@ -0,0 +1,57 @@
import { keepPreviousData, useQuery } from '@tanstack/react-query'
import { organizationKeys } from './keys'
import type { CustomerAddress, CustomerTaxId } from './types'
import { handleError, post } from '@/data/fetchers'
import type { ResponseError, UseCustomQueryOptions } from '@/types'
export type CreditTopUpPreviewVariables = {
slug?: string
amount?: number
address?: CustomerAddress
taxId?: CustomerTaxId
}
export async function previewCreditTopUp({
slug,
amount,
address,
taxId,
}: CreditTopUpPreviewVariables) {
if (!slug) throw new Error('slug is required')
if (!amount) throw new Error('amount is required')
const { data, error } = await post(`/platform/organizations/{slug}/billing/credits/preview`, {
params: { path: { slug } },
body: {
amount,
...(address && { address }),
...(taxId && { tax_id: taxId }),
},
})
if (error) handleError(error)
return data
}
export type CreditTopUpPreviewData = Awaited<ReturnType<typeof previewCreditTopUp>>
export const useCreditTopUpPreview = <TData = CreditTopUpPreviewData>(
{ slug, amount, address, taxId }: CreditTopUpPreviewVariables,
{
enabled = true,
...options
}: UseCustomQueryOptions<CreditTopUpPreviewData, ResponseError, TData> = {}
) =>
useQuery<CreditTopUpPreviewData, ResponseError, TData>({
queryKey: organizationKeys.creditTopUpPreview(slug, {
amount,
address: address as Record<string, unknown> | undefined,
taxId: taxId as Record<string, unknown> | undefined,
}),
queryFn: () => previewCreditTopUp({ slug, amount, address, taxId }),
enabled: enabled && typeof slug !== 'undefined' && typeof amount !== 'undefined',
placeholderData: keepPreviousData,
...options,
})
+2 -7
View File
@@ -1,4 +1,3 @@
import type { CloudProvider } from 'shared-data'
import { AWS_REGIONS, FLY_REGIONS } from 'shared-data'
import type { components } from '@/data/api'
@@ -36,11 +35,7 @@ export const PRICING_TIER_PRODUCT_IDS = {
}
export function useDefaultProvider() {
const defaultProvider: CloudProvider =
process.env.NEXT_PUBLIC_ENVIRONMENT &&
['staging', 'preview'].includes(process.env.NEXT_PUBLIC_ENVIRONMENT)
? 'AWS_K8S'
: 'AWS'
const defaultProvider = 'AWS'
const { infraCloudProviders: validCloudProviders } = useCustomContent(['infra:cloud_providers'])
@@ -48,7 +43,7 @@ export function useDefaultProvider() {
return defaultProvider
}
return (validCloudProviders?.[0] ?? 'AWS') as CloudProvider
return validCloudProviders?.[0] ?? 'AWS'
}
export const PROVIDERS = {
@@ -0,0 +1,99 @@
import { describe, expect, it } from 'vitest'
import { hotkeyToKeys } from './formatShortcut'
describe('hotkeyToKeys', () => {
describe('single-step hotkeys', () => {
it('returns a single letter key unchanged', () => {
expect(hotkeyToKeys('K')).toEqual(['K'])
})
it('preserves named keys', () => {
expect(hotkeyToKeys('Enter')).toEqual(['Enter'])
expect(hotkeyToKeys('Escape')).toEqual(['Escape'])
expect(hotkeyToKeys('Tab')).toEqual(['Tab'])
expect(hotkeyToKeys('ArrowUp')).toEqual(['ArrowUp'])
expect(hotkeyToKeys('ArrowDown')).toEqual(['ArrowDown'])
expect(hotkeyToKeys('ArrowLeft')).toEqual(['ArrowLeft'])
expect(hotkeyToKeys('ArrowRight')).toEqual(['ArrowRight'])
})
it('preserves punctuation keys', () => {
expect(hotkeyToKeys(',')).toEqual([','])
expect(hotkeyToKeys('.')).toEqual(['.'])
expect(hotkeyToKeys('/')).toEqual(['/'])
})
})
describe('Mod mapping', () => {
it('converts standalone Mod to Meta', () => {
expect(hotkeyToKeys('Mod')).toEqual(['Meta'])
})
it('converts Mod to Meta when combined with a single key', () => {
expect(hotkeyToKeys('Mod+K')).toEqual(['Meta', 'K'])
})
it('is case sensitive — only exact "Mod" is converted', () => {
expect(hotkeyToKeys('mod+K')).toEqual(['mod', 'K'])
expect(hotkeyToKeys('MOD+K')).toEqual(['MOD', 'K'])
})
it('does not rewrite keys that merely contain "Mod" as a substring', () => {
expect(hotkeyToKeys('Model')).toEqual(['Model'])
expect(hotkeyToKeys('Mod+Model')).toEqual(['Meta', 'Model'])
})
})
describe('modifier combos', () => {
it('handles Mod+Shift combos', () => {
expect(hotkeyToKeys('Mod+Shift+M')).toEqual(['Meta', 'Shift', 'M'])
expect(hotkeyToKeys('Mod+Shift+J')).toEqual(['Meta', 'Shift', 'J'])
expect(hotkeyToKeys('Mod+Shift+C')).toEqual(['Meta', 'Shift', 'C'])
})
it('preserves modifier order', () => {
expect(hotkeyToKeys('Shift+Mod+K')).toEqual(['Shift', 'Meta', 'K'])
expect(hotkeyToKeys('Alt+Mod+K')).toEqual(['Alt', 'Meta', 'K'])
})
it('leaves Ctrl, Alt, Shift, Meta literals untouched', () => {
expect(hotkeyToKeys('Ctrl+K')).toEqual(['Ctrl', 'K'])
expect(hotkeyToKeys('Alt+K')).toEqual(['Alt', 'K'])
expect(hotkeyToKeys('Shift+K')).toEqual(['Shift', 'K'])
expect(hotkeyToKeys('Meta+K')).toEqual(['Meta', 'K'])
})
it('handles three-modifier combos', () => {
expect(hotkeyToKeys('Mod+Alt+Shift+K')).toEqual(['Meta', 'Alt', 'Shift', 'K'])
})
})
describe('named-key combos from the registry', () => {
it('handles Mod+ArrowUp/Down/Left/Right', () => {
expect(hotkeyToKeys('Mod+ArrowUp')).toEqual(['Meta', 'ArrowUp'])
expect(hotkeyToKeys('Mod+ArrowDown')).toEqual(['Meta', 'ArrowDown'])
expect(hotkeyToKeys('Mod+ArrowLeft')).toEqual(['Meta', 'ArrowLeft'])
expect(hotkeyToKeys('Mod+ArrowRight')).toEqual(['Meta', 'ArrowRight'])
})
it('handles Mod+Enter and Mod+Escape', () => {
expect(hotkeyToKeys('Mod+Enter')).toEqual(['Meta', 'Enter'])
expect(hotkeyToKeys('Mod+Escape')).toEqual(['Meta', 'Escape'])
})
it('handles Mod+. (operation queue toggle / logs reset)', () => {
expect(hotkeyToKeys('Mod+.')).toEqual(['Meta', '.'])
})
})
describe('edge cases', () => {
it('returns a single-element array for empty input', () => {
expect(hotkeyToKeys('')).toEqual([''])
})
it('preserves empty segments from trailing plus', () => {
expect(hotkeyToKeys('Mod+')).toEqual(['Meta', ''])
})
})
})
+133
View File
@@ -29,6 +29,25 @@ export const SHORTCUT_IDS = {
OPERATION_QUEUE_TOGGLE: 'operation-queue.toggle',
OPERATION_QUEUE_UNDO: 'operation-queue.undo',
UNIFIED_LOGS_RESET_FOCUS: 'unified-logs.reset-focus',
NAV_HOME: 'nav.home',
NAV_TABLE_EDITOR: 'nav.table-editor',
NAV_SQL_EDITOR: 'nav.sql-editor',
NAV_DATABASE: 'nav.database',
NAV_AUTH: 'nav.auth',
NAV_STORAGE: 'nav.storage',
NAV_FUNCTIONS: 'nav.functions',
NAV_REALTIME: 'nav.realtime',
NAV_ADVISORS: 'nav.advisors',
NAV_OBSERVABILITY: 'nav.observability',
NAV_LOGS: 'nav.logs',
NAV_INTEGRATIONS: 'nav.integrations',
NAV_SETTINGS: 'nav.settings',
NAV_ORG_PROJECTS: 'nav.org-projects',
NAV_ORG_TEAM: 'nav.org-team',
NAV_ORG_INTEGRATIONS: 'nav.org-integrations',
NAV_ORG_USAGE: 'nav.org-usage',
NAV_ORG_BILLING: 'nav.org-billing',
NAV_ORG_SETTINGS: 'nav.org-settings',
} as const
/**
@@ -181,4 +200,118 @@ export const SHORTCUT_DEFINITIONS: Record<ShortcutId, ShortcutDefinition> = {
sequence: ['Mod+.'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_HOME]: {
id: SHORTCUT_IDS.NAV_HOME,
label: 'Go to Project Overview',
sequence: ['G', 'H'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_TABLE_EDITOR]: {
id: SHORTCUT_IDS.NAV_TABLE_EDITOR,
label: 'Go to Table Editor',
sequence: ['G', 'T'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_SQL_EDITOR]: {
id: SHORTCUT_IDS.NAV_SQL_EDITOR,
label: 'Go to SQL Editor',
sequence: ['G', 'S'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_DATABASE]: {
id: SHORTCUT_IDS.NAV_DATABASE,
label: 'Go to Database',
sequence: ['G', 'D'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_AUTH]: {
id: SHORTCUT_IDS.NAV_AUTH,
label: 'Go to Authentication',
sequence: ['G', 'A'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_STORAGE]: {
id: SHORTCUT_IDS.NAV_STORAGE,
label: 'Go to Storage',
sequence: ['G', 'B'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_FUNCTIONS]: {
id: SHORTCUT_IDS.NAV_FUNCTIONS,
label: 'Go to Edge Functions',
sequence: ['G', 'F'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_REALTIME]: {
id: SHORTCUT_IDS.NAV_REALTIME,
label: 'Go to Realtime',
sequence: ['G', 'R'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ADVISORS]: {
id: SHORTCUT_IDS.NAV_ADVISORS,
label: 'Go to Advisors',
sequence: ['G', 'V'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_OBSERVABILITY]: {
id: SHORTCUT_IDS.NAV_OBSERVABILITY,
label: 'Go to Observability',
sequence: ['G', 'U'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_LOGS]: {
id: SHORTCUT_IDS.NAV_LOGS,
label: 'Go to Logs',
sequence: ['G', 'L'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_INTEGRATIONS]: {
id: SHORTCUT_IDS.NAV_INTEGRATIONS,
label: 'Go to Integrations',
sequence: ['G', 'I'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_SETTINGS]: {
id: SHORTCUT_IDS.NAV_SETTINGS,
label: 'Go to Project Settings',
sequence: ['G', ','],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ORG_PROJECTS]: {
id: SHORTCUT_IDS.NAV_ORG_PROJECTS,
label: 'Go to Projects',
sequence: ['G', 'P'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ORG_TEAM]: {
id: SHORTCUT_IDS.NAV_ORG_TEAM,
label: 'Go to Team',
sequence: ['G', 'M'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ORG_INTEGRATIONS]: {
id: SHORTCUT_IDS.NAV_ORG_INTEGRATIONS,
label: 'Go to Organization Integrations',
sequence: ['G', 'I'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ORG_USAGE]: {
id: SHORTCUT_IDS.NAV_ORG_USAGE,
label: 'Go to Usage',
sequence: ['G', 'U'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ORG_BILLING]: {
id: SHORTCUT_IDS.NAV_ORG_BILLING,
label: 'Go to Billing',
sequence: ['G', 'B'],
showInSettings: false,
},
[SHORTCUT_IDS.NAV_ORG_SETTINGS]: {
id: SHORTCUT_IDS.NAV_ORG_SETTINGS,
label: 'Go to Organization Settings',
sequence: ['G', 'O'],
showInSettings: false,
},
}
@@ -0,0 +1,266 @@
import { render, renderHook } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { SHORTCUT_DEFINITIONS, SHORTCUT_IDS } from './registry'
import { useShortcut } from './useShortcut'
const { mockUseHotkeySequence, mockUseRegisterCommands, mockUseIsShortcutEnabled } = vi.hoisted(
() => ({
mockUseHotkeySequence: vi.fn(),
mockUseRegisterCommands: vi.fn(),
mockUseIsShortcutEnabled: vi.fn(),
})
)
vi.mock('@tanstack/react-hotkeys', () => ({
useHotkeySequence: mockUseHotkeySequence,
}))
vi.mock('ui-patterns/CommandMenu', () => ({
useRegisterCommands: mockUseRegisterCommands,
}))
vi.mock('./useIsShortcutEnabled', () => ({
useIsShortcutEnabled: mockUseIsShortcutEnabled,
}))
const getLastHotkeyOptions = () => {
const call = mockUseHotkeySequence.mock.calls.at(-1)
if (!call) throw new Error('useHotkeySequence was not called')
return call[2] as { enabled: boolean; timeout: number | undefined; ignoreInputs?: boolean }
}
const getLastRegisterCall = () => {
const call = mockUseRegisterCommands.mock.calls.at(-1)
if (!call) throw new Error('useRegisterCommands was not called')
return call as [
string,
Array<{ id: string; name: string; action: () => void; badge: () => any }>,
{ enabled: boolean; deps: unknown[] },
]
}
describe('useShortcut', () => {
beforeEach(() => {
vi.clearAllMocks()
mockUseIsShortcutEnabled.mockReturnValue(true)
})
describe('hotkey wiring', () => {
it('passes the registry sequence to useHotkeySequence', () => {
const cb = vi.fn()
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, cb))
const [sequence, callback] = mockUseHotkeySequence.mock.calls[0]
expect(sequence).toEqual(SHORTCUT_DEFINITIONS[SHORTCUT_IDS.COMMAND_MENU_OPEN].sequence)
expect(callback).toBe(cb)
})
it('passes multi-step sequences (G-chords) through unchanged', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.NAV_HOME, vi.fn()))
expect(mockUseHotkeySequence.mock.calls[0][0]).toEqual(['G', 'H'])
})
it('wires the callback by reference — useHotkeySequence receives the same function', () => {
const cb = vi.fn()
renderHook(() => useShortcut(SHORTCUT_IDS.ACTION_BAR_SAVE, cb))
const passedCallback = mockUseHotkeySequence.mock.calls[0][1]
passedCallback()
expect(cb).toHaveBeenCalledTimes(1)
})
})
describe('enabled resolution', () => {
it('defaults to enabled: true when no options and no registry default', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn()))
expect(getLastHotkeyOptions().enabled).toBe(true)
})
it('caller option takes priority over fallback', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { enabled: false }))
expect(getLastHotkeyOptions().enabled).toBe(false)
})
it('global disable forces enabled to false, regardless of caller', () => {
mockUseIsShortcutEnabled.mockReturnValue(false)
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { enabled: true }))
expect(getLastHotkeyOptions().enabled).toBe(false)
})
it('global enabled AND caller enabled = true', () => {
mockUseIsShortcutEnabled.mockReturnValue(true)
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { enabled: true }))
expect(getLastHotkeyOptions().enabled).toBe(true)
})
it('global enabled AND caller undefined = true', () => {
mockUseIsShortcutEnabled.mockReturnValue(true)
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn()))
expect(getLastHotkeyOptions().enabled).toBe(true)
})
it('subscribes to the correct shortcut id for global preference', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.NAV_TABLE_EDITOR, vi.fn()))
expect(mockUseIsShortcutEnabled).toHaveBeenCalledWith(SHORTCUT_IDS.NAV_TABLE_EDITOR)
})
})
describe('timeout resolution', () => {
it('defaults to undefined (falls through to TanStack default)', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn()))
expect(getLastHotkeyOptions().timeout).toBeUndefined()
})
it('uses caller-provided timeout', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { timeout: 2000 }))
expect(getLastHotkeyOptions().timeout).toBe(2000)
})
})
describe('ignoreInputs resolution', () => {
it('omits the key when no registry default and no caller override (library applies its per-hotkey default)', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn()))
const options = getLastHotkeyOptions()
expect('ignoreInputs' in options).toBe(false)
})
it('uses the registry default when no caller override', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.TABLE_EDITOR_JUMP_FIRST_ROW, vi.fn()))
expect(getLastHotkeyOptions().ignoreInputs).toBe(true)
})
it('caller override takes priority over registry default', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.TABLE_EDITOR_JUMP_FIRST_ROW, vi.fn(), { ignoreInputs: false })
)
expect(getLastHotkeyOptions().ignoreInputs).toBe(false)
})
})
describe('command menu registration', () => {
it('calls useRegisterCommands under the "Shortcuts" section', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn()))
const [section] = getLastRegisterCall()
expect(section).toBe('Shortcuts')
})
it('is disabled by default (registerInCommandMenu defaults to false)', () => {
renderHook(() => useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn()))
expect(getLastRegisterCall()[2].enabled).toBe(false)
})
it('is enabled when registerInCommandMenu: true AND enabled', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { registerInCommandMenu: true })
)
expect(getLastRegisterCall()[2].enabled).toBe(true)
})
it('is disabled when globally disabled, even with registerInCommandMenu: true', () => {
mockUseIsShortcutEnabled.mockReturnValue(false)
renderHook(() =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { registerInCommandMenu: true })
)
expect(getLastRegisterCall()[2].enabled).toBe(false)
})
it('is disabled when caller passes enabled: false, even with registerInCommandMenu: true', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), {
enabled: false,
registerInCommandMenu: true,
})
)
expect(getLastRegisterCall()[2].enabled).toBe(false)
})
it('registers the command with id and label from the registry', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.RESULTS_COPY_MARKDOWN, vi.fn(), { registerInCommandMenu: true })
)
const [, commands] = getLastRegisterCall()
expect(commands).toHaveLength(1)
expect(commands[0].id).toBe(SHORTCUT_IDS.RESULTS_COPY_MARKDOWN)
expect(commands[0].name).toBe(SHORTCUT_DEFINITIONS[SHORTCUT_IDS.RESULTS_COPY_MARKDOWN].label)
})
it('command action calls the LATEST callback after a rerender (no stale closure)', () => {
const cb1 = vi.fn()
const cb2 = vi.fn()
const { rerender } = renderHook(
({ cb }: { cb: () => void }) =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, cb, { registerInCommandMenu: true }),
{ initialProps: { cb: cb1 } }
)
// Capture the action from the first render and fire it after a rerender —
// it should call the NEW callback, proving we dodge the stale closure.
const firstAction = mockUseRegisterCommands.mock.calls[0][1][0].action
rerender({ cb: cb2 })
firstAction()
expect(cb1).not.toHaveBeenCalled()
expect(cb2).toHaveBeenCalledTimes(1)
})
it('command action identity is stable across renders', () => {
const { rerender } = renderHook(
({ cb }: { cb: () => void }) =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, cb, { registerInCommandMenu: true }),
{ initialProps: { cb: vi.fn() } }
)
const firstAction = mockUseRegisterCommands.mock.calls[0][1][0].action
rerender({ cb: vi.fn() })
const secondAction = mockUseRegisterCommands.mock.calls.at(-1)![1][0].action
expect(firstAction).toBe(secondAction)
})
it('deps track enabled + label so downstream can invalidate correctly', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { registerInCommandMenu: true })
)
const [, , options] = getLastRegisterCall()
expect(options.deps).toEqual([
true,
SHORTCUT_DEFINITIONS[SHORTCUT_IDS.COMMAND_MENU_OPEN].label,
])
})
describe('badge rendering', () => {
it('renders a single KeyboardShortcut pill for single-step sequences (no "then")', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.COMMAND_MENU_OPEN, vi.fn(), { registerInCommandMenu: true })
)
const badgeNode = getLastRegisterCall()[1][0].badge()
const { container } = render(badgeNode)
expect(container.textContent).not.toContain('then')
})
it('renders a "then" separator between steps for multi-step sequences', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.NAV_HOME, vi.fn(), { registerInCommandMenu: true })
)
const badgeNode = getLastRegisterCall()[1][0].badge()
const { container } = render(badgeNode)
expect(container.textContent).toContain('then')
})
it('renders the converted keys (Mod → ⌘ or Ctrl via KeyboardShortcut)', () => {
renderHook(() =>
useShortcut(SHORTCUT_IDS.RESULTS_COPY_MARKDOWN, vi.fn(), {
registerInCommandMenu: true,
})
)
const badgeNode = getLastRegisterCall()[1][0].badge()
const { container } = render(badgeNode)
// Mod+Shift+M → the "M" key is always rendered as-is; the platform-specific
// ⌘/Ctrl handling lives in KeyboardShortcut and is asserted there.
expect(container.textContent).toContain('M')
expect(container.textContent).toContain('⇧')
})
})
})
})
+10 -1
View File
@@ -60,7 +60,16 @@ export function useShortcut(id: ShortcutId, callback: () => void, options?: Shor
const timeout = options?.timeout ?? def.options?.timeout ?? undefined
const ignoreInputs = options?.ignoreInputs ?? def.options?.ignoreInputs
useHotkeySequence(def.sequence, callback, { enabled, timeout, ignoreInputs })
// Only include `ignoreInputs` when set. The library resolves it to a concrete
// boolean at register time (false for Meta/Ctrl/Escape, true otherwise), but
// its setOptions does an object spread on every re-render — passing
// `ignoreInputs: undefined` would overwrite the resolved value and re-enable
// the input-focus guard for shortcuts that should always fire.
useHotkeySequence(def.sequence, callback, {
enabled,
timeout,
...(ignoreInputs !== undefined && { ignoreInputs }),
})
// Handle overrides for command menu
const enabledInCommandMenu = enabled && (options?.registerInCommandMenu ?? false)
@@ -0,0 +1,254 @@
import { fireEvent, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { toast } from 'sonner'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { InviteMemberButton } from '@/components/interfaces/Organization/TeamSettings/InviteMemberButton'
import { customRender } from '@/tests/lib/custom-render'
vi.mock('sonner', () => ({
toast: { success: vi.fn(), error: vi.fn() },
}))
vi.mock('common', async (importOriginal) => {
const actual = (await importOriginal()) as typeof import('common')
return { ...actual, useParams: () => ({ slug: 'test-org' }) }
})
vi.mock('@/lib/profile', () => ({
useProfile: () => ({ profile: { id: 1, gotrue_id: 'user-1' } }),
}))
vi.mock('@/hooks/misc/useSelectedOrganization', () => ({
useSelectedOrganizationQuery: () => ({
data: { id: 1, slug: 'test-org', name: 'Test Org' },
}),
}))
vi.mock('@/hooks/misc/useCheckPermissions', () => ({
useGetPermissions: () => ({ permissions: [], organizationSlug: 'test-org' }),
doPermissionsCheck: () => true,
useAsyncCheckPermissions: () => ({ can: true, isSuccess: true }),
}))
vi.mock('@/hooks/misc/useIsFeatureEnabled', () => ({
useIsFeatureEnabled: () => ({ organizationMembersCreate: true }),
}))
vi.mock('@/data/organizations/organization-members-query', () => ({
useOrganizationMembersQuery: () => ({
data: [
{
gotrue_id: 'user-1',
primary_email: 'me@example.com',
role_ids: [1],
},
{
gotrue_id: 'existing-user',
primary_email: 'existing@example.com',
role_ids: [1],
},
],
}),
}))
const mockRoles = {
org_scoped_roles: [{ id: 1, name: 'Developer', description: null }],
}
vi.mock('@/data/organization-members/organization-roles-query', () => ({
useOrganizationRolesV2Query: () => ({ data: mockRoles, isSuccess: true }),
}))
vi.mock('@/data/sso/sso-config-query', () => ({
useOrgSSOConfigQuery: () => ({ data: null }),
}))
vi.mock('@/data/subscriptions/org-subscription-query', () => ({
useHasAccessToProjectLevelPermissions: () => false,
}))
vi.mock('@/hooks/misc/useCheckEntitlements', () => ({
useCheckEntitlements: () => ({ hasAccess: false }),
}))
vi.mock('@/components/interfaces/Organization/TeamSettings/TeamSettings.utils', () => ({
useGetRolesManagementPermissions: () => ({ rolesAddable: [1], rolesRemovable: [1] }),
}))
const mockInvite = vi.fn().mockResolvedValue({ succeeded: [], failed: [] })
vi.mock('@/data/organization-members/organization-invitation-create-mutation', () => ({
useOrganizationCreateInvitationMutation: () => ({
mutateAsync: mockInvite,
isPending: false,
}),
}))
vi.mock('@/hooks/ui/useConfirmOnClose', () => ({
useConfirmOnClose: ({ onClose }: { checkIsDirty: () => boolean; onClose: () => void }) => ({
confirmOnClose: onClose,
handleOpenChange: (open: boolean) => {
if (!open) onClose()
},
modalProps: { visible: false, onClose, onCancel: vi.fn() },
}),
}))
// Helpers
async function openDialog() {
await userEvent.click(screen.getByRole('button', { name: /invite members/i }))
return screen.findByRole('dialog')
}
async function submitForm(emailValue: string) {
await openDialog()
fireEvent.change(screen.getByPlaceholderText(/name@example\.com/i), {
target: { value: emailValue },
})
fireEvent.click(screen.getByRole('button', { name: /send invitation/i }))
}
// Tests
describe('InviteMemberButton', () => {
beforeEach(() => {
vi.clearAllMocks()
mockInvite.mockResolvedValue({ succeeded: [], failed: [] })
})
it('renders an enabled Invite members button', () => {
customRender(<InviteMemberButton />)
expect(screen.getByRole('button', { name: /invite members/i })).toBeEnabled()
})
it('opens the invite dialog when the button is clicked', async () => {
customRender(<InviteMemberButton />)
await openDialog()
expect(screen.getByRole('dialog')).toBeInTheDocument()
expect(screen.getByText('Invite team members')).toBeInTheDocument()
})
it('calls the mutation with a single email in an array', async () => {
customRender(<InviteMemberButton />)
await submitForm('new@example.com')
await waitFor(() => {
expect(mockInvite).toHaveBeenCalledWith(
expect.objectContaining({ emails: ['new@example.com'] })
)
})
})
it('calls the mutation with multiple emails parsed from a comma-separated input', async () => {
customRender(<InviteMemberButton />)
await submitForm('alice@example.com, bob@example.com, carol@example.com')
await waitFor(() => {
expect(mockInvite).toHaveBeenCalledWith(
expect.objectContaining({
emails: ['alice@example.com', 'bob@example.com', 'carol@example.com'],
})
)
})
})
it('lowercases emails before sending', async () => {
customRender(<InviteMemberButton />)
await submitForm('User@Example.COM')
await waitFor(() => {
expect(mockInvite).toHaveBeenCalledWith(
expect.objectContaining({ emails: ['user@example.com'] })
)
})
})
it('shows a validation error for an invalid email', async () => {
customRender(<InviteMemberButton />)
await openDialog()
fireEvent.change(screen.getByPlaceholderText(/name@example\.com/i), {
target: { value: 'not-an-email' },
})
fireEvent.click(screen.getByRole('button', { name: /send invitation/i }))
expect(await screen.findByText(/invalid email address: "not-an-email"/i)).toBeInTheDocument()
expect(mockInvite).not.toHaveBeenCalled()
})
it('shows an error toast and skips the mutation for an already-existing member', async () => {
customRender(<InviteMemberButton />)
await submitForm('existing@example.com')
await waitFor(() => {
expect(toast.error).toHaveBeenCalledWith(
'existing@example.com is already in this organization'
)
})
expect(mockInvite).not.toHaveBeenCalled()
})
it('still invites new emails in a batch that also contains an existing member', async () => {
customRender(<InviteMemberButton />)
await submitForm('new@example.com, existing@example.com')
await waitFor(() => {
expect(toast.error).toHaveBeenCalled()
expect(mockInvite).toHaveBeenCalledWith(
expect.objectContaining({ emails: ['new@example.com'] })
)
})
})
it('shows a success toast for a single email in succeeded', async () => {
mockInvite.mockResolvedValueOnce({ succeeded: ['new@example.com'], failed: [] })
customRender(<InviteMemberButton />)
await submitForm('new@example.com')
await waitFor(() => {
expect(toast.success).toHaveBeenCalledWith('Successfully sent invitation to new member')
})
})
it('shows a plural success toast when multiple emails succeeded', async () => {
mockInvite.mockResolvedValueOnce({
succeeded: ['alice@example.com', 'bob@example.com'],
failed: [],
})
customRender(<InviteMemberButton />)
await submitForm('alice@example.com, bob@example.com')
await waitFor(() => {
expect(toast.success).toHaveBeenCalledWith('Successfully sent invitations to 2 new members')
})
})
it('shows an error toast with the server error for each failed email', async () => {
mockInvite.mockResolvedValueOnce({
succeeded: [],
failed: [{ email: 'new@example.com', error: 'Domain not allowed' }],
})
customRender(<InviteMemberButton />)
await submitForm('new@example.com')
await waitFor(() => {
expect(toast.error).toHaveBeenCalledWith(
'Failed to invite new@example.com: Domain not allowed'
)
})
expect(toast.success).not.toHaveBeenCalled()
})
it('shows both success and error toasts for a partial batch result', async () => {
mockInvite.mockResolvedValueOnce({
succeeded: ['alice@example.com'],
failed: [{ email: 'bob@example.com', error: 'Domain not allowed' }],
})
customRender(<InviteMemberButton />)
await submitForm('alice@example.com, bob@example.com')
await waitFor(() => {
expect(toast.success).toHaveBeenCalledWith('Successfully sent invitation to new member')
expect(toast.error).toHaveBeenCalledWith(
'Failed to invite bob@example.com: Domain not allowed'
)
})
})
})
@@ -0,0 +1,261 @@
import { describe, expect, test } from 'vitest'
import {
buildProjectPayload,
buildSsoPayload,
categorizeInviteEmails,
emailSchema,
MAX_BATCH_INVITE_SIZE,
parseEmails,
} from '@/components/interfaces/Organization/TeamSettings/InviteMemberButton.utils'
import type { OrganizationMember } from '@/data/organizations/organization-members-query'
describe('parseEmails', () => {
test('parses a single email', () => {
expect(parseEmails('user@example.com')).toStrictEqual(['user@example.com'])
})
test('parses multiple comma-separated emails', () => {
expect(parseEmails('a@example.com,b@example.com,c@example.com')).toStrictEqual([
'a@example.com',
'b@example.com',
'c@example.com',
])
})
test('trims whitespace around each email', () => {
expect(parseEmails(' a@example.com , b@example.com ')).toStrictEqual([
'a@example.com',
'b@example.com',
])
})
test('filters out empty entries from trailing, leading, or double commas', () => {
expect(parseEmails(',a@example.com,,b@example.com,')).toStrictEqual([
'a@example.com',
'b@example.com',
])
})
test('removes duplicate email addresses', () => {
expect(parseEmails('a@example.com,a@example.com')).toStrictEqual(['a@example.com'])
})
test('returns an empty array for an empty string', () => {
expect(parseEmails('')).toStrictEqual([])
})
test('returns an empty array for a whitespace-only string', () => {
expect(parseEmails(' ')).toStrictEqual([])
})
test('returns an empty array for commas only', () => {
expect(parseEmails(',,,,')).toStrictEqual([])
})
test('parses space-separated emails', () => {
expect(parseEmails('a@example.com b@example.com')).toStrictEqual([
'a@example.com',
'b@example.com',
])
})
test('parses line breaks and mixed comma or space separators', () => {
expect(parseEmails('a@example.com\nb@example.com, c@example.com')).toStrictEqual([
'a@example.com',
'b@example.com',
'c@example.com',
])
})
})
function makeMember(overrides: Partial<OrganizationMember> = {}): OrganizationMember {
return {
gotrue_id: 'gotrue-1',
primary_email: 'member@example.com',
role_ids: [1],
username: 'member',
...overrides,
} as OrganizationMember
}
describe('categorizeInviteEmails', () => {
test('places a new email in toInvite when no members exist', () => {
expect(categorizeInviteEmails(['new@example.com'], [])).toStrictEqual({
alreadyInvited: [],
alreadyMembers: [],
toInvite: ['new@example.com'],
})
})
test('places an email in alreadyMembers when that member exists without an invited_id', () => {
const members = [makeMember({ primary_email: 'existing@example.com' })]
expect(categorizeInviteEmails(['existing@example.com'], members)).toStrictEqual({
alreadyInvited: [],
alreadyMembers: ['existing@example.com'],
toInvite: [],
})
})
test('places an email in alreadyInvited when that member has an invited_id', () => {
const members = [makeMember({ primary_email: 'invited@example.com', invited_id: 42 })]
expect(categorizeInviteEmails(['invited@example.com'], members)).toStrictEqual({
alreadyInvited: ['invited@example.com'],
alreadyMembers: [],
toInvite: [],
})
})
test('correctly categorizes a mixed batch', () => {
const members = [
makeMember({ primary_email: 'member@example.com' }),
makeMember({ primary_email: 'invited@example.com', invited_id: 7 }),
]
expect(
categorizeInviteEmails(
['new@example.com', 'member@example.com', 'invited@example.com'],
members
)
).toStrictEqual({
alreadyInvited: ['invited@example.com'],
alreadyMembers: ['member@example.com'],
toInvite: ['new@example.com'],
})
})
test('places all emails in toInvite when none match existing members', () => {
const members = [makeMember({ primary_email: 'other@example.com' })]
expect(
categorizeInviteEmails(['a@example.com', 'b@example.com', 'c@example.com'], members)
).toStrictEqual({
alreadyInvited: [],
alreadyMembers: [],
toInvite: ['a@example.com', 'b@example.com', 'c@example.com'],
})
})
test('returns all-empty for an empty email list', () => {
expect(categorizeInviteEmails([], [makeMember()])).toStrictEqual({
alreadyInvited: [],
alreadyMembers: [],
toInvite: [],
})
})
test('uses strict equality — does not match different casing', () => {
// The component lowercases emails before calling this function,
// so 'member@example.com' must NOT match 'Member@Example.com'
const members = [makeMember({ primary_email: 'Member@Example.com' })]
const result = categorizeInviteEmails(['member@example.com'], members)
expect(result.toInvite).toStrictEqual(['member@example.com'])
expect(result.alreadyMembers).toStrictEqual([])
})
})
describe('buildProjectPayload', () => {
test('returns empty object when applyToOrg is true', () => {
expect(buildProjectPayload(true, 'ref_abc')).toStrictEqual({})
})
test('throws an error when applyToOrg is false but projectRef is empty', () => {
expect(() => buildProjectPayload(false, '')).toThrowError(
'projectRef is required when applyToOrg is false'
)
})
test('returns projects array when applyToOrg is false and projectRef is set', () => {
expect(buildProjectPayload(false, 'ref_abc')).toStrictEqual({ projects: ['ref_abc'] })
})
test('wraps the projectRef in a single-element array', () => {
expect(buildProjectPayload(false, 'my-project-ref')).toStrictEqual({
projects: ['my-project-ref'],
})
})
})
describe('buildSsoPayload', () => {
test('returns empty object for "auto"', () => {
expect(buildSsoPayload('auto')).toStrictEqual({})
})
test('returns { requireSso: true } for "sso"', () => {
expect(buildSsoPayload('sso')).toStrictEqual({ requireSso: true })
})
test('returns { requireSso: false } for "non-sso"', () => {
expect(buildSsoPayload('non-sso')).toStrictEqual({ requireSso: false })
})
})
function makeEmailList(count: number): string {
return Array.from({ length: count }, (_, i) => `user${i + 1}@example.com`).join(', ')
}
function makeEmailListSpaceSeparated(count: number): string {
return Array.from({ length: count }, (_, i) => `user${i + 1}@example.com`).join(' ')
}
describe('emailSchema', () => {
test('accepts a single valid email', () => {
expect(emailSchema.safeParse('user@example.com').success).toBe(true)
})
test('accepts exactly 50 emails', () => {
expect(emailSchema.safeParse(makeEmailList(MAX_BATCH_INVITE_SIZE)).success).toBe(true)
})
test('rejects 51 emails — singular "address" when exactly 1 needs removing', () => {
const result = emailSchema.safeParse(makeEmailList(51))
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.issues[0].message).toBe(
'You can invite up to 50 members at a time. Remove 1 email address to continue.'
)
}
})
test('rejects 51 space-separated emails (same as comma-separated batch limit)', () => {
const result = emailSchema.safeParse(makeEmailListSpaceSeparated(51))
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.issues[0].message).toBe(
'You can invite up to 50 members at a time. Remove 1 email address to continue.'
)
}
})
test('rejects 99 emails — plural "addresses" when more than 1 needs removing', () => {
const result = emailSchema.safeParse(makeEmailList(99))
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.issues[0].message).toBe(
'You can invite up to 50 members at a time. Remove 49 email addresses to continue.'
)
}
})
test('rejects an empty string', () => {
const result = emailSchema.safeParse('')
expect(result.success).toBe(false)
})
test('rejects an invalid email address and names it', () => {
const result = emailSchema.safeParse('notanemail')
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.issues[0].message).toBe('Invalid email address: "notanemail"')
}
})
test('truncates a very long invalid token in the error message', () => {
const longToken = `${'x'.repeat(130)}@`
const result = emailSchema.safeParse(longToken)
expect(result.success).toBe(false)
if (!result.success) {
expect(result.error.issues[0].message.startsWith('Invalid email address: "')).toBe(true)
expect(result.error.issues[0].message.endsWith('…"')).toBe(true)
expect(result.error.issues[0].message.length).toBeLessThan(longToken.length + 50)
}
})
})
@@ -1,7 +1,12 @@
import type { GoPageInput } from 'marketing'
import Image from 'next/image'
import Link from 'next/link'
import { Button } from 'ui'
import authors from '@/lib/authors.json'
const speaker = authors.find((a) => a.author_id === 'pedro_rodrigues')
const page: GoPageInput = {
template: 'lead-gen',
slug: 'accenture-reinvention-2026/contest',
@@ -31,6 +36,62 @@ const page: GoPageInput = {
],
},
sections: [
{
type: 'single-column',
title: 'What AI-Native Companies Figured Out About Infrastructure',
children: (
<div className="flex flex-col items-center gap-8">
{speaker && (
<div className="flex flex-col items-center gap-4">
{speaker.author_image_url && (
<Image
src={speaker.author_image_url}
alt={speaker.author}
width={192}
height={192}
className="rounded-full object-cover aspect-square w-48 h-48"
/>
)}
<div className="flex flex-col items-center gap-0">
<p className="text-foreground-light font-medium text-center">
{speaker.author}
{speaker.position && `, ${speaker.position}`}
</p>
<p className="text-foreground-lighter text-sm text-center">Supabase</p>
</div>
</div>
)}
<p className="text-foreground-light text-lg text-center">
Enterprise AI initiatives stall not because of the models, but because of the
infrastructure underneath. While enterprises spend months provisioning backends for each
AI project, AI native companies do it in seconds for millions of users. This session
examines the infrastructure pattern that makes this possible and shows how enterprises
can adopt it to accelerate AI initiatives, enable agentic workflows safely, and build AI
native products for their teams and customers.
</p>
<div className="flex flex-wrap items-center justify-center gap-3">
<Button asChild type="primary" size="medium">
<Link
href="https://supabase.com/docs/guides/getting-started/ai-skills"
target="_blank"
rel="noopener noreferrer"
>
Learn about Supabase AI Tools
</Link>
</Button>
<Button asChild type="default" size="medium">
<Link
href="https://supabase.link/accenture-reinvention-2026-slides"
target="_blank"
rel="noopener noreferrer"
>
Download Slides
</Link>
</Button>
</div>
</div>
),
},
{
type: 'single-column',
id: 'how-to-enter',
@@ -84,15 +84,22 @@ const page: GoPageInput = {
</div>
)}
</div>
<Button asChild type="default" size="medium">
<Link
href="https://supabase.link/postgresconf-sjc-2026-slides"
target="_blank"
rel="noopener noreferrer"
>
Download slides
</Link>
</Button>
<div className="flex flex-wrap items-center justify-center gap-3">
<Button asChild type="primary" size="medium">
<Link href="https://www.multigres.com" target="_blank" rel="noopener noreferrer">
Learn about Multigres
</Link>
</Button>
<Button asChild type="default" size="medium">
<Link
href="https://supabase.link/postgresconf-sjc-2026-slides"
target="_blank"
rel="noopener noreferrer"
>
Download slides
</Link>
</Button>
</div>
</div>
),
},
+11
View File
@@ -11,6 +11,9 @@ export const metadata: Metadata = SHOW_RESULTS
title: 'State of Startups 2026 | Supabase',
description:
'The latest trends among builders in tech stacks, AI usage, problem domains, and more.',
alternates: {
canonical: 'https://supabase.com/state-of-startups',
},
openGraph: {
title: 'State of Startups 2026 | Supabase',
description:
@@ -26,6 +29,14 @@ export const metadata: Metadata = SHOW_RESULTS
: {
title: 'State of Startups 2026 — Survey | Supabase',
description: 'Be the first to access the State of Startups 2026 report.',
alternates: {
canonical: 'https://supabase.com/state-of-startups',
},
openGraph: {
title: 'State of Startups 2026 — Survey | Supabase',
description: 'Be the first to access the State of Startups 2026 report.',
url: 'https://supabase.com/state-of-startups',
},
}
export default function StateOfStartupsPage() {
@@ -134,6 +134,12 @@ export function RegisterContent() {
<SurveySectionBreak />
</section>
<section className="px-4 py-16 md:px-8 md:py-32">
<div className="max-w-[60rem] mx-auto">
<PreviousResultsCta />
</div>
</section>
<Footer />
</main>
)
@@ -173,3 +179,38 @@ function ShirtImage() {
</div>
)
}
function PreviousResultsCta() {
return (
<Link
href="/state-of-startups-2025"
className="group grid gap-8 transition-colors md:grid-cols-[auto_1fr_auto] md:items-end md:gap-12"
>
<div className="flex w-fit flex-col gap-2" aria-hidden="true">
<div className="w-fit bg-brand-300 px-5 py-3 text-[1.75rem] leading-8 tracking-tight text-brand md:text-[2.25rem] md:leading-10">
State
</div>
<div className="w-fit bg-brand-300 px-5 py-3 text-[1.75rem] leading-8 tracking-tight text-brand md:text-[2.25rem] md:leading-10">
of
</div>
<div className="w-fit bg-brand px-5 py-3 text-[1.75rem] leading-8 tracking-tight text-background dark:text-brand-200 md:text-[2.25rem] md:leading-10">
Startups
</div>
<div className="w-fit bg-brand-500 px-5 py-3 text-[1.75rem] leading-8 tracking-tight text-brand-300 md:text-[2.25rem] md:leading-10">
2025
</div>
</div>
<div className="flex flex-col gap-2 self-end">
<p className="font-mono text-xs uppercase tracking-[0.18em] text-foreground-light">
Previous Report
</p>
<p className="text-2xl tracking-tight text-foreground">See last year&apos;s report.</p>
</div>
<div className="flex items-center self-end text-foreground-light transition-transform duration-200 group-hover:translate-x-1 group-hover:text-foreground md:justify-self-end">
<ArrowRight size={18} />
</div>
</Link>
)
}
+2 -1
View File
@@ -174,10 +174,11 @@ function StateOfStartupsPage() {
<NextSeo
title={meta_title}
description={meta_description}
canonical="https://supabase.com/state-of-startups-2025"
openGraph={{
title: meta_title,
description: meta_description,
url: `https://supabase.com/state-of-startups`,
url: `https://supabase.com/state-of-startups-2025`,
images: [
{
url: `https://supabase.com/images/state-of-startups/state-of-startups-og.png`,
@@ -1,14 +0,0 @@
{
"arrowParens": "always",
"bracketSpacing": true,
"bracketSameLine": false,
"endOfLine": "lf",
"jsxSingleQuote": false,
"htmlWhitespaceSensitivity": "ignore",
"printWidth": 100,
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"useTabs": false
}
@@ -1,4 +1,3 @@
import 'react-native-url-polyfill/auto'
import { useState, useEffect } from 'react'
import { supabase } from './lib/supabase'
import Auth from './components/Auth'
@@ -1,14 +1,15 @@
import { useState, useEffect } from 'react'
import { supabase } from '../lib/supabase'
import { StyleSheet, View, Alert } from 'react-native'
import { Button, Input } from '@rneui/themed'
import { View, Alert, TextInput, Text, TouchableOpacity } from 'react-native'
import Avatar from './Avatar'
import { appStyles } from '../styles/styles'
export default function Account({ userId, email }: { userId: string; email?: string }) {
const [loading, setLoading] = useState(true)
const [username, setUsername] = useState('')
const [website, setWebsite] = useState('')
const [avatarUrl, setAvatarUrl] = useState('')
const styles = appStyles
useEffect(() => {
if (userId) getProfile()
@@ -66,17 +67,15 @@ export default function Account({ userId, email }: { userId: string; email?: str
if (error) {
throw error
}
} catch (error) {
if (error instanceof Error) {
Alert.alert(error.message)
}
} catch (error: any) {
Alert.alert(error.message)
} finally {
setLoading(false)
}
}
return (
<View>
<View style={styles.container}>
<View>
<Avatar
size={200}
@@ -88,41 +87,46 @@ export default function Account({ userId, email }: { userId: string; email?: str
/>
</View>
<View style={[styles.verticallySpaced, styles.mt20]}>
<Input label="Email" value={email} disabled />
<Text style={styles.label}>Email</Text>
<TextInput
value={email ?? ''}
editable={false}
selectTextOnFocus={false}
style={[styles.input, styles.inputDisabled]}
/>
</View>
<View style={styles.verticallySpaced}>
<Input label="Username" value={username || ''} onChangeText={(text) => setUsername(text)} />
<Text style={styles.label}>Username</Text>
<TextInput
value={username || ''}
onChangeText={(text) => setUsername(text)}
style={styles.input}
/>
</View>
<View style={styles.verticallySpaced}>
<Input label="Website" value={website || ''} onChangeText={(text) => setWebsite(text)} />
</View>
<View style={[styles.verticallySpaced, styles.mt20]}>
<Button
title={loading ? 'Loading ...' : 'Update'}
onPress={() => updateProfile({ username, website, avatar_url: avatarUrl })}
disabled={loading}
<Text style={styles.label}>Website</Text>
<TextInput
value={website || ''}
onChangeText={(text) => setWebsite(text)}
style={styles.input}
/>
</View>
<View style={[styles.verticallySpaced, styles.mt20]}>
<TouchableOpacity
style={[styles.button, loading && styles.buttonDisabled]}
onPress={() => updateProfile({ username, website, avatar_url: avatarUrl })}
disabled={loading}
>
<Text style={styles.buttonText}>{loading ? 'Loading ...' : 'Update'}</Text>
</TouchableOpacity>
</View>
<View style={styles.verticallySpaced}>
<Button title="Sign Out" onPress={() => supabase.auth.signOut()} />
<TouchableOpacity style={styles.button} onPress={() => supabase.auth.signOut()}>
<Text style={styles.buttonText}>Sign Out</Text>
</TouchableOpacity>
</View>
</View>
)
}
const styles = StyleSheet.create({
container: {
marginTop: 40,
padding: 12,
},
verticallySpaced: {
paddingTop: 4,
paddingBottom: 4,
alignSelf: 'stretch',
},
mt20: {
marginTop: 20,
},
})
@@ -1,16 +1,16 @@
import React, { useState } from 'react'
import { Alert, StyleSheet, View } from 'react-native'
import { Alert, Text, TextInput, TouchableOpacity, View } from 'react-native'
import { supabase } from '../lib/supabase'
import { Button, Input } from '@rneui/themed'
import { appStyles } from '../styles/styles'
export default function Auth() {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
const [loading, setLoading] = useState(false)
const styles = appStyles
async function signInWithEmail() {
setLoading(true)
console.log({ email, password })
const { error } = await supabase.auth.signInWithPassword({
email: email,
password: password,
@@ -32,49 +32,46 @@ export default function Auth() {
}
return (
<View>
<View style={styles.container}>
<View style={[styles.verticallySpaced, styles.mt20]}>
<Input
label="Email"
leftIcon={{ type: 'font-awesome', name: 'envelope' }}
<Text style={styles.label}>Email</Text>
<TextInput
onChangeText={(text) => setEmail(text)}
value={email}
placeholder="email@address.com"
autoCapitalize={'none'}
autoCapitalize="none"
style={styles.input}
/>
</View>
<View style={styles.verticallySpaced}>
<Input
label="Password"
leftIcon={{ type: 'font-awesome', name: 'lock' }}
<Text style={styles.label}>Password</Text>
<TextInput
onChangeText={(text) => setPassword(text)}
value={password}
secureTextEntry={true}
placeholder="Password"
autoCapitalize={'none'}
autoCapitalize="none"
style={styles.input}
/>
</View>
<View style={[styles.verticallySpaced, styles.mt20]}>
<Button title="Sign in" disabled={loading} onPress={() => signInWithEmail()} />
<TouchableOpacity
style={[styles.button, loading && styles.buttonDisabled]}
onPress={() => signInWithEmail()}
disabled={loading}
>
<Text style={styles.buttonText}>Sign in</Text>
</TouchableOpacity>
</View>
<View style={styles.verticallySpaced}>
<Button title="Sign up" disabled={loading} onPress={() => signUpWithEmail()} />
<TouchableOpacity
style={[styles.button, loading && styles.buttonDisabled]}
onPress={() => signUpWithEmail()}
disabled={loading}
>
<Text style={styles.buttonText}>Sign up</Text>
</TouchableOpacity>
</View>
</View>
)
}
const styles = StyleSheet.create({
container: {
marginTop: 40,
padding: 12,
},
verticallySpaced: {
paddingTop: 4,
paddingBottom: 4,
alignSelf: 'stretch',
},
mt20: {
marginTop: 20,
},
})
@@ -1,7 +1,8 @@
import { useState, useEffect } from 'react'
import { supabase } from '../lib/supabase'
import { StyleSheet, View, Alert, Image, Button } from 'react-native'
import { View, Alert, Image, Text, TouchableOpacity } from 'react-native'
import * as ImagePicker from 'expo-image-picker'
import { appStyles } from '../styles/styles'
interface Props {
size: number
@@ -13,6 +14,7 @@ export default function Avatar({ url, size = 150, onUpload }: Props) {
const [uploading, setUploading] = useState(false)
const [avatarUrl, setAvatarUrl] = useState<string | null>(null)
const avatarSize = { height: size, width: size }
const styles = appStyles
useEffect(() => {
if (url) downloadImage(url)
@@ -31,10 +33,8 @@ export default function Avatar({ url, size = 150, onUpload }: Props) {
fr.onload = () => {
setAvatarUrl(fr.result as string)
}
} catch (error) {
if (error instanceof Error) {
console.log('Error downloading image: ', error.message)
}
} catch (error: any) {
console.log('Error downloading image: ', error.message)
}
}
@@ -43,36 +43,45 @@ export default function Avatar({ url, size = 150, onUpload }: Props) {
setUploading(true)
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ['images'],
allowsEditing: true,
mediaTypes: ImagePicker.MediaTypeOptions.Images, // Restrict to only images
allowsMultipleSelection: false, // Can only select one image
allowsEditing: true, // Allows the user to crop / rotate their photo before uploading it
quality: 1,
exif: false, // We don't want nor need that data.
})
if (result.canceled || !result.assets || result.assets.length === 0) {
console.log('User cancelled image picker.')
return
}
const image = result.assets[0]
console.log('Got image', image)
if (!image.uri) {
throw new Error('No image uri!')
throw new Error('No image uri!') // Realistically, this should never happen, but just in case...
}
const arraybuffer = await fetch(image.uri).then((res) => res.arrayBuffer())
const fileExt = image.uri.split('.').pop()?.toLowerCase() ?? 'jpeg'
const filePath = `${Math.random()}.${fileExt}`
const { error } = await supabase.storage.from('avatars').upload(filePath, arraybuffer, {
contentType: image.mimeType ?? 'image/jpeg',
})
const fileExt = image.uri?.split('.').pop()?.toLowerCase() ?? 'jpeg'
const path = `${Date.now()}.${fileExt}`
const { data, error: uploadError } = await supabase.storage
.from('avatars')
.upload(path, arraybuffer, {
contentType: image.mimeType ?? 'image/jpeg',
})
if (error) {
throw error
if (uploadError) {
throw uploadError
}
onUpload(filePath)
} catch (error) {
if (error instanceof Error) {
onUpload(data.path)
} catch (error: any) {
if (error) {
Alert.alert(error.message)
} else {
throw error
}
} finally {
setUploading(false)
@@ -80,7 +89,7 @@ export default function Avatar({ url, size = 150, onUpload }: Props) {
}
return (
<View>
<View style={styles.avatarContainer}>
{avatarUrl ? (
<Image
source={{ uri: avatarUrl }}
@@ -91,28 +100,14 @@ export default function Avatar({ url, size = 150, onUpload }: Props) {
<View style={[avatarSize, styles.avatar, styles.noImage]} />
)}
<View>
<Button
title={uploading ? 'Uploading ...' : 'Upload'}
<TouchableOpacity
style={[styles.button, uploading && styles.buttonDisabled]}
onPress={uploadAvatar}
disabled={uploading}
/>
>
<Text style={styles.buttonText}>{uploading ? 'Uploading ...' : 'Upload'}</Text>
</TouchableOpacity>
</View>
</View>
)
}
const styles = StyleSheet.create({
avatar: {
borderRadius: 5,
overflow: 'hidden',
maxWidth: '100%',
},
image: {
objectFit: 'cover',
paddingTop: 0,
},
noImage: {
backgroundColor: '#333',
borderRadius: 5,
},
})
@@ -0,0 +1,70 @@
import { StyleSheet } from 'react-native'
export const appStyles = StyleSheet.create({
container: {
marginTop: 40,
padding: 12,
},
verticallySpaced: {
paddingTop: 4,
paddingBottom: 4,
alignSelf: 'stretch',
},
mt20: {
marginTop: 20,
},
label: {
fontSize: 16,
fontWeight: '600',
color: '#86939e',
marginBottom: 6,
},
input: {
borderWidth: 1,
borderColor: '#86939e',
borderRadius: 4,
padding: 12,
fontSize: 16,
},
inputDisabled: {
backgroundColor: '#f2f2f2',
borderColor: '#d1d1d1',
color: '#9e9e9e',
},
button: {
backgroundColor: '#2089dc',
borderRadius: 4,
padding: 12,
alignItems: 'center',
},
buttonDisabled: {
opacity: 0.5,
},
buttonText: {
color: '#fff',
fontSize: 16,
fontWeight: '600',
},
avatarContainer: {
alignItems: 'center',
justifyContent: 'center',
marginTop: 20,
},
avatar: {
borderRadius: 5,
overflow: 'hidden',
maxWidth: '100%',
marginBottom: 20,
},
image: {
objectFit: 'cover',
paddingTop: 0,
},
noImage: {
backgroundColor: '#333',
borderWidth: 1,
borderStyle: 'solid',
borderColor: 'rgb(200, 200, 200)',
borderRadius: 5,
},
})
+168 -63
View File
@@ -5625,6 +5625,27 @@ export interface operations {
}
content?: never
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
'v1-revoke-token': {
@@ -5688,6 +5709,27 @@ export interface operations {
'application/json': components['schemas']['OrganizationResponseV1'][]
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Unexpected error listing organizations */
500: {
headers: {
@@ -5718,6 +5760,27 @@ export interface operations {
'application/json': components['schemas']['OrganizationResponseV1']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Unexpected error creating an organization */
500: {
headers: {
@@ -5954,6 +6017,27 @@ export interface operations {
'application/json': components['schemas']['OrganizationProjectsResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to retrieve projects */
500: {
headers: {
@@ -5999,6 +6083,27 @@ export interface operations {
'application/json': components['schemas']['V1ProjectWithDatabaseResponse'][]
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
'v1-create-a-project': {
@@ -6022,6 +6127,27 @@ export interface operations {
'application/json': components['schemas']['V1ProjectResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
'v1-get-project': {
@@ -7252,27 +7378,6 @@ export interface operations {
'application/json': components['schemas']['BranchResponse'][]
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to retrieve database branches */
500: {
headers: {
@@ -7306,27 +7411,6 @@ export interface operations {
'application/json': components['schemas']['BranchResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to create database branch */
500: {
headers: {
@@ -7405,27 +7489,6 @@ export interface operations {
'application/json': components['schemas']['BranchResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to fetch database branch */
500: {
headers: {
@@ -12898,6 +12961,27 @@ export interface operations {
'application/json': components['schemas']['SnippetList']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to list user's SQL snippets */
500: {
headers: {
@@ -12926,6 +13010,27 @@ export interface operations {
'application/json': components['schemas']['SnippetResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to retrieve SQL snippet */
500: {
headers: {
+438 -3
View File
@@ -1077,6 +1077,23 @@ export interface paths {
patch?: never
trace?: never
}
'/platform/organizations/{slug}/billing/credits/preview': {
parameters: {
query?: never
header?: never
path?: never
cookie?: never
}
get?: never
put?: never
/** Preview for credit top-up */
post: operations['OrgCreditsController_previewTopUp']
delete?: never
options?: never
head?: never
patch?: never
trace?: never
}
'/platform/organizations/{slug}/billing/credits/redeem': {
parameters: {
query?: never
@@ -1888,6 +1905,23 @@ export interface paths {
patch?: never
trace?: never
}
'/platform/organizations/onboarding-survey': {
parameters: {
query?: never
header?: never
path?: never
cookie?: never
}
get?: never
put?: never
/** Submit onboarding survey for a newly created organization */
post: operations['OrganizationsController_handleOnboardingSurvey']
delete?: never
options?: never
head?: never
patch?: never
trace?: never
}
'/platform/organizations/preview-creation': {
parameters: {
query?: never
@@ -4988,11 +5022,24 @@ export interface components {
workdir: string
}
CreateInvitationBody: {
email: string
/**
* Format: email
* @deprecated
*/
email?: string
emails?: string[]
require_sso?: boolean
role_id: number
role_scoped_projects?: string[]
}
CreateInvitationResponse: {
failed: {
/** Format: email */
email: string
error: string
}[]
succeeded: string[]
} | null
CreateNamespaceBody: {
namespace: string
}
@@ -5222,6 +5269,8 @@ export interface components {
| 'action_runs_read'
| 'action_runs_write'
| 'advisors_read'
| 'analytics_config_read'
| 'analytics_config_write'
| 'analytics_logs_read'
| 'analytics_usage_read'
| 'api_gateway_keys_read'
@@ -5685,6 +5734,8 @@ export interface components {
| 'action_runs_read'
| 'action_runs_write'
| 'advisors_read'
| 'analytics_config_read'
| 'analytics_config_write'
| 'analytics_logs_read'
| 'analytics_usage_read'
| 'api_gateway_keys_read'
@@ -7631,6 +7682,13 @@ export interface components {
)[]
website: string
}
OnboardingSurveyBody: {
building?: string
heard_from?: string
kind?: string
size?: string
slug: string
}
OrganizationProjectsResponse: {
pagination: {
/** @description Total number of projects. Use this to calculate the total number of pages. */
@@ -8271,6 +8329,36 @@ export interface components {
name: string
schema: string
}
PreviewCreditTopUpRequest: {
address?: {
city?: string | null
country: string
line1: string
line2?: string | null
postal_code?: string | null
state?: string | null
}
amount: number
tax_id?: {
country: string
type: string
value: string
}
}
PreviewCreditTopUpResponse: {
amount: number
currency: string
tax: {
currency: string
tax_amount: number
tax_rate_percentage: number
total_amount_excluding_tax: number
total_amount_including_tax: number
} | null
/** @enum {string} */
tax_status: 'calculated' | 'not_applicable' | 'failed'
total: number
}
PreviewOrganizationCreationBody: {
address?: {
city?: string | null
@@ -8648,7 +8736,7 @@ export interface components {
| '48xlarge_optimized_cpu'
| '48xlarge_high_memory'
inserted_at: string
integration_source?: string | null
integration_source: string | null
is_branch_enabled: boolean
is_physical_backups_enabled: boolean
lastDatabaseResizeAt?: string
@@ -10591,6 +10679,8 @@ export interface components {
| 'action_runs_read'
| 'action_runs_write'
| 'advisors_read'
| 'analytics_config_read'
| 'analytics_config_write'
| 'analytics_logs_read'
| 'analytics_usage_read'
| 'api_gateway_keys_read'
@@ -14002,6 +14092,27 @@ export interface operations {
'application/json': components['schemas']['ListPlatformAppsResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppsController_createPlatformApp: {
@@ -14028,6 +14139,27 @@ export interface operations {
'application/json': components['schemas']['CreatePlatformAppResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppsController_getPlatformApp: {
@@ -14051,6 +14183,27 @@ export interface operations {
'application/json': components['schemas']['GetPlatformAppResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppsController_deletePlatformApp: {
@@ -14072,6 +14225,27 @@ export interface operations {
}
content?: never
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppsController_updatePlatformApp: {
@@ -14099,6 +14273,27 @@ export interface operations {
'application/json': components['schemas']['GetPlatformAppResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppSigningKeysController_listPlatformAppSigningKeys: {
@@ -14122,6 +14317,27 @@ export interface operations {
'application/json': components['schemas']['ListPlatformAppSigningKeysResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppSigningKeysController_createPlatformAppSigningKey: {
@@ -14145,6 +14361,27 @@ export interface operations {
'application/json': components['schemas']['CreatePlatformAppSigningKeyResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppSigningKeysController_deletePlatformAppSigningKey: {
@@ -14167,6 +14404,27 @@ export interface operations {
}
content?: never
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppInstallationsController_listPlatformAppInstallations: {
@@ -14189,6 +14447,27 @@ export interface operations {
'application/json': components['schemas']['ListPlatformAppInstallationsResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppInstallationsController_installPlatformApp: {
@@ -14215,6 +14494,27 @@ export interface operations {
'application/json': components['schemas']['InstallPlatformAppResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppInstallationsController_getPlatformAppInstallation: {
@@ -14238,6 +14538,27 @@ export interface operations {
'application/json': components['schemas']['GetPlatformAppInstallationResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppInstallationsController_uninstallPlatformInstallation: {
@@ -14259,6 +14580,27 @@ export interface operations {
}
content?: never
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
PlatformAppInstallationsController_updatePlatformAppInstallation: {
@@ -14282,6 +14624,27 @@ export interface operations {
'application/json': components['schemas']['UpdatePlatformAppInstallationResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
OrgAuditLogsController_getAuditLogs: {
@@ -14393,6 +14756,54 @@ export interface operations {
}
}
}
OrgCreditsController_previewTopUp: {
parameters: {
query?: never
header?: never
path: {
/** @description Organization slug */
slug: string
}
cookie?: never
}
requestBody: {
content: {
'application/json': components['schemas']['PreviewCreditTopUpRequest']
}
}
responses: {
/** @description Credit top-up preview with tax calculation. */
200: {
headers: {
[name: string]: unknown
}
content: {
'application/json': components['schemas']['PreviewCreditTopUpResponse']
}
}
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Forbidden action */
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Rate limit exceeded */
429: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
OrgCreditsController_redeemCode: {
parameters: {
query?: never
@@ -15910,11 +16321,14 @@ export interface operations {
}
}
responses: {
/** @description Batch invitations result when using "emails" field. null/no body when using legacy "email" field. */
201: {
headers: {
[name: string]: unknown
}
content?: never
content: {
'application/json': components['schemas']['CreateInvitationResponse']
}
}
/** @description Unauthorized */
401: {
@@ -17462,6 +17876,27 @@ export interface operations {
}
}
}
OrganizationsController_handleOnboardingSurvey: {
parameters: {
query?: never
header?: never
path?: never
cookie?: never
}
requestBody: {
content: {
'application/json': components['schemas']['OnboardingSurveyBody']
}
}
responses: {
204: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
OrganizationsController_previewOrganizationCreation: {
parameters: {
query?: never
+347 -34
View File
@@ -1,7 +1,8 @@
// @vitest-environment jsdom
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import type { UserDecision } from '@usercentrics/cmp-browser-sdk'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { detectPriorConsent } from './consent-state'
import { applyPriorDecisionToSDK, consentState, detectPriorConsent } from './consent-state'
// jsdom's localStorage can be flaky in vitest, so ensure it's available
const storage = new Map<string, string>()
@@ -31,7 +32,7 @@ afterEach(() => {
describe('detectPriorConsent', () => {
describe('scenario 1: GTM compressed format (ucData)', () => {
it('returns true when ucData has all services consented', () => {
it('returns uniform-accept when every service has consent: true', () => {
storage.set(
'ucData',
JSON.stringify({
@@ -46,64 +47,218 @@ describe('detectPriorConsent', () => {
})
)
expect(detectPriorConsent()).toBe(true)
expect(detectPriorConsent()).toEqual({ kind: 'uniform-accept' })
})
it('returns false when any service has consent: false', () => {
// Real customer data shape from GROWTH-790: essentials and functional
// services accepted, marketing/tracking services denied. This is what
// Opt out or a Privacy Settings toggle of the Marketing category produces
// in production — essentials are locked on and cannot actually be denied.
it('returns per-service decisions when ucData has a mixed consent state (GROWTH-790)', () => {
storage.set(
'ucData',
JSON.stringify({
gcm: {
adsDataRedaction: true,
adStorage: 'denied',
adPersonalization: 'denied',
adUserData: 'denied',
analyticsStorage: 'denied',
},
consent: {
services: {
J39GyuWQq: { name: 'Amazon Web Services', consent: true },
HkIVcNiuoZX: { name: 'Cloudflare', consent: true },
H1PKqNodoWQ: { name: 'Google AJAX', consent: true },
HkPBYFofN: { name: 'Google Fonts', consent: true },
QjO6LaiOd: { name: 'hCaptcha', consent: true },
'F-REmjGq7': { name: 'JSDelivr', consent: true },
Hko_qNsui_Q: { name: 'reCAPTCHA', consent: true },
rH1vNPCFR: { name: 'Sentry', consent: true },
ry3w9Vo_oZ7: { name: 'Stripe', consent: true },
BJTzqNi_i_m: { name: 'Twitter Plugin', consent: true },
HLap0udLC: { name: 'Twitter Syndication', consent: true },
H1Vl5NidjWX: { name: 'Usercentrics Consent Management Platform', consent: true },
BJz7qNsdj_7: { name: 'YouTube Video', consent: true },
S1_9Vsuj_Q: { name: 'Google Ads', consent: false },
HkocEodjb7: { name: 'Google Analytics', consent: false },
BJ59EidsWQ: { name: 'Google Tag Manager', consent: false },
nV4hGUA8RQK5Ez: { name: 'Supabase Event Tracking', consent: false },
},
},
})
)
const result = detectPriorConsent()
if (result === null || result.kind !== 'decisions') {
throw new Error(`expected decisions result, got ${JSON.stringify(result)}`)
}
expect(result.decisions).toHaveLength(17)
// Essentials / functional services preserved as accepted
expect(result.decisions).toContainEqual({ serviceId: 'J39GyuWQq', status: true })
expect(result.decisions).toContainEqual({ serviceId: 'rH1vNPCFR', status: true })
// Tracking services preserved as denied
expect(result.decisions).toContainEqual({ serviceId: 'S1_9Vsuj_Q', status: false })
expect(result.decisions).toContainEqual({ serviceId: 'HkocEodjb7', status: false })
expect(result.decisions).toContainEqual({ serviceId: 'BJ59EidsWQ', status: false })
expect(result.decisions).toContainEqual({ serviceId: 'nV4hGUA8RQK5Ez', status: false })
})
it('returns per-service decisions (all false) when every service was denied', () => {
storage.set(
'ucData',
JSON.stringify({
consent: {
services: {
svc1: { name: 'Google Analytics', consent: true },
svc1: { name: 'Google Analytics', consent: false },
svc2: { name: 'Stripe', consent: false },
},
},
})
)
expect(detectPriorConsent()).toBe(false)
expect(detectPriorConsent()).toEqual({
kind: 'decisions',
decisions: [
{ serviceId: 'svc1', status: false },
{ serviceId: 'svc2', status: false },
],
})
})
it('returns false when services object is empty', () => {
it('returns null when services object is empty', () => {
storage.set('ucData', JSON.stringify({ consent: { services: {} } }))
expect(detectPriorConsent()).toBe(false)
expect(detectPriorConsent()).toBeNull()
})
it('returns false when ucData is malformed JSON', () => {
it('returns null when ucData is malformed JSON', () => {
storage.set('ucData', 'not-json')
expect(detectPriorConsent()).toBe(false)
expect(detectPriorConsent()).toBeNull()
})
it('returns false when ucData has no consent.services', () => {
it('returns null when ucData has no consent.services', () => {
storage.set('ucData', JSON.stringify({ gcm: {} }))
expect(detectPriorConsent()).toBe(false)
expect(detectPriorConsent()).toBeNull()
})
it('returns false when services contains non-object values', () => {
it('returns null when every service value is non-object', () => {
storage.set('ucData', JSON.stringify({ consent: { services: { svc1: 'not-an-object' } } }))
expect(detectPriorConsent()).toBe(false)
expect(detectPriorConsent()).toBeNull()
})
// Partial parse failures must fail closed. Cherry-picking the valid
// subset and calling it uniform-accept would let corrupted third-party
// storage silently upgrade a user's consent — the worst-direction bias
// in this domain.
it('returns null when any entry fails schema (fails closed on partial corruption)', () => {
storage.set(
'ucData',
JSON.stringify({
consent: {
services: {
svc1: 'not-an-object',
svc2: { name: 'Valid', consent: true },
},
},
})
)
expect(detectPriorConsent()).toBeNull()
})
})
describe('scenario 2: fast cross-app navigation (uc_user_interaction)', () => {
it('returns true when uc_user_interaction is "true"', () => {
describe('scenario 2: fast cross-app navigation (uc_settings gated by uc_user_interaction)', () => {
const buildUcSettings = (services: Array<{ id: string; status: boolean }>) =>
JSON.stringify({
controllerId: 'test-controller',
id: 'test-settings',
language: 'en',
services: services.map((s) => ({
id: s.id,
status: s.status,
processorId: 'test-processor',
history: [],
version: '1.0.0',
})),
version: '1.0.0',
})
it('returns uniform-accept when uc_settings has every service accepted', () => {
storage.set('uc_user_interaction', 'true')
expect(detectPriorConsent()).toBe(true)
storage.set(
'uc_settings',
buildUcSettings([
{ id: 'svc1', status: true },
{ id: 'svc2', status: true },
])
)
expect(detectPriorConsent()).toEqual({ kind: 'uniform-accept' })
})
it('returns false when uc_user_interaction is "false"', () => {
it('returns per-service decisions when uc_settings has a mixed state', () => {
storage.set('uc_user_interaction', 'true')
storage.set(
'uc_settings',
buildUcSettings([
{ id: 'essential1', status: true },
{ id: 'tracking1', status: false },
{ id: 'tracking2', status: false },
])
)
const result = detectPriorConsent()
if (result === null || result.kind !== 'decisions') {
throw new Error(`expected decisions result, got ${JSON.stringify(result)}`)
}
expect(result.decisions).toHaveLength(3)
expect(result.decisions).toContainEqual({ serviceId: 'essential1', status: true })
expect(result.decisions).toContainEqual({ serviceId: 'tracking1', status: false })
expect(result.decisions).toContainEqual({ serviceId: 'tracking2', status: false })
})
it('returns null when uc_user_interaction is "true" but uc_settings is absent', () => {
storage.set('uc_user_interaction', 'true')
expect(detectPriorConsent()).toBeNull()
})
it('returns null when uc_settings is malformed JSON', () => {
storage.set('uc_user_interaction', 'true')
storage.set('uc_settings', 'not-json')
expect(detectPriorConsent()).toBeNull()
})
it('returns null when uc_settings services array is empty', () => {
storage.set('uc_user_interaction', 'true')
storage.set('uc_settings', buildUcSettings([]))
expect(detectPriorConsent()).toBeNull()
})
it('returns null when any uc_settings service entry fails schema', () => {
storage.set('uc_user_interaction', 'true')
storage.set(
'uc_settings',
JSON.stringify({
services: [
{ id: 'svc1', status: true, processorId: 'p', history: [], version: '1' },
{ id: 'svc2', status: 'not-a-boolean', processorId: 'p', history: [], version: '1' },
],
})
)
expect(detectPriorConsent()).toBeNull()
})
it('returns null when uc_user_interaction is "false" (even if uc_settings is valid)', () => {
storage.set('uc_user_interaction', 'false')
expect(detectPriorConsent()).toBe(false)
storage.set('uc_settings', buildUcSettings([{ id: 'svc1', status: true }]))
expect(detectPriorConsent()).toBeNull()
})
it('returns false when uc_user_interaction is absent', () => {
expect(detectPriorConsent()).toBe(false)
it('returns null when uc_user_interaction is absent', () => {
storage.set('uc_settings', buildUcSettings([{ id: 'svc1', status: true }]))
expect(detectPriorConsent()).toBeNull()
})
})
describe('combined scenarios', () => {
it('returns true when both ucData and uc_user_interaction indicate consent', () => {
it('returns uniform-accept when ucData is fully accepted (ignoring uc_user_interaction/uc_settings)', () => {
storage.set(
'ucData',
JSON.stringify({
@@ -111,27 +266,185 @@ describe('detectPriorConsent', () => {
})
)
storage.set('uc_user_interaction', 'true')
expect(detectPriorConsent()).toBe(true)
expect(detectPriorConsent()).toEqual({ kind: 'uniform-accept' })
})
it('returns true when ucData has consent but uc_user_interaction is false', () => {
it('prefers ucData decisions over uc_settings when both exist', () => {
storage.set(
'ucData',
JSON.stringify({
consent: { services: { svc1: { name: 'GA', consent: true } } },
consent: { services: { svc1: { name: 'GA', consent: false } } },
})
)
storage.set('uc_user_interaction', 'false')
expect(detectPriorConsent()).toBe(true)
})
it('returns true when ucData is absent but uc_user_interaction is true', () => {
storage.set('uc_user_interaction', 'true')
expect(detectPriorConsent()).toBe(true)
storage.set(
'uc_settings',
JSON.stringify({
services: [{ id: 'svc1', status: true, processorId: 'p', history: [], version: '1' }],
})
)
expect(detectPriorConsent()).toEqual({
kind: 'decisions',
decisions: [{ serviceId: 'svc1', status: false }],
})
})
it('returns false when localStorage is completely empty', () => {
expect(detectPriorConsent()).toBe(false)
it('falls back to uc_settings when ucData is corrupt (scenario 1 fails closed, scenario 2 recovers)', () => {
storage.set('ucData', JSON.stringify({ consent: { services: { svc1: 'corrupt' } } }))
storage.set('uc_user_interaction', 'true')
storage.set(
'uc_settings',
JSON.stringify({
services: [{ id: 'svc1', status: false, processorId: 'p', history: [], version: '1' }],
})
)
expect(detectPriorConsent()).toEqual({
kind: 'decisions',
decisions: [{ serviceId: 'svc1', status: false }],
})
})
it('returns null when localStorage is completely empty', () => {
expect(detectPriorConsent()).toBeNull()
})
})
})
describe('applyPriorDecisionToSDK', () => {
type MockService = { id: string; isEssential: boolean }
const makeMockUC = (
opts: {
services?: MockService[]
areAllAccepted?: boolean
onAcceptAll?: () => Promise<void>
onUpdateServices?: (decisions: UserDecision[]) => Promise<void>
} = {}
) => {
const services = opts.services ?? []
return {
acceptAllServices: vi.fn(opts.onAcceptAll ?? (() => Promise.resolve())),
denyAllServices: vi.fn(() => Promise.resolve()),
updateServices: vi.fn(opts.onUpdateServices ?? (() => Promise.resolve())),
getCategoriesBaseInfo: vi.fn(() => []),
getServicesBaseInfo: vi.fn(() => services),
areAllConsentsAccepted: vi.fn(() => opts.areAllAccepted ?? false),
}
}
beforeEach(() => {
consentState.UC = null
consentState.categories = null
consentState.showConsentToast = false
consentState.hasConsented = false
})
it('uniform-accept: calls acceptAllServices, sets hasConsented, suppresses banner', () => {
const UC = makeMockUC()
applyPriorDecisionToSDK(UC as never, { initialLayer: 0 }, { kind: 'uniform-accept' })
expect(UC.acceptAllServices).toHaveBeenCalledOnce()
expect(UC.updateServices).not.toHaveBeenCalled()
expect(consentState.hasConsented).toBe(true)
expect(consentState.showConsentToast).toBe(false)
})
it('decisions with full coverage: calls updateServices with stored decisions, suppresses banner', () => {
const UC = makeMockUC({
services: [
{ id: 'essential1', isEssential: true },
{ id: 'tracking1', isEssential: false },
{ id: 'tracking2', isEssential: false },
],
})
const decisions: UserDecision[] = [
{ serviceId: 'tracking1', status: true },
{ serviceId: 'tracking2', status: false },
]
applyPriorDecisionToSDK(UC as never, { initialLayer: 0 }, { kind: 'decisions', decisions })
expect(UC.updateServices).toHaveBeenCalledWith(decisions)
expect(UC.acceptAllServices).not.toHaveBeenCalled()
expect(consentState.showConsentToast).toBe(false)
})
// GROWTH-790 compliance guard: when the ruleset adds a new non-essential
// service after the user's stored decisions were written, we must NOT
// silently restore — the user has never seen this service and can't have
// consented to it. Show the banner instead.
it('decisions with uncovered non-essential service: shows banner, does not mutate SDK', () => {
const UC = makeMockUC({
services: [
{ id: 'tracking1', isEssential: false },
{ id: 'tracking_new', isEssential: false }, // in ruleset, not in decisions
],
})
applyPriorDecisionToSDK(
UC as never,
{ initialLayer: 0 },
{ kind: 'decisions', decisions: [{ serviceId: 'tracking1', status: false }] }
)
expect(UC.updateServices).not.toHaveBeenCalled()
expect(UC.acceptAllServices).not.toHaveBeenCalled()
expect(consentState.showConsentToast).toBe(true)
})
// Essentials are SDK-forced-on regardless of user decision, so a new
// essential service appearing since the stored decisions were written
// should not trigger a re-prompt — the user has nothing meaningful to
// decide about it.
it('decisions covering only non-essentials: still restores (essentials ignored in coverage check)', () => {
const UC = makeMockUC({
services: [
{ id: 'essential_new', isEssential: true }, // not in decisions, but essential
{ id: 'tracking1', isEssential: false },
],
})
applyPriorDecisionToSDK(
UC as never,
{ initialLayer: 0 },
{ kind: 'decisions', decisions: [{ serviceId: 'tracking1', status: false }] }
)
expect(UC.updateServices).toHaveBeenCalledOnce()
expect(consentState.showConsentToast).toBe(false)
})
it('null prior decision: shows banner at default', () => {
const UC = makeMockUC()
applyPriorDecisionToSDK(UC as never, { initialLayer: 0 }, null)
expect(UC.updateServices).not.toHaveBeenCalled()
expect(UC.acceptAllServices).not.toHaveBeenCalled()
expect(consentState.showConsentToast).toBe(true)
})
it('SDK not requesting first-layer banner: no restore attempted even if priorDecision exists', () => {
const UC = makeMockUC({ areAllAccepted: true })
applyPriorDecisionToSDK(UC as never, { initialLayer: 1 }, { kind: 'uniform-accept' })
expect(UC.acceptAllServices).not.toHaveBeenCalled()
expect(UC.updateServices).not.toHaveBeenCalled()
expect(consentState.hasConsented).toBe(true)
expect(consentState.showConsentToast).toBe(false)
})
it('SDK already considers user consented: passes through, no restore', () => {
const UC = makeMockUC({ areAllAccepted: true })
applyPriorDecisionToSDK(
UC as never,
{ initialLayer: 0 },
{
kind: 'decisions',
decisions: [{ serviceId: 'svc1', status: false }],
}
)
expect(UC.updateServices).not.toHaveBeenCalled()
expect(consentState.hasConsented).toBe(true)
})
})
+192 -64
View File
@@ -4,61 +4,133 @@ import { proxy, snapshot, useSnapshot } from 'valtio'
import { IS_PLATFORM, LOCAL_STORAGE_KEYS } from './constants'
export type PriorConsentDecision =
| null
| { kind: 'uniform-accept' }
| { kind: 'decisions'; decisions: UserDecision[] }
type UcDataServiceEntry = [string, { consent: boolean }]
const isValidUcDataServiceEntry = (entry: [string, unknown]): entry is UcDataServiceEntry => {
const value = entry[1]
return (
typeof value === 'object' &&
value !== null &&
typeof (value as { consent: unknown }).consent === 'boolean'
)
}
type UcSettingsService = { id: string; status: boolean }
const isValidUcSettingsService = (service: unknown): service is UcSettingsService =>
typeof service === 'object' &&
service !== null &&
typeof (service as { id: unknown }).id === 'string' &&
typeof (service as { status: unknown }).status === 'boolean'
/**
* Check if the user previously accepted all consent services by reading
* Check whether the user previously made a consent decision by reading
* localStorage state that was written before UC.init() overwrites it.
*
* Handles two scenarios (FE-2648):
* Returns enough information for the caller to restore the user's exact
* prior state via UC.updateServices, or to fast-path via UC.acceptAllServices
* when we can safely identify a uniform accept. Returns null when nothing
* trustworthy can be detected — in that case the caller should show the
* banner rather than fabricate a decision.
*
* Handles two scenarios (FE-2648 and GROWTH-790):
*
* 1. Slow navigation: GTM's Usercentrics integration replaced uc_settings with
* compressed ucString/ucData after acceptAllServices(). On the next page load,
* UC.init() can't read that format and treats the user as new.
* compressed ucString/ucData after the user's decision. On the next page
* load, UC.init() can't read that format and treats the user as new. We
* read ucData.consent.services directly and return every per-service
* decision so the caller can restore the user's exact state — including
* mixed states (essentials + functional accepted, tracking denied) that
* users produce via the Privacy Settings modal or the Opt out button.
*
* 2. Fast navigation: User accepted on app A and navigated to app B before GTM
* finished writing ucData. App B's UC.init() overwrites uc_settings with a
* fresh controllerId and resets uc_user_interaction to false. We detect the
* prior uc_user_interaction: "true" before init stomps it.
* 2. Fast navigation: User decided on app A and navigated to app B before GTM
* finished writing ucData (or before GTM loaded at all, which happens on
* deny since TelemetryTagManager is gated behind hasAccepted). App B's
* UC.init() overwrites uc_settings with a fresh controllerId and resets
* uc_user_interaction to false. We check uc_user_interaction: "true" as
* a gate confirming the user actually interacted, then parse uc_settings
* to extract per-service decisions. uc_user_interaction alone is not
* enough — without uc_settings we cannot tell accept from deny and must
* not fabricate a direction.
*
* Both scenarios fail closed: any schema mismatch or partial corruption
* returns null rather than proceeding with a subset of valid entries.
* Over-consenting from malformed storage is the worst-direction bias in
* this domain.
*
* Must be called BEFORE UC.init() since init overwrites these keys.
*/
export function detectPriorConsent(): boolean {
export function detectPriorConsent(): PriorConsentDecision {
try {
// Scenario 1: GTM wrote compressed format (slow navigation / same-app refresh)
const ucData = localStorage?.getItem('ucData')
if (ucData) {
const data = JSON.parse(ucData)
const services = data?.consent?.services
if (services && typeof services === 'object') {
const serviceValues = Object.values(services)
if (
serviceValues.length > 0 &&
serviceValues.every(
(s) =>
typeof s === 'object' && s !== null && (s as { consent: boolean }).consent === true
)
) {
return true
const rawEntries = Object.entries(services) as Array<[string, unknown]>
if (rawEntries.length > 0) {
if (!rawEntries.every(isValidUcDataServiceEntry)) {
// Partial corruption: don't cherry-pick the valid subset. Fall
// through to scenario 2 — uc_settings may still be intact.
} else {
const entries = rawEntries as UcDataServiceEntry[]
if (entries.every(([, s]) => s.consent === true)) {
return { kind: 'uniform-accept' }
}
return {
kind: 'decisions',
decisions: entries.map(([serviceId, s]) => ({
serviceId,
status: s.consent,
})),
}
}
}
}
}
// Scenario 2: SDK wrote uc_user_interaction: "true" (fast cross-app navigation)
// uc_user_interaction gates trust in uc_settings — the SDK sets it on any
// user interaction, which confirms uc_settings holds real decisions rather
// than ruleset defaults.
if (localStorage?.getItem('uc_user_interaction') === 'true') {
return true
const ucSettings = localStorage?.getItem('uc_settings')
if (ucSettings) {
const parsed = JSON.parse(ucSettings)
const services = parsed?.services
if (
Array.isArray(services) &&
services.length > 0 &&
services.every(isValidUcSettingsService)
) {
const decisions: UserDecision[] = services.map((s) => ({
serviceId: s.id,
status: s.status,
}))
if (decisions.every((d) => d.status === true)) {
return { kind: 'uniform-accept' }
}
return { kind: 'decisions', decisions }
}
}
// Flag says interacted but uc_settings is missing or malformed.
// Don't fabricate direction — show the banner on the next init.
}
return false
return null
} catch {
return false
return null
}
}
export const consentState = proxy({
// Usercentrics state
UC: null as Usercentrics | null,
categories: null as BaseCategory[] | null,
// Our state
showConsentToast: false,
hasConsented: false,
acceptAll: () => {
@@ -108,6 +180,95 @@ export const consentState = proxy({
},
})
/**
* Apply a prior consent decision (or lack of one) to the freshly-initialized
* Usercentrics SDK and the module's consentState proxy. Extracted from
* initUserCentrics to make the orchestration unit-testable without mocking
* the dynamic SDK import. Must be called after UC.init(). Mutates
* consentState synchronously and may call UC methods asynchronously.
*/
export function applyPriorDecisionToSDK(
UC: Usercentrics,
initialUIValues: { initialLayer: number },
priorDecision: PriorConsentDecision
): void {
consentState.UC = UC
const hasConsented = UC.areAllConsentsAccepted()
// If the SDK wants to show the banner but the user previously made a
// decision (detected via ucData or uc_settings before init overwrote
// them), silently re-apply that decision instead of re-prompting
// (FE-2648, GROWTH-790).
if (initialUIValues.initialLayer === 0 && !hasConsented && priorDecision) {
consentState.categories = UC.getCategoriesBaseInfo()
consentState.showConsentToast = false
localStorage?.removeItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT)
if (priorDecision.kind === 'uniform-accept') {
// Uniform accept covers any currently-active service by definition,
// including any added to the ruleset since the user's decision was
// stored — acceptAllServices applies to all current services.
consentState.hasConsented = true
UC.acceptAllServices()
.then(() => {
consentState.categories = UC.getCategoriesBaseInfo()
})
.catch(() => {
consentState.hasConsented = false
consentState.showConsentToast = true
})
return
}
// priorDecision.kind === 'decisions'. Only suppress the banner if the
// stored decisions cover every non-essential service the SDK currently
// knows about. If the ruleset has grown since the user's ucData/
// uc_settings was written, force a re-prompt rather than silently
// defaulting the new service. Essentials are skipped because the SDK
// forces them on regardless of user decision.
const currentNonEssentialIds = UC.getServicesBaseInfo()
.filter((s) => !s.isEssential)
.map((s) => s.id)
const coveredIds = new Set(priorDecision.decisions.map((d) => d.serviceId))
const allCovered = currentNonEssentialIds.every((id) => coveredIds.has(id))
if (!allCovered) {
// Fall through to the banner path below. Reset the early writes
// so the default-branch state assignments take effect correctly.
consentState.showConsentToast = initialUIValues.initialLayer === 0
consentState.hasConsented = hasConsented
return
}
// Restore the user's exact per-service state — handles deny and any
// partial/category-level decision made via Privacy Settings. hasConsented
// is computed from SDK state after the restore resolves (will be false
// unless every service was accepted).
UC.updateServices(priorDecision.decisions)
.then(() => {
consentState.hasConsented = UC.areAllConsentsAccepted()
consentState.categories = UC.getCategoriesBaseInfo()
})
.catch(() => {
// Falling back to the banner is safer than silently flipping to a
// uniform state the user didn't choose.
consentState.showConsentToast = true
})
return
}
// 0 = first layer, aka show consent toast
consentState.showConsentToast = initialUIValues.initialLayer === 0
consentState.hasConsented = hasConsented
consentState.categories = UC.getCategoriesBaseInfo()
// If the user has previously consented (before usercentrics), accept all services
if (!hasConsented && localStorage?.getItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT) === 'true') {
consentState.acceptAll()
localStorage.removeItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT)
}
}
async function initUserCentrics() {
if (process.env.NODE_ENV === 'test' || !IS_PLATFORM) return
@@ -124,7 +285,7 @@ async function initUserCentrics() {
// Check for prior consent BEFORE UC.init(), which can't read the compressed
// ucData format written by the GTM/Usercentrics integration (FE-2648).
const previouslyAccepted = detectPriorConsent()
const priorDecision = detectPriorConsent()
try {
const { default: Usercentrics } = await import('@usercentrics/cmp-browser-sdk')
@@ -135,44 +296,13 @@ async function initUserCentrics() {
})
const initialUIValues = await UC.init()
consentState.UC = UC
const hasConsented = UC.areAllConsentsAccepted()
// If the SDK wants to show the banner but the user previously accepted
// (detected via ucData or uc_user_interaction before init overwrote them),
// silently re-accept instead of showing the banner again (FE-2648).
if (initialUIValues.initialLayer === 0 && !hasConsented && previouslyAccepted) {
consentState.hasConsented = true
consentState.showConsentToast = false
consentState.categories = UC.getCategoriesBaseInfo()
localStorage?.removeItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT)
UC.acceptAllServices()
.then(() => {
consentState.categories = UC.getCategoriesBaseInfo()
})
.catch(() => {
// If re-accept fails, fall back to showing the banner
consentState.hasConsented = false
consentState.showConsentToast = true
})
return
}
// 0 = first layer, aka show consent toast
consentState.showConsentToast = initialUIValues.initialLayer === 0
consentState.hasConsented = hasConsented
consentState.categories = UC.getCategoriesBaseInfo()
// If the user has previously consented (before usercentrics), accept all services
if (!hasConsented && localStorage?.getItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT) === 'true') {
consentState.acceptAll()
localStorage.removeItem(LOCAL_STORAGE_KEYS.TELEMETRY_CONSENT)
}
applyPriorDecisionToSDK(UC, initialUIValues, priorDecision)
} catch (error) {
console.error('Failed to initialize Usercentrics:', error)
// If SDK fails but user previously accepted, honor that
if (previouslyAccepted) {
// If SDK fails but user previously accepted uniformly, honor that.
// For explicit per-service decisions we can't restore without the SDK,
// and showing the banner when the SDK is broken would fail anyway.
if (priorDecision?.kind === 'uniform-accept') {
consentState.hasConsented = true
}
}
@@ -183,8 +313,6 @@ if (typeof window !== 'undefined') {
initUserCentrics()
}
// Public API for consent
export function hasConsented() {
return snapshot(consentState).hasConsented
}
@@ -40,4 +40,6 @@ const TooltipContent = React.forwardRef<
))
TooltipContent.displayName = TooltipPrimitive.Content.displayName
export type TooltipContentProps = React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TooltipPortal }